为什么我的 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 似乎是一个范围(arrCategoryarrCenterarrTrading 是另一个 sheet 上的范围。现在,这是什么?

    If lookupValue = matchValue Then
        wsData.Cells(i, postCol) = Arr(x, returnCol)
        Exit For
    End If
  • postColreturnCol 都是字符串。
  • wsData,Cells(i, postCol)Arr(x, returnCol) 都是范围。是吗?
  • 语法强制比较它们各自的 Value 属性。因此,您的代码背后的真实代码可能是 wsData,Cells(i, postCol).Value = Arr(x, returnCol).Value,其中 Arr 不是一个数组而是一个范围 - 以及我们无法花时间处理的作品 sheet 上的一个范围找出它与 wsDataActiveSheet.
  • 的关系

范围和值的这种混合渗透到您的代码中。再加上ActiveSheet的不良切换,很明显,出现了不仅我糊涂,连Excel糊涂的情况。因此:-

  1. 从您的代码中删除所有 ActivateSelect 语句。
  2. 消除程序中的所有歧义。使用arrCountry = Range("a1").CurrentRegion.Value并处理其后果。

正如你从后面的建议中看到的那样,如果你打算将范围分配给 arrCountry 语法应该是 Set arrCountry = Range("a1").CurrentRegion 然后 Arr(x, returnCol) 会确实是一个用 returnCol 作为字符串正确寻址的单元格。但是,如果 Arr 是一个数组,那么 returnCol 就不能是一个字符串,最后的失败一定与这个语法错误有关,它深深地埋在你的代码中,甚至 Excel 也不能确定来源,因此只是在没有解释的情况下崩溃。