1

i'm new in vba and i would ask something about a VBA code that i made.

I've already read this link: VBA - Match Column Data and paste but it's not good for my needs.

My target is match column E with column F and give the description inside rows in G to paste in column H.

To get an msg box error if the match is false.

my problem is that the msg box appear always on my desk without matching.

Which is my mistake?

thank you everyone.

This is an example of my sheet:

This is my code so far:

Sub AssociazioneCodice()

'Dichiarazione della variabile per conteggio righe
Dim countRows, r, c, e As Integer
Dim trovato As Boolean
trovato = False


'Applicazione conteggio righe - Achtung!: Inserire sempre correttamente il nome del foglio dove si trovano i riferimenti da contare
countRows = ThisWorkbook.Worksheets("Foglio2").Range("A:A").Cells.SpecialCells(xlCellTypeConstants).Count

'Il for serve a cercare il numero del codice nella colonna E dei codici
For r = 1 To countRows

'Con il secondo for effettuo la corrispondenza tra la colonna dei codici E e confronto con i codici di riferimento generici della colonna F
    For e = 1 To countRows

'L'if seguente serve a dire SE la cella della riga 'r' della colonna E è uguale alla cella della riga 'e' della colonna F
        If Cells(r, 5) = Cells(e, 6) Then
        'visto che ho trovato corrispondenza, allora prendi il contenuto della riga 'e' della colonna G e copiala nella riga 'r' della colonna H

            Cells(r, 8) = Cells(e, 7)
            e = countRows   'una volta controllato il codice e trovato, passo alla riga 'r' successiva
            trovato = True

        End If

    If trovato = False Then
    'SE non è stato trovato il codice, allora manda un messaggio e scrivi "ERRORE" nella riga'r' della colonna H

        MsgBox "Codice non in elenco " & Cells(r, 5).Value & " Riga " & r
        Cells(r, 8) = " ERRORE "

    Else: trovato = False   'Se ha trovato il codice, allora viene resettato a False il booleano 'trovato'

    End If

    Next e
Next r

MsgBox " Numero di avvisi a sistema " & countRows

End Sub
0m3r
  • 12,286
  • 15
  • 35
  • 71

2 Answers2

0

Welcome to SO Antonio,( i am italian and i have studied your question)try to put next e before If trovato = False Then... Keep me update...

Sub AssociazioneCodice()

    'Dichiarazione della variabile per conteggio righe


    Dim countRows, r, c, e As Integer
    Dim trovato As Boolean
     
    'Applicazione conteggio righe - Achtung!: Inserire sempre correttamente il nome del foglio dove si trovano i riferimenti da contare
    countRows = ThisWorkbook.Worksheets("Foglio2").Range("A:A").Cells.SpecialCells(xlCellTypeConstants).Count

    'Il for serve a cercare il numero del codice nella colonna E dei codici
    For r = 1 To countRows
     
        'Con il secondo for effettuo la corrispondenza tra la colonna dei codici E e confronto con i codici di riferimento generici della colonna F
        For e = 1 To countRows

            'L'if seguente serve a dire SE la cella della riga 'r' della colonna E è uguale alla cella della riga 'e' della colonna F
            If Cells(r, 5) = Cells(e, 6) Then

                'visto che ho trovato corrispondenza, allora prendi il contenuto della riga 'e' della colonna G e copiala nella riga 'r' della colonna H
                Cells(r, 8) = Cells(e, 7)

                e = countRows                    'una volta controllato il codice e trovato, passo alla riga 'r' successiva
                trovato = True

            End If

        Next e

        If trovato = False Then

            'SE non è stato trovato il codice, allora manda un messaggio e scrivi "ERRORE" nella riga'r' della colonna H
            MsgBox "Codice non in elenco " & Cells(r, 5).Value & " Riga " & r
            Cells(r, 8) = " ERRORE "

        Else

            trovato = False                      'Se ha trovato il codice, allora viene resettato a False il booleano 'trovato'

        End If

    Next r

    MsgBox " Numero di avvisi a sistema " & countRows

End Sub
Marcucciboy2
  • 3,156
  • 3
  • 20
  • 38
Ferdinando
  • 964
  • 1
  • 12
  • 23
  • Note that `Dim countRows, r, c, e As Integer` only declares `e As Integer` but all others as `Variant`. You need to declare a type for **every** variable `Dim countRows As Long, r As Long, c As Long, e As Long`. Also all row counting variables need to be of type `Long` because Excel has more rows than `Integer` can handle. It is recommended [always to use Long instead of Integer](https://stackoverflow.com/a/26409520/3219613) in VBA as there is no benefit in `Integer` at all. – Pᴇʜ Nov 07 '18 at 13:35
0

You can also use:

Sub AssociazioneCodice()

Dim LR As Long, i As Long

With Worksheets("Sheet1")

    LR = .Range("E" & .Rows.Count).End(xlUp).Row

    For i = 2 To LR
        If .Range("E" & i).Value = .Range("F" & i).Value Then
            .Range("H" & i).Value = .Range("G" & i).Value
        End If

    Next i

End With

End Sub
Error 1004
  • 7,877
  • 3
  • 23
  • 46
  • Thank you for your answare but i need for every rows in H column. Your code is good but only for row #2 while I need from first to last. I like so much your smallest code but how can I let work it? – ANTONIO SAVIO RANIERI Nov 07 '18 at 13:38
  • According to your images posted with the question the row 1 is the Header - "Source Code" so data start from row 2 up to the last row.so, in my example i start loop from row 2 to last row. – Error 1004 Nov 07 '18 at 13:46
  • Yes. I know that the data starts from row 2 but your code stop Always to 2nd row – ANTONIO SAVIO RANIERI Nov 07 '18 at 13:59
  • This may occurred from the wrong calculation of last row - LR.You must check two thinks: 1.Sheet1 name & column. Could you please tell me which is the value of LR when the code enter the loop? – Error 1004 Nov 07 '18 at 14:02