excel 类型不匹配错误:不明白为什么

k7fdbhmy  于 2023-06-25  发布在  其他
关注(0)|答案(3)|浏览(219)

我试图将一个值添加到另一个值,但它总是在代码中的某个地方停止并抛出:
错误类型13:不匹配错误
即使当移除代码的一部分时,也会出现具有相同错误的另一错误。例如:
当这个:

ThisWorkbook.Worksheets(2).Cells(i, 9) = ThisWorkbook.Worksheets(2).Cells(i, 9) + Sheets(j).Cells(i, 42)

第一个错误,出现了,我想通过擦除它来解决它,同样的错误会出现在这个:

ThisWorkbook.Worksheets(2).Cells(i, 6) = ThisWorkbook.Worksheets(2).Cells(i, 6) + Sheets(j).Cells(i, 41)

整个代码:

Do While (j < (ThisWorkbook.Worksheets(2).Cells(1, 9)) + 3)

For i = 7 To 65

'Megaform

ThisWorkbook.Worksheets(2).Cells(i, 6) = ThisWorkbook.Worksheets(2).Cells(i, 6) + Sheets(j).Cells(i, 41)
ThisWorkbook.Worksheets(2).Cells(i, 7) = ThisWorkbook.Worksheets(2).Cells(i, 7) + Sheets(j).Cells(i, 44)
ThisWorkbook.Worksheets(2).Cells(i, 8) = ThisWorkbook.Worksheets(2).Cells(i, 8) + Sheets(j).Cells(i, 47)
ThisWorkbook.Worksheets(2).Cells(i, 9) = ThisWorkbook.Worksheets(2).Cells(i, 9) + Sheets(j).Cells(i, 42)
ThisWorkbook.Worksheets(2).Cells(i, 10) = ThisWorkbook.Worksheets(2).Cells(i, 10) + Sheets(j).Cells(i, 45)
ThisWorkbook.Worksheets(2).Cells(i, 11) = ThisWorkbook.Worksheets(2).Cells(i, 11) + Sheets(j).Cells(i, 48)

Next i
vojdkbi0

vojdkbi01#

正如在你的OP的评论中提到的,你在你试图添加的单元格中有文本或错误。您可能将数字存储为文本,因此当您在单元格中看到它时,它看起来像一个数字,但Excel(& VBA)将其视为文本。如果是这种情况,每个单元格引用周围的CInt(ThisWorkbook...)将转换它。但它不会将Some text#ERROR转换为整数。您可能希望在每行周围创建一些验证代码,类似于以下内容:

Sub temp()
  Const NAN   As String = "Non-number in source data"

  With ThisWorkbook.Worksheets(2)
    Dim J     As Long
    Do While (J < (.Cells(1, 9)) + 3)
      Dim OtherWorksheet As Worksheet
      Set OtherWorksheet = ThisWorkbook.Worksheets(J)

      Dim i   As Long
      For i = 7 To 65
        'Megaform
        If IsNumeric(.Cells(i, 6)) And IsNumeric(Sheets(J).Cells(i, 41)) Then
          .Cells(i, 6) = .Cells(i, 6) + Sheets(J).Cells(i, 41)
        Else
          .Cells(i, 6) = NAN
        End If
        If IsNumeric(.Cells(i, 7)) And IsNumeric(OtherWorksheet.Cells(i, 44)) Then
          .Cells(i, 7) = .Cells(i, 7) + OtherWorksheet.Cells(i, 44)
        Else
          .Cells(i, 7) = NAN
        End If

        'etc...

      Next
      'I hope there's some incrementer for J down here!!
    Loop
  End With

End Sub

关于代码的几点注意事项:

  • 我将NAN声明为一个常量字符串,以便在输入数据无效时插入
  • 我添加了一个With块,这样我就不必输入几十次ThisWorkbook.Worksheets(2)
  • 这意味着每个以.开头的范围引用都将返回到该引用以获取完整的引用
    危险#1**FIRSTIf语句中的非限定Sheets(3)引用引用了 * 当前 * 活动的工作簿。你的'Megaform评论让我相信这可能是一个长期运行的过程。这可能会导致您的用户单击另一个工作簿。如果发生这种情况,Sheets()现在引用他刚刚选择的工作簿,而不是您正在使用的工作簿。
  • 我在 SECONDIf语句中解决了这个问题,在Do While循环开始后立即将OtherWorksheet设置为ThisWorkbook中的sheet #J。ThisWorkbookalways 指的是运行代码的工作簿,所以即使用户在你身上切换了书籍,你仍然可以回到原来的位置。然后,第二个If语句使用完全限定的OtherWorksheet.表示法,以确保它从正确的工作表中阅读。
    *危险#2Sheets()集合包括工作簿中的所有工作表类型。这包括Chart表。Chart工作表不会像你期望的那样工作,所以如果有人碰巧在你的工作簿中插入了一个图表工作表,当J指向它时,你的代码就会爆炸(运行时错误)。通过使用Worksheets()集合,可以避免这个潜在的问题。
  • 我在代码中添加了一些适当的缩进,因为这使得代码结构更容易通过快速扫描识别。我用Rubberduck * 为我做了这件事。它还有一个代码检查功能,可以为您的代码提供 * 许多 * 建议。
  • 您没有显示J的声明,也没有显示它的任何初始化或增量,所以我希望这些都在那里。它可能会使一个更简单的循环使用

