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.
Luulisi tuon menetelmän sinänsä toimivan.. Vaikea näillä lähtötiedoilla arvata mikä hommassa "kusi".
Itse tekisin ehkä dictionarya käyttäen.
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.
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
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ää.
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
Aihe on jo aika vanha, joten et voi enää vastata siihen.