【问题标题】:VBA Excel how to match two column and paste the data in anotheroneVBA Excel如何匹配两列并将数据粘贴到另一列
【发布时间】:2018-11-07 13:11:04
【问题描述】:

我是 vba 新手,我想问一些关于我制作的 VBA 代码的问题。

我已经阅读了这个链接: VBA - Match Column Data and paste 但这不符合我的需求。

我的目标是将 E 列与 F 列匹配,并在 G 中的行内给出描述以粘贴到 H 列中。

如果匹配为假,则获取消息框错误。

我的问题是消息框总是出现在我的桌子上,没有匹配。

我的错误是什么?

谢谢大家。

This is an example of my sheet:

这是我目前的代码:

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

【问题讨论】:

    标签: excel vba match msgbox


    【解决方案1】:

    欢迎来到 SO Antonio,(我是意大利人,我研究过你的问题)尝试将 next e 放在 If trovato = False Then 之前... 让我更新...

    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
    

    【讨论】:

    • 请注意 Dim countRows, r, c, e As Integer 仅声明 e As Integer 而其他所有声明为 Variant。您需要为 每个 变量 Dim countRows As Long, r As Long, c As Long, e As Long 声明一个类型。此外,所有行计数变量都必须是 Long 类型,因为 Excel 的行数超过了 Integer 可以处理的数量。建议在 VBA 中使用 always to use Long instead of Integer,因为在 Integer 中根本没有任何好处。
    【解决方案2】:

    你也可以使用:

    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
    

    【讨论】:

    • 感谢您的回答,但我需要 H 列中的每一行。您的代码很好,但仅适用于第 2 行,而我需要从头到尾。我非常喜欢你最小的代码,但我怎样才能让它工作呢?
    • 根据您发布的带有问题的图像,第 1 行是标题 - “源代码”,因此数据从第 2 行开始直到最后一行。所以,在我的示例中,我从第 2 行开始循环到最后一行。
    • 是的。我知道数据从第 2 行开始,但您的代码总是停止到第 2 行
    • 这可能是由于最后一行的错误计算导致的 - LR。您必须检查两个想法:1.Sheet1 名称和列。你能告诉我代码进入循环时LR的值是多少吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-19
    • 2016-06-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多