新的VBA运行时错误6,脚本停在空白单元而不是循环

最近开始与VBA合作。 Youtube和这个论坛迄今为止都非常出色。 但是,我的问题是这样的:

Private Sub CommandButton1_Click() Dim i As Integer i = 1 Do While Sheet2.Cells(i, 1).Value <> 0 Sheet3.Cells(i, 1).Value = Sheet2.Cells(i, 1) i = i + 1 Loop Do While Sheet2.Cells(i, 10).Value <> 0 Sheet3.Cells(i, 4).Value = Sheet2.Cells(i, 10) i = i - 1 Loop Do While Sheet2.Cells(i, 6).Value <> 2 Sheet3.Cells(i, 3).Value = Sheet2.Cells(i, 6) i = i + 1 Loop End Sub 

此脚本将信息填充到正确的表单以及正确的列中,至less在遇到Sheet2中的空单元格之前。 此时将移动到下一个“Do While”而不是引用下一个非空白单元格。

我也遇到了一个运行时错误6-溢出这个特定的行:

 Do While Sheet2.Cells(i, 6).Value <> 2 Sheet3.Cells(i, 3).Value = Sheet2.Cells(i, 6) i = i + 1 <<<<----- ERROR?? 

我相当肯定,溢出错误是Dim i as IntegerDim i as String ,但是我再次几乎,但通过试验和错误的工作,移动脚本的部分和玩expression式/函数。

如前所述,我是VBA新手。 我也是那种通过这样做而学习的人。 我已经看过所有不同的论坛,YouTubevideo等尝试创build一个脚本,我想要的方式工作。

UPDATE

感谢您的快速帮助和build议。 我意识到我在第一篇文章中没有提供足够的信息。

1.)我不需要/想要在sheet3上留下一个空单元格。 脚本现在循环但不跳过空白,如果这是有道理的?

 For example: doing need to do 101 101 102 102 104 104 105 105 106 106 

我仍然会跑到世界的尽头。 出于某种原因debuggingfunction正在提出这条线

  i = i + 1 

2.)行:

  Do While Sheet2.Cells(i, 6).Value <> 2 Sheet3.Cells(i, 3).Value = Sheet2.Cells(i, 6) 

应该认出一列文字不是数字。 不完全确定这是否对任何事情都有影响

再次感谢大家。

更新3:

我摆脱了错误信息并更正了脚本中的所有expression式。 此外,我发现,而不是使用Do Until....... And........有零结果。 我不得不回去Do While用前者代替Or声明。

到目前为止,剧本比我预期的更好。 谢谢大家的帮助和见解。

除了好消息之外,我还需要弄清楚如何编写一个“IF”语句,以便脚本将跳过sheet2.cells(i, 1)空白单元格,而不是为相邻两列中的那一行导入当前值

这里是当前和运行的脚本:

 Private Sub CommandButton1_Click() Dim i As Long i = 3 Do While (Not IsEmpty(Sheet2.Cells(i, 10))) Or (Sheet3.Cells(i, 4).Value <> 0) Sheet3.Cells(i, 4).Value = Sheet2.Cells(i, 10).Value i = i + 1 Loop i = 3 Do While (Not IsEmpty(Sheet2.Cells(i, 1))) Or (Sheet3.Cells(i, 1).Value <> 0) Sheet3.Cells(i, 1).Value = Sheet2.Cells(i, 1).Value i = i + 1 Loop i = 3 Do While (Not IsEmpty(Sheet2.Cells(i, 6))) Or (Sheet3.Cells(i, 3).Value <> 0) Sheet3.Cells(i, 3).Value = Sheet2.Cells(i, 6).Value i = i + 1 Loop End Sub 

再次感谢大家。 希望我能在不久的将来回报这个好处。

一些想法:

  • 正如@dgorti所说,确保在每个Do循环之前设置i作为你想要开始的行的索引。
  • Dim任何整数值作为Long ,而不是IntegerLong是32位; Integer是16。
  • 要跳过空单元格,请使用IsEmpty 。 例如,在你的第一个循环: 编辑

     Do Until (Not IsEmpty(Sheet2.Cells(i, 1))) and (Sheet2.Cells(i, 1).Value = 0) 
  • 编辑而且,正如@ASH所指出的那样,你也应该对i范围检查。 由于VBA没有短路操作,所以在循环结束时我会这样做:

     Do ... ... 'vvvvv representable in a Long If i = 65536 Then Exit Do ' Or If i = 1... for loops that count down i = i + 1 Loop 

    这样你永远不会跑完。

编辑我修正了上面的testing – 你想运行,直到你打到一个值为0的非空单元格,对不对? 所以Do Until (这是一个真正的东西)循环,直到确切的条件成立。 Not IsEmpty()阻止对0的testing在空白单元上给出错误的结果。