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 SubVarmaan 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 SubTuolla 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 SubLisä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 IfAihe on jo aika vanha, joten et voi enää vastata siihen.