我试图将一个值添加到另一个值,但它总是在代码中的某个地方停止并抛出:
错误类型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
3条答案
按热度按时间vojdkbi01#
正如在你的OP的评论中提到的,你在你试图添加的单元格中有文本或错误。您可能将数字存储为文本,因此当您在单元格中看到它时,它看起来像一个数字,但Excel(& VBA)将其视为文本。如果是这种情况,每个单元格引用周围的
CInt(ThisWorkbook...)
将转换它。但它不会将Some text
或#ERROR
转换为整数。您可能希望在每行周围创建一些验证代码,类似于以下内容:关于代码的几点注意事项:
NAN
声明为一个常量字符串,以便在输入数据无效时插入With
块,这样我就不必输入几十次ThisWorkbook.Worksheets(2)
.
开头的范围引用都将返回到该引用以获取完整的引用危险#1**FIRST
If
语句中的非限定Sheets(3)
引用引用了 * 当前 * 活动的工作簿。你的'Megaform
评论让我相信这可能是一个长期运行的过程。这可能会导致您的用户单击另一个工作簿。如果发生这种情况,Sheets()
现在引用他刚刚选择的工作簿,而不是您正在使用的工作簿。If
语句中解决了这个问题,在Do While
循环开始后立即将OtherWorksheet
设置为ThisWorkbook
中的sheet #J。ThisWorkbook
always 指的是运行代码的工作簿,所以即使用户在你身上切换了书籍,你仍然可以回到原来的位置。然后,第二个If
语句使用完全限定的OtherWorksheet.
表示法,以确保它从正确的工作表中阅读。*危险#2
Sheets()
集合包括工作簿中的所有工作表类型。这包括Chart
表。Chart
工作表不会像你期望的那样工作,所以如果有人碰巧在你的工作簿中插入了一个图表工作表,当J
指向它时,你的代码就会爆炸(运行时错误)。通过使用Worksheets()
集合,可以避免这个潜在的问题。J
的声明,也没有显示它的任何初始化或增量,所以我希望这些都在那里。它可能会使一个更简单的循环使用For J = StartValue to .Cells(1,9) + 3
当端点是可定义的时候,我倾向于使用
For
循环,但是没有必要这样做。If
保护。我认为这是一个很好的例子,你可以复制/粘贴其余的。要解决
Subscript out of range
错误:您会注意到,在要点中我确实指出,在您的原始代码中,我没有看到任何设置
J
的内容。如果没有,它将从0
开始,这超出了WorkSheet
集合的范围(它是基于1的)。我还提出了一个建议,以确保有东西在那里增加它。我的假设是
Thisworkbook.Worksheets(2).Cells(1,9)
包含您想要处理的工作表的数量(由于某种原因,减去3)。现在听起来像是你试图使用它来跟踪WorkBook
中WorkSheets
的数量,这是不必要的,充满了错误。如果你试图处理
WorkBook
中的WorkSheets
(除了Worksheets(2)
,我猜它是数据的结束位置),请替换:使用以下代码:
这将处理
WorkBook
中的所有WorkSheets
,跳过它通过名称标识的WorkSheet(2)
。如果您需要跳过其他工作表,您可以将它们添加到If
语句中,中间有And
(即如果.Name = "Fred" And .Name = "Barney"
,则不处理)but5z9lq2#
我不确定这是否是事实,但仍然分享我的假设。我相信当你运行这个宏时,另一个工作簿是打开的。当您在代码中引用
Sheets()
而不引用任何工作簿时,Excel将从活动的工作簿中选取工作表。如果第二本书是活动的,这可能不是你想要的。要解决这个问题,您需要明确地提到要用作源的工作簿。我修改了你的代码来做到这一点:
d5vmydt93#
将工作表重命名为“Sheet1”