为什么我的 excel 在我的代码 运行 之后崩溃而没有错误消息?
Why does my excel crash after running my code without an error message?
下面的代码在“MAIN”子程序的“END SUB”处崩溃。我搜索了这个网站和其他网站,但找不到解决方案。令人沮丧的部分是代码在崩溃之前完美运行。并且没有错误信息。我不认为代码很复杂,我正在使用的文件也不是很大(6k 行)。我尝试将代码和数据复制并粘贴到新的工作簿中。那没有帮助。
Option Explicit
Dim wsData As Worksheet
Sub Main()
On Error GoTo ProcError
Dim arrTrading() As Variant
Dim arrCenter() As Variant
Dim arrCategory() As Variant
Dim arrCountry() As Variant
Dim lastRow As Long
TurnOffFunctionality
Set wsData = Sheets("State Package Data")
lastRow = getLastRowByEndUp(wsData, 1)
wsData.Range("M2:M" & lastRow).Clear
wsData.Range("n2:n" & lastRow).Clear
wsData.Range("o2:o" & lastRow).Clear
createArrays arrTrading, arrCenter, arrCategory, arrCountry
lookup arrCountry, lastRow, "j", 20, "n", 8, "country"
lookup arrCategory, lastRow, "f", 1, "m", 3, "category"
lookup arrTrading, lastRow, "j", 1, "o", 3, "trading partner"
TurnOnFunctionality
ProcError:
MsgBox Err.Description
End Sub
Sub lookup(arr As Variant, lastRow As Long, lookupCol As String, matchCol As Long, _
postCol As String, returnCol As Long, name As String)
Dim i As Long
Dim x As Long
Dim lookupValue As String
Dim matchValue As String
For i = 2 To lastRow
lookupValue = wsData.Cells(i, lookupCol)
For x = 2 To UBound(arr)
matchValue = arr(x, matchCol)
If lookupValue = matchValue Then
wsData.Cells(i, postCol) = arr(x, returnCol)
Exit For
End If
Next x
Next i
Debug.Print name
End Sub
Sub createArrays(arrTrading As Variant, arrCenter As Variant, arrCategory As Variant, arrCountry As Variant)
Sheets("Mapping").Activate
arrCategory = Range("g1").CurrentRegion
arrCenter = Range("k1").CurrentRegion
arrTrading = Range("n1").CurrentRegion
Sheets("BPC Consol Ownership").Activate
arrCountry = Range("a1").CurrentRegion
End Sub
您遇到的这种错误通常是由于代码无法继续执行造成的,例如 TurnOnFunctionality
会退出 Excel 应用程序或删除代码所在的工作簿居住。
也有可能是ActiveSheet丢失所致。在 createArrays
过程中,您更改了 ActiveSheet:Sheets("BPC Consol Ownership").Activate
并且永远不会将其更改回来。也许 TurnOnFunctionality
试图 select sheet 上不再活动的单元格。这是糟糕的编码:-
Sheets("BPC Consol Ownership").Activate
arrCountry = Range("a1").CurrentRegion
arrCountry
似乎是一个范围(arrCategory
、arrCenter
和 arrTrading
是另一个 sheet 上的范围。现在,这是什么?
If lookupValue = matchValue Then
wsData.Cells(i, postCol) = Arr(x, returnCol)
Exit For
End If
postCol
和 returnCol
都是字符串。
wsData,Cells(i, postCol)
和 Arr(x, returnCol)
都是范围。是吗?
- 语法强制比较它们各自的
Value
属性。因此,您的代码背后的真实代码可能是 wsData,Cells(i, postCol).Value = Arr(x, returnCol).Value
,其中 Arr
不是一个数组而是一个范围 - 以及我们无法花时间处理的作品 sheet 上的一个范围找出它与 wsData 或 ActiveSheet. 的关系
范围和值的这种混合渗透到您的代码中。再加上ActiveSheet的不良切换,很明显,出现了不仅我糊涂,连Excel糊涂的情况。因此:-
- 从您的代码中删除所有
Activate
和 Select
语句。
- 消除程序中的所有歧义。使用
arrCountry = Range("a1").CurrentRegion.Value
并处理其后果。
正如你从后面的建议中看到的那样,如果你打算将范围分配给 arrCountry 语法应该是 Set arrCountry = Range("a1").CurrentRegion
然后 Arr(x, returnCol)
会确实是一个用 returnCol
作为字符串正确寻址的单元格。但是,如果 Arr
是一个数组,那么 returnCol
就不能是一个字符串,最后的失败一定与这个语法错误有关,它深深地埋在你的代码中,甚至 Excel 也不能确定来源,因此只是在没有解释的情况下崩溃。
下面的代码在“MAIN”子程序的“END SUB”处崩溃。我搜索了这个网站和其他网站,但找不到解决方案。令人沮丧的部分是代码在崩溃之前完美运行。并且没有错误信息。我不认为代码很复杂,我正在使用的文件也不是很大(6k 行)。我尝试将代码和数据复制并粘贴到新的工作簿中。那没有帮助。
Option Explicit
Dim wsData As Worksheet
Sub Main()
On Error GoTo ProcError
Dim arrTrading() As Variant
Dim arrCenter() As Variant
Dim arrCategory() As Variant
Dim arrCountry() As Variant
Dim lastRow As Long
TurnOffFunctionality
Set wsData = Sheets("State Package Data")
lastRow = getLastRowByEndUp(wsData, 1)
wsData.Range("M2:M" & lastRow).Clear
wsData.Range("n2:n" & lastRow).Clear
wsData.Range("o2:o" & lastRow).Clear
createArrays arrTrading, arrCenter, arrCategory, arrCountry
lookup arrCountry, lastRow, "j", 20, "n", 8, "country"
lookup arrCategory, lastRow, "f", 1, "m", 3, "category"
lookup arrTrading, lastRow, "j", 1, "o", 3, "trading partner"
TurnOnFunctionality
ProcError:
MsgBox Err.Description
End Sub
Sub lookup(arr As Variant, lastRow As Long, lookupCol As String, matchCol As Long, _
postCol As String, returnCol As Long, name As String)
Dim i As Long
Dim x As Long
Dim lookupValue As String
Dim matchValue As String
For i = 2 To lastRow
lookupValue = wsData.Cells(i, lookupCol)
For x = 2 To UBound(arr)
matchValue = arr(x, matchCol)
If lookupValue = matchValue Then
wsData.Cells(i, postCol) = arr(x, returnCol)
Exit For
End If
Next x
Next i
Debug.Print name
End Sub
Sub createArrays(arrTrading As Variant, arrCenter As Variant, arrCategory As Variant, arrCountry As Variant)
Sheets("Mapping").Activate
arrCategory = Range("g1").CurrentRegion
arrCenter = Range("k1").CurrentRegion
arrTrading = Range("n1").CurrentRegion
Sheets("BPC Consol Ownership").Activate
arrCountry = Range("a1").CurrentRegion
End Sub
您遇到的这种错误通常是由于代码无法继续执行造成的,例如 TurnOnFunctionality
会退出 Excel 应用程序或删除代码所在的工作簿居住。
也有可能是ActiveSheet丢失所致。在 createArrays
过程中,您更改了 ActiveSheet:Sheets("BPC Consol Ownership").Activate
并且永远不会将其更改回来。也许 TurnOnFunctionality
试图 select sheet 上不再活动的单元格。这是糟糕的编码:-
Sheets("BPC Consol Ownership").Activate
arrCountry = Range("a1").CurrentRegion
arrCountry
似乎是一个范围(arrCategory
、arrCenter
和 arrTrading
是另一个 sheet 上的范围。现在,这是什么?
If lookupValue = matchValue Then
wsData.Cells(i, postCol) = Arr(x, returnCol)
Exit For
End If
postCol
和returnCol
都是字符串。wsData,Cells(i, postCol)
和Arr(x, returnCol)
都是范围。是吗?- 语法强制比较它们各自的
Value
属性。因此,您的代码背后的真实代码可能是wsData,Cells(i, postCol).Value = Arr(x, returnCol).Value
,其中Arr
不是一个数组而是一个范围 - 以及我们无法花时间处理的作品 sheet 上的一个范围找出它与 wsData 或 ActiveSheet. 的关系
范围和值的这种混合渗透到您的代码中。再加上ActiveSheet的不良切换,很明显,出现了不仅我糊涂,连Excel糊涂的情况。因此:-
- 从您的代码中删除所有
Activate
和Select
语句。 - 消除程序中的所有歧义。使用
arrCountry = Range("a1").CurrentRegion.Value
并处理其后果。
正如你从后面的建议中看到的那样,如果你打算将范围分配给 arrCountry 语法应该是 Set arrCountry = Range("a1").CurrentRegion
然后 Arr(x, returnCol)
会确实是一个用 returnCol
作为字符串正确寻址的单元格。但是,如果 Arr
是一个数组,那么 returnCol
就不能是一个字符串,最后的失败一定与这个语法错误有关,它深深地埋在你的代码中,甚至 Excel 也不能确定来源,因此只是在没有解释的情况下崩溃。