types不匹配错误:不明白为什么

我正在尝试将一个值添加到另一个值,但它总是停在我的代码中的某处,并抛出:

错误types13:不匹配错误

即使删除代码的一部分,也会出现相同的错误。 例如:

当这个:

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 

正如您在OP上的评论中所提到的那样,您想要添加的单元格中有文字或错误。 您可能会将一个数字存储为文本,因此当您在单元格中看到它时,它看起来像一个数字,但Excel(&VBA)会将其视为文本。 如果是这种情况,围绕每个单元格引用的CInt(ThisWorkbook...)将转换它。 但是它不会将Some text#ERROR转换为一个整数。 你可能想在每一行周围创build一些validation码,如下所示:

 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声明为一个常量string,以便在input数据无效时插入
  • 我添加了一个With块,所以我不必inputThisWorkbook.Worksheets(2)几十次
    • 这意味着每一个以范围开始的范围参考. 请参阅此处以获取完整的参考
  • 危险#1 FIRST If语句中的不合格Sheets(3)引用是指当前活动的工作簿。 您'Megaform评论让我相信这可能是一个漫长的过程。 这可能会导致您的用户单击另一个工作簿。 如果发生这种情况, Sheets()现在引用他刚刚select的工作簿,而不是您正在使用的工作簿。
    • 我解决了在SECOND If语句中,通过在Do While循环开始之后立即将ThisWorkbook OtherWorksheet设置为工作表#J。 这个工作簿总是引用代码运行的工作簿,所以即使用户切换了你的书,你仍然可以回到你所在的位置。 第二条If语句然后使用完全合格的OtherWorksheet. 表示法来确保从正确的工作表中读取。
  • Danfare#2 Sheets()集合包括工作簿中的所有工作表types。 这包括Chart表。 Chart工作不会像你期望的那样工作,所以如果有人碰巧在你的工作簿中插入一张图表,你的代码会在J指向它时炸掉(运行时错误)。 通过使用Worksheets()集合,可以避免潜在的问题。
  • 我添加了一些适当的缩进代码,因为这使得代码结构更容易识别与快速扫描。 我用Rubberduck *为我做。 它还有一个代码检查function,将提供许多关于您可以对代码进行的其他改进的build议。
  • 你不会显示你的J或任何初始化或增量的声明,所以我希望那些在那里。 这可能会使一个更简单的循环使用
    For J = StartValue to .Cells(1,9) + 3
    当终点可定义时,我倾向于使用For循环,但没有要求。
  • 我没有写所有你的附加陈述的If保护。 我想这是一个很好的例子,你可以复制/粘贴其余的。

* Rubberduck是一个开源项目(在GitHub上提供)努力使VBE进入21世纪。 我的参与是作为一个满意的用户和半专业投诉testing员。


解决下Subscript out of range错误:

你会注意到,在我所指出的要点中,我没有看到你的原始代码中没有设置J开始。 如果没有任何内容,它将从WorkSheet集合(基于1的范围)超出范围的0开始。 我还提出了一个build议,以确保在那里有东西来增加它。

我的推定是Thisworkbook.Worksheets(2).Cells(1,9)包含您要处理的工作表的数量(减3,出于某种原因)。 现在听起来好像您正在尝试使用它来跟踪WorkSheetsWorkBook的数量,这是不必要的,充满了错误。

如果您正在尝试处理WorkSheets中的所有 Worksheets(2) (除了Worksheets(2)这是数据最终的位置),我推测),请replace:

 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 

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

我不确定事实是否如此,但仍然分享我的假设。 我相信当你运行这个macros时,另一个工作簿是打开的。 当您在您的代码中引用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