【问题标题】:vba - compare value in different cellsvba - 比较不同单元格中的值
【发布时间】:2016-04-07 14:01:46
【问题描述】:

我在一张表中有两个单元格 - 我们称之为数据表。 我还有另一张表 - 我们称之为 SEARCH 表。 我想将 DATA 中的两个单元格与我有一个 SEARCH 的信息进行比较。

可以说,如果:(DATA 中的单元格 A.value 在 SEARCH 的 X 列中)和(DATA 中的单元 B.value 在 SEARCH 的 Y 列中)-两者都在 SEARCH 的同一行中-然后给我第一个工作表 SEA​​RCH 中该行的值。

VBA 可以吗?

谢谢

【问题讨论】:

标签: excel vba


【解决方案1】:

是的,这是可能的 :) 你有 3 种方式:

1.循环(例如 For)

Function FindPair(ByRef CellA As Range, ByRef CellB As Range) As Variant ' <- Change Variant for specific Type of data

    'Set default value if not found match
    Set FindPair = Nothing

    Dim sheetToSearch As Worksheet
    Dim lastRow As Long

    'Check input
    If CellA Is Nothing Or CellB Is Nothing Then
        Call MsgBox("Something is wrong!", vbExclamation)
        Exit Function
    Exit Function

    'For easy ro read
    Set sheetToSearch = Sheets("Search")

    lastRow = (sheetToSearch.UsedRange.Cells(1, 1).Row + sheetToSearch.UsedRange.Rows.Count) 'First row of UsedRange + rows count

    'Look up
    For r = 0 To lastRow

        'Change column here, if you need
        If sheetToSearch.Range("A" + r).Value = CellA.Value Then

            If sheetToSearch.Range("B" + r).Value = CellB.Value Then

                'Return data
                FindPair = sheetToSearch.Range("A" + r).Value
                Exit For

            End If
        End If
    Next r

    'You can compare *.Value = *.Value - for compare binary data
    'or *.Text = *.Text - for compare value like as text with formatting

End Function


2.查找

Application.WorksheetFunction.Find()

请查看它是如何工作的文档:VBA Find


3. Vlookup

Application.WorksheetFunction.VLookup()

请查看其工作原理文档:Excel VLookup

【讨论】:

    【解决方案2】:

    希望你能找到这个..

    Sub comp_value_in_diff_cells()
    On Error Resume Next
    lastrowA = Worksheets("DATA").Range("A" & Rows.Count).End(xlUp).Row
    lastrowB = Worksheets("DATA").Range("B" & Rows.Count).End(xlUp).Row
    If lastrowA = lastrowB Then
        For i = 1 To lastrowA
            search1 = Worksheets("DATA").Range("A" & i).Value
            search2 = Worksheets("DATA").Range("B" & i).Value
            With Worksheets("SEARCH")
                For j = 1 To (.UsedRange.Cells(1, 1).Row + .UsedRange.Rows.Count)
                    a = .Range(j & ":" & j).Find(search1).Row
                    avalue = .Range(j & ":" & j).Find(search1).Column
                    b = .Range(j & ":" & j).Find(search2).Row
                    bvalue = .Range(j & ":" & j).Find(search2).Column
                    If a = b Then
                        If avalue < bvalue Then
                            If Worksheets("DATA").Range("C" & i).Value <> "" Then
                                Worksheets("DATA").Range("C" & i).Value = Worksheets("DATA").Range("C" & i).Value & "|" & search1
                            Else
                                Worksheets("DATA").Range("C" & i).Value = search1
                            End If
                        Else
                            If Worksheets("DATA").Range("C" & i).Value <> "" Then
                                Worksheets("DATA").Range("C" & i).Value = Worksheets("DATA").Range("C" & i).Value & "|" & search2
                            Else
                                Worksheets("DATA").Range("C" & i).Value = search2
                            End If
                        End If
                    End If
                Next j
            End With
        Next i
    Else
        Msgbox ("DATA Sheet A & B Mismatch")
    End If
    End Sub
    

    【讨论】:

    • 请注意 .UsedRange.Rows.Count 在 Excel 2016 中很棘手(我不记得它在以前的版本上是如何工作的)... 并非总是 UsedRange 从 Row=1... 开始开始 - 例如 - 形式 Row=5... 然后最后一行不是 Rows.Count !如果我可以建议 - 更好的方法是:lastRow = (sheet.UsedRange.Cells(1, 1).Row + sheet.UsedRange.Rows.Count)
    • @LukaszDev 完全同意。根据建议编辑
    • 如果有多个匹配项,我想将所有正确匹配项从 SEARCH 表复制到 DATA 表?
    • @danijinji,请检查编辑版本。如果可行,请标记为解决方案
    猜你喜欢
    • 2014-11-28
    • 1970-01-01
    • 1970-01-01
    • 2013-11-29
    • 2019-12-22
    • 1970-01-01
    • 1970-01-01
    • 2019-07-05
    • 1970-01-01
    相关资源
    最近更新 更多