For J = StartValue to .Cells(1,9) + 3
当端点是可定义的时候,我倾向于使用For循环,但是没有必要这样做。

  • 我没有为所有加法语句编写If保护。我认为这是一个很好的例子,你可以复制/粘贴其余的。
  • Rubberduck是一个开源项目(可在GitHub上获得),致力于将VBE带入21世纪。我的参与是作为一个满意的用户和半专业的抱怨测试者。
    要解决Subscript out of range错误:

您会注意到,在要点中我确实指出,在您的原始代码中,我没有看到任何设置J的内容。如果没有,它将从0开始,这超出了WorkSheet集合的范围(它是基于1的)。我还提出了一个建议,以确保有东西在那里增加它。
我的假设是Thisworkbook.Worksheets(2).Cells(1,9)包含您想要处理的工作表的数量(由于某种原因,减去3)。现在听起来像是你试图使用它来跟踪WorkBookWorkSheets的数量,这是不必要的,充满了错误。
如果你试图处理WorkBook中的WorkSheets(除了Worksheets(2),我猜它是数据的结束位置),请替换:

Dim J as Long
Do While (J < (.Cells(1, 9)) + 3)
  Dim OtherWorksheet As Worksheet
  Set OtherWorksheet = ThisWorkbook.Worksheets(J)
  .
  .
  .
Loop

使用以下代码:

Dim CurrentSheet as WorkSheet
For Each CurrentSheet in ThisWorkbook
  If CurrentSheet.Name <> ThisWorkbook.Worksheets(2).Name Then
    .
    'the existing code here.
    'NOTE: references to OtherWorksheet need to be changed to CurrentSheet
    '      Or, change "CurrentSheet" to "OtherWorksheet" in three places here, whichever is easier
    .
Next

这将处理WorkBook中的所有WorkSheets,跳过它通过名称标识的WorkSheet(2)。如果您需要跳过其他工作表,您可以将它们添加到If语句中,中间有And(即如果.Name = "Fred" And .Name = "Barney",则不处理)

but5z9lq

but5z9lq2#

我不确定这是否是事实,但仍然分享我的假设。我相信当你运行这个宏时,另一个工作簿是打开的。当您在代码中引用Sheets()而不引用任何工作簿时,Excel将从活动的工作簿中选取工作表。如果第二本书是活动的,这可能不是你想要的。
要解决这个问题,您需要明确地提到要用作源的工作簿。我修改了你的代码来做到这一点:

Dim SourceSheet As Worksheet
Dim DestinationSheet As Worksheet

Set DestinationSheet = ThisWorkbook.Worksheets(2)

j = 1

Do While (j < (ThisWorkbook.Worksheets(2).Cells(1, 9)) + 3)

    Set SourceSheet = ThisWorkbook.Worksheets(j)

    For i = 7 To 65

        DestinationSheet.Cells(i, 6) = DestinationSheet.Cells(i, 6) + SourceSheet.Cells(i, 41)
        DestinationSheet.Cells(i, 7) = DestinationSheet.Cells(i, 7) + SourceSheet.Cells(i, 44)
        DestinationSheet.Cells(i, 8) = DestinationSheet.Cells(i, 8) + SourceSheet.Cells(i, 47)
        DestinationSheet.Cells(i, 9) = DestinationSheet.Cells(i, 9) + SourceSheet.Cells(i, 42)
        DestinationSheet.Cells(i, 10) = DestinationSheet.Cells(i, 10) + SourceSheet.Cells(i, 45)
        DestinationSheet.Cells(i, 11) = DestinationSheet.Cells(i, 11) + SourceSheet.Cells(i, 48)

    Next i

    j = j + 1

Loop
d5vmydt9

d5vmydt93#

ThisWorkbook.Worksheets(2).Cells(i, 9)

将工作表重命名为“Sheet1”

ThisWorkbook.Worksheets("Sheet1").Cells(i, 9)

相关问题