Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: VBA: Rivien vertailu

mvert [24.02.2016 18:00:58]

#

Kysymys koskee taulukossa olevien tietojen vertailua. Taulukko sisältää useita satoja rivejä tietoa, joista tulisi löytää sisällöltään samanlaiset. Yritin itse verrata yhden sarakkeen tietoja kahdella sisäkkäisellä for-silmukalla ja jos samaa sisältöä löytyy, ohjelma kirjoittaa kommentin, että tämä sama löytyy riviltä X. Tämä ei osoittautunut toimivaksi. Kirjoittajan ohjelmointikokemus rajoittuu lyhyesti C:n koodaamiseen, joten kokeneempien taitajien neuvoja kaivataan.

Grez [24.02.2016 18:32:28]

#

Luulisi tuon menetelmän sinänsä toimivan.. Vaikea näillä lähtötiedoilla arvata mikä hommassa "kusi".

Itse tekisin ehkä dictionarya käyttäen.

mvert [25.02.2016 09:27:48]

#

Tällä koodilla olen koittanut. Virheilmoituksia ei tule eikä työkirjassa ei tapahdu mitään.

Sub Loyda()

Dim numero As Double, numero2 As Double, rivi As Double, sarake As Double

'viimeisin käytössä olevan rivin (valittu solu) rivinumero

rivi = Sheet1.Cells.SpecialCells(xlCellTypeLastCell).Row

'viimeisin käytössä olevan rivin (valittu solu) sarakenumero

sarake = Sheet1.Cells.SpecialCells(xlCellTypeLastCell).Column
'valitun solun arvo
k = -1
For i = rivi To 149
k = k + 1
numero = Sheet1.Cells(rivi + k, sarake).Value
l = 1
'valitaan valittua riviä seuraava rivi
     For j = rivi + 1 To 149
    numero2 = Sheet1.Cells(rivi + k + l, sarake).Value
        If numero2 = numero Then
        'Kommentin kirjoitus samaa tietoa sisältävään soluun
                'Range(sarake, j).AddComment
                'Range(sarake, j).Comment.Visible = False
                'Range(sarake, j).Comment.Text Text:="Sama kuin rivillä" & i
                Sheet1.Cells(41, 23).AddComment
                Sheet1.Cells(41, 23).Comment.Visible = False
                Sheet1.Cells(41, 23).Comment.Text Text:="Sama kuin rivillä" & i & Chr(10) & ""
        End If
        l = l + 1
       Next j
    Next i

End Sub

Varmaan koodissa on jokin ilmeinen virhe.

Grez [25.02.2016 10:05:04]

#

Tuossa pistää heti silmään For i = rivi To 149 ja for j = rivi + 1 to 149

Muuttujassa rivi on "viimeinen rivi" ja tuossa siis lähdetään kelaamaan viimeistä rivistä eteenpäin. Jos 149 on pienempi kuin rivi niin tuota silmukkaa ei ajeta kertaakaan.

Oletuksena for kasvattaa i:n tai j:n arvoa joka kierroksella, kunnes se on suurempi kuin loppuarvo. Jos haluat että j:n arvoa pienennetään, laita loppuun Step -1

Lisäys:

Toimiva koodi voisi olla

Option Explicit
Sub Loyda()
    Dim rivi As Long, i As Long, j As Long, sarake As Long, arvo As Double
    Dim sheet As Worksheet, cmt As Comment
    Set sheet = ActiveSheet

    'viimeisin käytössä olevan rivin rivinumero
    rivi = sheet.Cells.SpecialCells(xlCellTypeLastCell).Row

    'viimeisin käytössä oleva sarakenumero
    sarake = sheet.Cells.SpecialCells(xlCellTypeLastCell).Column

    For i = 1 To rivi - 1
        arvo = sheet.Cells(i, sarake).Value
        For j = i + 1 To rivi
            If sheet.Cells(j, sarake).Value = arvo Then
                Set cmt = sheet.Cells(j, sarake).Comment
                If cmt Is Nothing Then Set cmt = sheet.Cells(j, sarake).AddComment
                cmt.Text cmt.Text() & "Sama kuin rivillä " & i & vbLf
            End If
       Next j
    Next i
End Sub

mvert [25.02.2016 14:43:37]

#

Tuolla koodilla homma nyt toimii. Mitähän keinoa kannattaisi käyttää jos haluaa estää kommentin kirjoituksen, kun solussa on jo ennestään tekstiä eli samanlainen rivi on jo löytynyt ja haluaisin, että kaikki myöhemmin löytyneet rivit viittaisivat ensimmäiseen samanlaiseen riviin.

Sub Loyda()

Dim numero As Variant, numero2 As Variant

'Väli jolta samoja rivejä etsitään

For i = 4 To 566

numero = Sheet1.Cells(i, 24).Value

'valitaan valittua riviä seuraava rivi
     For j = i + 1 To 566
        numero2 = Sheet1.Cells(j, 24).Value

        'Tyhjien rivien poistaminen
        If numero = Empty Then
                Sheet1.Cells(j, 25).Value = Empty
        ElseIf numero2 = Empty Then
                Sheet1.Cells(j, 25).Value = Empty

        'Vastaavan samanlaisen etsiminen
        ElseIf numero2 = numero Then
               'Kommentin kirjoitus samaa tietoa sisältävään soluun
               Sheet1.Cells(j, 25).Value = "Sama kuin rivillä " & i

        End If
      Next j
    Next i

End Sub

Lisäys: Lisäyksenä edelliseen, että koodi ei toimikkaan täydellisesti, sillä välissä on tyhjiä rivejä, jolloin paikoin tapahtuu kommentin ylikirjoitus eli soluun tulostuu tyhjää.

Grez [25.02.2016 15:41:45]

#

mvert kirjoitti:

Tuolla koodilla homma nyt toimii. Mitähän keinoa kannattaisi käyttää jos haluaa estää kommentin kirjoituksen, kun solussa on jo ennestään tekstiä eli samanlainen rivi on jo löytynyt ja haluaisin, että kaikki myöhemmin löytyneet rivit viittaisivat ensimmäiseen samanlaiseen riviin.

Yksinkertaisinta varmaan olisi vaan muuttaa esimerkistäni nuo rivit 17-19 niin että olemassaoleviin kommentteihin ei kosketa:

If sheet.Cells(j, sarake).Comment Is Nothing then
    sheet.Cells(j, sarake).AddComment.Text "Sama kuin rivillä " & i & vbLf
End If

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta