3

我有一个基于宏的 Excel 文件,它生成收到的项目列表及其状态(即收到、已修复等)。该程序每天运行,现在我让它捕获前一天的列表并将其放在一个名为 PreviousData 的电子表格中,然后使用当前日期的列表进行更新,该列表放置在一个名为 Data 的电子表格中;这用于比较我们认为我们在前一天修复/更改的状态。

我基本上是在 VBA 中自学的,所以我不是超级高效或经验丰富。我想要做的是以下内容:

  1. 在数据电子表格上,获取以 J2 开头的订单号

  2. 切换到 PreviousData 电子表格,并从步骤 1 中搜索订单号

场景A:如果在PreviousData上找到订单号,比较两张表上订单号旁边的状态值;如果它们不同,请运行一些代码,否则什么也不做

场景B:如果PreviousData上没有找到订单号,什么都不做

  1. 重复直到在数据电子表格中遇到第一个空白单元格

我在互联网上进行了一些搜索,发现了一些可以逐行比较单元格值的内容(实际上可能来自这个论坛),但如果出现场景 B,该函数将因“超出范围”而失败。这是我尝试并修改以尝试开始工作的代码:

Sub output()

Dim varSheetA As Variant
Dim varSheetB As Variant
Dim varSheetRMA As Variant
Dim strRangeToCheck As String
Dim strRangeRMA As String
Dim Variable As String
Dim iRow As Long
Dim iCol As Long
Dim Count As Integer

strRangeToCheck = "K2:L1000"
strRangeRMA = "J2:J1000"
' If you know the data will only be in a smaller range, reduce the size of the ranges above.
Debug.Print Now
varSheetA = Worksheets("PreviousData").Range(strRangeToCheck)
varSheetB = Worksheets("Data").Range(strRangeToCheck) ' or whatever your other sheet is.
varSheetRMA = Worksheets("Data").Range(strRangeRMA)
Debug.Print Now

Sheets("Data").Select
Range("J2").Select
Selection.Copy
Sheets("PreviousData").Select
Cells.Find(What:=Variable, After:=ActiveCell, LookIn:=xlFormulas, _
    LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
    MatchCase:=False, SearchFormat:=False).Activate

For iRow = LBound(varSheetA, 1) To UBound(varSheetA, 1)
    For iCol = LBound(varSheetA, 2) To UBound(varSheetA, 2)
        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 iCol
Next iRow 
End Sub

请帮忙 :)

4

1 回答 1

3

这段代码应该更容易理解+它完成了这项工作。

Option Explicit

Sub CompareStatuses()

 Dim ws1 As Worksheet, ws2 As Worksheet, rng1 As Range, rng2 As Range
 Dim lr1&, lr2&, i&, j&

 Set ws1 = ThisWorkbook.Sheets("Data")
 Set ws2 = ThisWorkbook.Sheets("PreviousData")
 lr1 = ws1.Range("J" & Rows.Count).End(xlUp).Row
 lr2 = ws2.Range("J" & Rows.Count).End(xlUp).Row

 For i = 2 To lr1
  For j = 2 To lr2
     Set rng1 = ws1.Range("J" & i)
     Set rng2 = ws2.Range("J" & j)
     If StrComp(CStr(rng1.Value), CStr(rng2.Value), vbTextCompare) = 0 And _
        StrComp(CStr(rng1.Offset(0, 1).Value), CStr(rng2.Offset(0, 1).Value) _
         ,vbTextCompare) <> 0 Then
         ' found a matching Order + both statuses are different
         ' this is where you wanted to run some code
     End If
     Set rng1 = Nothing
     Set rng2 = Nothing
  Next j
 Next i
End Sub
于 2013-05-02T15:50:53.457 回答