0

关闭我有一个可行的解决方案。

我正在尝试在工作簿中使用工作表的名称。我的两张表被称为“Bank”(Sheet1)和“Replicon”(Sheet2)。当我运行看起来功能正常的代码时,ThisWorkbook.Worksheets("Bank") 这行代码的任何变体都会出现运行时错误。

最终,我只希望工作表 1 中的 J 列填充工作表 2 中 E 列的匹配项目名称。

我在这里想念什么?我将发布我的完整代码,因为它可能会有所帮助。

    Sub ProjectName()

Dim UserID As String, Day As String, Money As String
Dim r As Integer, s As Integer
Dim lr As Long, lr2 As Long
With ActiveSheet
Dim wsBank As Worksheet, wsRep As Worksheet
Set wsBank = Worksheets("Bank")
Set wsRep = Worksheets("Replicon")

    lr = wsBank.Cells(wsBank.Rows.Count, 1).End(xlUp).Row
    lr2 = wsRep.Cells(wsRep.Rows.Count, 1).End(xlUp).Row

For r = 2 To lr
  UserID = wsBank.Cells(r, 1).Value
  Day = wsBank.Cells(r, 5).Value
  Money = wsBank.Cells(r, 6).Value
  For s = 2 To lr2
    If wsRep.Cells(s, 1).Value = UserID And wsRep.Cells(s, 2).Value = Day And wsRep.Cells(s, 3).Value = Money Then
      wsBank.Cells(s, 10).Value = wsRep.Cells(s, 5).Value
    End If
    Next s
  Next r

以 End Sub 结尾

Sheet1(银行) Sheet2(复制)

4

4 回答 4

0

一些建议:

Sub TestWithLoops()
    Dim UserID As String, Day As String, Money As String
    Dim rngB As Range, rngR As Range, rwB As Range, rwR As Range
    
    'make your code easier to read by using range variables
    '  Use ActiveWorkbook if data is not in the same workbook as this code
    Set rngB = ThisWorkbook.Worksheets("Bank").UsedRange.EntireRow
    Set rngB = rngB.Offset(1, 0).Resize(rngB.Rows.Count - 1) 'offset and shrink to remove headers
    Set rngR = ThisWorkbook.Worksheets("Replicon").UsedRange.EntireRow
    Set rngR = rngR.Offset(1, 0).Resize(rngR.Rows.Count - 1)
    
    'loop over Bank rows
    For Each rwB In rngB.Rows
        UserID = rwB.Cells(1).Value
        Day = rwB.Cells(5).Value
        Money = rwB.Cells(6).Value
        For Each rwR In rngR.Rows
            'nested if's will perform faster as they only test
            '  what needs to be tested - ie. they will fail early
            If rwR.Cells(1).Value = UserID Then
                If rwR.Cells(2).Value = Day Then
                    If rwR.Cells(3).Value = Money Then
                        rwB.Cells(5).Value = rwR.Cells(5).Value
                        Exit For 'done here so stop looping...
                    End If
                End If
            End If
       Next rwR
    Next rwB
End Sub
于 2021-01-22T17:03:36.213 回答
0

使用“在循环开始之前停止”我假设您的意思是第一个/外部循环,并且您想说 VBA 检测到语法错误?如果是这样,请注意,为了在 VB 中的一行代码中实现换行,您需要使用 '_' 字符来换行,如下所示。(我也整理了你的代码)

Sub TestWithLoops()
Dim UserID As String, Day As String, Money As String
Dim r As Integer, s As Integer

Dim wsBank as Worksheet, wsRep as Worksheet
Set wsBank = ThisWorkbook.Worksheets("Bank")
Set wsRep = ThisWorkbook.Worksheets("Replicon")

For r = 2 To wsBank.UsedRange.Rows.Count
  UserID = wsBank.Cells(r, 1).Value
  Day = wsBank.Cells(r, 5).Value
  Money = wsBank.Cells(r, 6).Value
  For s = 2 To wsRep.UsedRange.Rows.Count
    If wsRep.Cells(s, 1).Value = UserID And _
        wsRep.Cells(s, 2).Value = Day And _
        wsRep.Cells(s, 3).Value = Money Then
      wsBank.Cells(s, 10).Value = _
      wsRep.Cells(s, 5).Value
    End if
    Next s
  Next r
End Sub

另一个潜在的绊脚石可能是长数据集的整数声明,因为 VBA 整数是 16 位的,只能计数到 32,767 -对于这些情况,请考虑使用Long 。而且我还建议在使用UsedRange时要小心——我以前的回报太多或太少。

但是对于交叉引用项目名称的用例,我个人会使用 LOOKUP 函数 - 如果您比较 3 个值可能会有点复杂,但是您可以例如将这 3 列组合成 1 保持隐藏并与之比较:

表 2:= A2 & B2 & C2

表 1:= VLOOKUP ( A2 & E2 & F2 ; <Column matrix in Sheet 1> ; <Column offset to project name>; FALSE )

于 2021-01-22T17:01:18.957 回答
0

@TimWilliams 的回答

  Sub ProjectNames()
        Dim UserID As String, Day As String, Money As String
        Dim rngB As Range, rngR As Range, rwB As Range, rwR As Range
        
    'make your code easier to read by using rnage variables
    Set rngB = ActiveWorkbook.Worksheets("Bank").UsedRange.EntireRow
    Set rngB = rngB.Offset(1, 0).Resize(rngB.Rows.Count - 1) 'offset and shrink to remove headers
    Set rngR = ActiveWorkbook.Worksheets("Replicon").UsedRange.EntireRow
    Set rngR = rngR.Offset(1, 0).Resize(rngR.Rows.Count - 1)
    
    'loop over Bank rows
    For Each rwB In rngB.Rows
        UserID = rwB.Cells(1).Value
        Day = rwB.Cells(6).Value
        Money = rwB.Cells(7).Value
        For Each rwR In rngR.Rows
            'nested if's will perform faster as they only test
            '  what needs to be tested - ie. they will fail early
            If rwR.Cells(1).Value = UserID Then
                If rwR.Cells(2).Value = Day Then
                    If rwR.Cells(3).Value = Money Then
                        rwB.Cells(10).Value = rwR.Cells(5).Value
                        Exit For 'done here so stop looping...
                    End If
                End If
            End If
       Next rwR
    Next rwB
End Sub
于 2021-01-22T21:02:53.893 回答
0

由于 VBA 在行尾停止,您的 if 语句已损坏,您可以尝试:

If ThisWorkbook.Worksheets("Replicon").Cells(s, 1).Value = UserID And _
   ThisWorkbook.Worksheets("Replicon").Cells(s, 2).Value = Day And _
   ThisWorkbook.Worksheets("Replicon").Cells(s, 3).Value = Money Then

   ThisWorkbook.Worksheets("Bank").Cells(s, 10).Value = _
   ThisWorkbook.Worksheets("Replicon").Cells(s, 5).Value
End If

用“_”告诉 VBA 你的语句将在下一行继续。

于 2021-01-22T16:46:46.427 回答