Excel VBA sub 为 运行 时出现错误 400,但在调试步骤中没有错误?
Excel VBA Error 400 when sub is ran, but no error in debug step through?
这更像是一个思考题,我有一个子程序可以绘制图片并将它们作为形状对象保存在 excel 工作簿中。它通常可以很好地处理少于 15 个左右的形状,但是当我开始超过 15 个时,它会抛出错误 400,大概是内存不足?其他时候我有超过 300 个工作正常。
我有一个需要绘制的 35 个形状的列表,每次它崩溃时我都尝试了 3 次,所以我逐行检查了代码。让我感到困惑的是,单步执行允许程序绘制每个形状,而不是像过去三次那样崩溃。我不知道为什么这在调试模式下有效,但在 'normal' 运行 模式下无效。
Declare Function CDKSmilesImageToClipboard Lib "cdkInterfaceDll.dll" Alias "_smilesToClipboardCdkInterfaceDll@12" (ByVal smiles As String, ByVal width As Long, ByVal height As Long) As Long
Dim i As Integer, LastRow As Long, SMILES As String, temp As Long
For i = 6 To LastRow
SMILES = Sheets("Table").Cells(i, 7).Value2
temp = CDKSmilesImageToClipboard(SMILES, 150, 115)
Sheets("Table").Paste Destination:=Sheets("Table").Cells(i, 7)
Sheets("Table").Shapes(Sheets("Table").Shapes.Count).Name = "Structure " & i
Sheets("Table").Cells(i, 2).Value2 = "Structure " & i
Next i
我预计 运行 时发生的错误也应该在我单步执行代码时发生。但它不是。 400 错误是模棱两可的,所以我什至不确定它是 OOM 错误。所以我转向 Stack 寻求指导。有没有人见过这个?有什么我可以添加到我的代码中以减慢或浏览形状绘图的东西吗?
谢谢!
我能够为我遇到的问题创建一个不到 100% 理想的解决方法。为了完整性和将来参考,它发布在下面。
添加下面的错误处理结构,我能够防止 sub 崩溃或跳过错误绘制(当我使用 On Error Resume Next 时会绘制空白图片)。
Declare Function CDKSmilesImageToClipboard Lib "cdkInterfaceDll.dll" Alias "_smilesToClipboardCdkInterfaceDll@12" (ByVal smiles As String, ByVal width As Long, ByVal height As Long) As Long
Dim i As Integer, LastRow As Long, SMILES As String, temp As Long
For i = 6 To LastRow
ReDo:
On Error GoTo ErrCatch
SMILES = Sheets("Table").Cells(i, 7).Value2
temp = CDKSmilesImageToClipboard(SMILES, 150, 115)
ErrCatch:
If Err.Number <> 0 Then
On Error GoTo -1 'Resets the Err Catcher
On Error GoTo ErrCatch 'Recalibrates the Err Catcher
GoTo ReDo 'Redoes the image draw/paste
End If
Sheets("Table").Paste Destination:=Sheets("Table").Cells(i, 7)
DoEvents
Sheets("Table").Shapes(Sheets("Table").Shapes.Count).Name = "Structure " & i
Sheets("Table").Cells(i, 2).Value2 = "Structure " & i
Next i
添加错误处理通过重做 draw/paste 循环来防止 400 错误。我希望我能从一开始就直接防止错误发生,但这会导致 100% 的结果是可以接受的:)谢谢你们的帮助!
这更像是一个思考题,我有一个子程序可以绘制图片并将它们作为形状对象保存在 excel 工作簿中。它通常可以很好地处理少于 15 个左右的形状,但是当我开始超过 15 个时,它会抛出错误 400,大概是内存不足?其他时候我有超过 300 个工作正常。
我有一个需要绘制的 35 个形状的列表,每次它崩溃时我都尝试了 3 次,所以我逐行检查了代码。让我感到困惑的是,单步执行允许程序绘制每个形状,而不是像过去三次那样崩溃。我不知道为什么这在调试模式下有效,但在 'normal' 运行 模式下无效。
Declare Function CDKSmilesImageToClipboard Lib "cdkInterfaceDll.dll" Alias "_smilesToClipboardCdkInterfaceDll@12" (ByVal smiles As String, ByVal width As Long, ByVal height As Long) As Long
Dim i As Integer, LastRow As Long, SMILES As String, temp As Long
For i = 6 To LastRow
SMILES = Sheets("Table").Cells(i, 7).Value2
temp = CDKSmilesImageToClipboard(SMILES, 150, 115)
Sheets("Table").Paste Destination:=Sheets("Table").Cells(i, 7)
Sheets("Table").Shapes(Sheets("Table").Shapes.Count).Name = "Structure " & i
Sheets("Table").Cells(i, 2).Value2 = "Structure " & i
Next i
我预计 运行 时发生的错误也应该在我单步执行代码时发生。但它不是。 400 错误是模棱两可的,所以我什至不确定它是 OOM 错误。所以我转向 Stack 寻求指导。有没有人见过这个?有什么我可以添加到我的代码中以减慢或浏览形状绘图的东西吗?
谢谢!
我能够为我遇到的问题创建一个不到 100% 理想的解决方法。为了完整性和将来参考,它发布在下面。
添加下面的错误处理结构,我能够防止 sub 崩溃或跳过错误绘制(当我使用 On Error Resume Next 时会绘制空白图片)。
Declare Function CDKSmilesImageToClipboard Lib "cdkInterfaceDll.dll" Alias "_smilesToClipboardCdkInterfaceDll@12" (ByVal smiles As String, ByVal width As Long, ByVal height As Long) As Long
Dim i As Integer, LastRow As Long, SMILES As String, temp As Long
For i = 6 To LastRow
ReDo:
On Error GoTo ErrCatch
SMILES = Sheets("Table").Cells(i, 7).Value2
temp = CDKSmilesImageToClipboard(SMILES, 150, 115)
ErrCatch:
If Err.Number <> 0 Then
On Error GoTo -1 'Resets the Err Catcher
On Error GoTo ErrCatch 'Recalibrates the Err Catcher
GoTo ReDo 'Redoes the image draw/paste
End If
Sheets("Table").Paste Destination:=Sheets("Table").Cells(i, 7)
DoEvents
Sheets("Table").Shapes(Sheets("Table").Shapes.Count).Name = "Structure " & i
Sheets("Table").Cells(i, 2).Value2 = "Structure " & i
Next i
添加错误处理通过重做 draw/paste 循环来防止 400 错误。我希望我能从一开始就直接防止错误发生,但这会导致 100% 的结果是可以接受的:)谢谢你们的帮助!