VBA变体电子表格更新问题

时间:2016-08-12 21:28:17

标签: excel vba excel-vba vlookup

我正在尝试完成的任务是将值(例如A3)与来自不同工作簿(A2)的另一个值进行比较,然后相应地更新第一个工作簿中的单元格(“相同”或“更改”)

通过更改我想要“相同”或“更改”到

的值,可以非常轻松地完成此任务
=IF(VLOOKUP(A1,'[Workbook2.csv]Workbook2'!$A$2:$B$482,2,FALSE)=A1,"Same","Change")

在Workbook1中

但是,我需要完成其他任务,使用该信息以及在不同场景中更改的值,以便将此功能移植到VBA。

这就是我目前所拥有的:

Sub Button2_Click()

Dim varSheetA As Variant
Dim varSheetB As Variant
Dim strRangeToCheck As String
Dim iRow As Long
Dim iCol As Long
Dim answer As Integer

Dim MyFile As String
MyFile = Application.GetOpenFilename()
If (MyFile <> "False") Then


strRangeToCheck = "A2:P527"
Debug.Print Now
varSheetA = Worksheets(3).Range(strRangeToCheck)

' Switch active Workbook
Workbooks.Open (MyFile)
varSheetB = Worksheets(1).Range(strRangeToCheck) ' or whatever your other sheet is.
Debug.Print Now
iCol = 1

For iRow = LBound(varSheetA, 1) To UBound(varSheetA, 1)
        On Error GoTo ErrorHandle:

        NameValue = Application.WorksheetFunction.VLookup(varSheetA(iRow, iCol), Worksheets(1).Range(strRangeToCheck), 1, False)
        StatusValue = Application.WorksheetFunction.VLookup(varSheetA(iRow, iCol), Worksheets(1).Range(strRangeToCheck), 2, False)
        MsgBox NameValue & " " & StatusValue ' Debug

        If varSheetA(iRow, 3) = StatusValue Then
            varSheetA(iRow, 2) = "Same"
        Else
            varSheetA(iRow, 2) = "Change"
        End If

        Next iRow
 Error Handle:
' Generic for now, will be updated later
    Exit Sub

Else
' Else will be put here
End If

End Sub

程序正常工作,直到varSheetA(iRow,2)需要更新为“相同”或“更改”。看起来变量正在更新 - 但是没有返回到原始工作表。

有谁知道如何将这些更新显示回原始工作簿?

当此模块运行时,Workbook2仍然是屏幕上的活动工作表。我不确定这对于将值更新到Workbook1是否有任何影响。

提前致谢!

1 个答案:

答案 0 :(得分:0)

所以我弄清楚为什么表没有更新,目前还不漂亮,我可能会清理很多最终版本不需要的代码。 注意使用SelRangeA和SelRangeB,而不是使用Variant类型变量,它们使用Range类型值。

为了使用For iRow = LBound(varSheetA, 1) To UBound(varSheetA, 1)我需要一个单元格数组,这是我使用varSheets的时候。

当我更新值时,我现在使用SelRanges,以便它直接更新工作表,而不是更新一个永远不会使其返回原始工作表的变量中的值。

    Dim varSheetA As Variant
    Dim varSheetB As Variant
    Dim SelRangeA As Range                             '''''
    Dim SelRangeB As Range                             '''''

Dim strRangeToCheck As String
Dim iRow As Long
Dim iCol As Long
Dim answer As Long
Dim MyFile As String
Dim WbOne As Workbook 'original WB
Dim WbTwo As Workbook

MyFile = Application.GetOpenFilename()
If (MyFile <> "False") Then

Set WbOne = ThisWorkbook
strRangeToCheck = "A2:P527"
Debug.Print Now
varSheetA = Worksheets(3).Range(strRangeToCheck)

Set SelRangeA = Worksheets(3).Range(strRangeToCheck)    '''''

' Switch active Workbook
Set WbTwo = Workbooks.Open(MyFile)
varSheetB = Worksheets(1).Range(strRangeToCheck)

Set SelRangeB = Worksheets(1).Range(strRangeToCheck)    '''''

Debug.Print Now
iCol = 1

For iRow = LBound(varSheetA, 1) To UBound(varSheetA, 1)
        On Error GoTo ErrorHandle:

        NameValue = Application.WorksheetFunction.VLookup(SelRangeA(iRow, iCol), Worksheets(1).Range(strRangeToCheck), 1, False)
        StatusValue = Application.WorksheetFunction.VLookup(SelRangeA(iRow, iCol), Worksheets(1).Range(strRangeToCheck), 2, False)
        'MsgBox NameValue & " " & StatusValue ' Debug

        If SelRangeA(iRow, 3) = StatusValue Then
            SelRangeA(iRow, 2) = "Same"
            Else
                SelRangeA(iRow, 2) = "Change"
            End If

            'ElseIf (1 = 1) Then

            'Else

            'End If

            'If varSheetA(iRow, iCol) = varSheetB(iRow, iCol) Then
                ' Cells are identical.
                ' Do nothing.
            'Else
                ' Cells are different.
                ' Code goes here for whatever it is you want to do.
            'End If
            Next iRow

感谢Sgdva建议使用WbOne和WbTwo并替换折旧变量类型,这无疑使代码更清晰,更易于管理。