同一个工作簿中的两张工作表调试错误?

Posted

技术标签:

【中文标题】同一个工作簿中的两张工作表调试错误?【英文标题】:Two sheets in the same workbook debugging error? 【发布时间】:2021-04-27 03:24:50 【问题描述】:

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

我正在尝试在工作簿中使用工作表的名称。 我的两张表被称为“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

以 结束子

Sheet1(Bank) Sheet2(Replicon)

【问题讨论】:

“我被拦下”是什么意思?是否发生运行时错误?还是编译器错误? 调试9出现运行时错误。 错误 9 表示您的一张床单的名称可能有误。 如果已关闭。关闭问题 嗯怎么样? @AndréWalker 抱歉,我是新来的,但没有办法。 【参考方案1】:

由于 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 你的语句将在下一行继续。

【讨论】:

为了便于阅读,我只是对其进行了格式化。它在 VBA 代码中的一行很长。 它在这一行给出错误“For r = 2 To ThisWorkbook.Worksheets("Bank").UsedRange.Rows.Count"【参考方案2】:

“在循环开始之前停止” 我假设您的意思是第一个/外部循环,并且您想说 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

另一个潜在的绊脚石可能是长数据集的 Integer 声明,因为 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 )

【讨论】:

【参考方案3】:

一些建议:

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

【讨论】:

正如我在原始问题中所说,无论出于何种原因,我的 VBA 在“Set rngB = ThisWorkbook.Worksheets("Bank").UsedRange.EntireRow" 处为我提供了调试 9 那么没有确切名称为“银行”的工作表? 从字面上看是工作簿中的一张表,名为“Bank”,另一个“Replicon”。我在 OP 中的精炼代码将运行,但不会在表中填充任何内容。 代码是在您正在处理的工作簿中,还是在不同的工作簿中?也许你需要ActiveWorkbook 而不是ThisWorkbook 如果您不介意,请查看我更新的代码。我现在让它运行但是没有填充任何东西。我最初的方法是我从某人之前的问题中发现的。我不知道我是否可以分享我正在使用的测试文件。【参考方案4】:

@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

【讨论】:

以上是关于同一个工作簿中的两张工作表调试错误?的主要内容,如果未能解决你的问题,请参考以下文章

将同一工作簿中的多个 Excel 工作表复合到一张工作表中

在工作簿中查找所有匹配项并将结果偏移到另一张工作表中(VBA)

在新工作簿中复制 Excel 主题颜色

Excel 公式在工作簿中查找下一个工作表

有没有办法将 excel 工作簿中的单个工作表导出到使用 pandas 分隔 csv 文件?

我想知道如何运行 vba 脚本来查找和替换仅在一张工作表中而不是整个工作组中的多个单词?