VBA,代码在excel 2010中运行良好,在2013年运行缓慢且无响应错误

VBA,代码在excel 2010中运行良好,在2013年运行缓慢且无响应错误,vba,excel,Vba,Excel,以前在2010 excel版本(14.0.7165.5000版)中运行我的代码时,它只需4分钟。(但是,如果我再次运行它,它将不起作用) 切换到2013年时,我会看到“excel没有响应”,或者只是excel挂起。 代码从目录中打开一个文件,将它们加载到我的excel工作表中,并编译和转换一些数据 我一步一步地完成了代码,似乎通过了这一部分,现在excel没有对我给定的子部分做出响应,特别是在这一部分 'write For i = 1 To WorksheetFunction.Mi

以前在2010 excel版本(14.0.7165.5000版)中运行我的代码时,它只需4分钟。(但是,如果我再次运行它,它将不起作用) 切换到2013年时,我会看到“excel没有响应”,或者只是excel挂起。 代码从目录中打开一个文件,将它们加载到我的excel工作表中,并编译和转换一些数据

我一步一步地完成了代码,似乎通过了这一部分,现在excel没有对我给定的子部分做出响应,特别是在这一部分

   'write
    For i = 1 To WorksheetFunction.Min(nRows, UBound(arr, 1))
        For j = 1 To nCols
            If fromTop Then writeVal = arr(i, j) Else writeVal = arr(UBound(arr, 1) - i + 1, j)
            thisWS.Cells(startRow + i - 1, startCol + j - 1).value = writeVal
        Next j
    Next i

有人知道这是为什么吗?我使用的功能是否在2010年有效,但在2013年无效

这不是一个真正的答案。但是,我不确定代码是否会在注释部分格式化。如果有人想告诉我今后如何处理这种情况,请告诉我

不管怎么说,excel guy,我的意思是:

'clear
startCell.Resize(nRows, nCols).ClearContents
而不是:

'clear
For i = 1 To nRows
    For j = 1 To nCols
        thisWS.Cells(startRow + i - 1, startCol + j - 1).value = ""
    Next j
Next i
好的。。。下一步是将writeArrToWS子命令更改为使用数组一次写入整个范围。我重写了sub,加入了对上述答案的修改。我想你会想要:

Public Sub writeArrToWS(arr() As Variant, startCell As Range, fromTop As Boolean, nRows As Long, nCols As Long)

    Dim i As Long, j As Long, startRow As Long, startCol As Long
    Dim thisWS As Worksheet, totalRange As Range

    Set thisWS = startCell.Worksheet

    'set the write range
    Set totalRange = startCell.Resize(nRows, nCols)

    'clear
    totalRange.ClearContents

    'write
    If fromTop Then
        totalRange.Value2 = arr
    Else
        Dim reversedArr() As Variant, swappedRow As Long
        ReDim reversedArr(1 To nRows, 1 To nCols)
        For i = 1 To nRows
            swappedRow = nRows - i + 1
            For j = 1 To nCols
                reversedArr(swappedRow, j) = arr(i, j)
            Next j
        Next i
        totalRange.Value2 = reversedArr
    End If

End Sub
有几件事:

  • 如果fromTop为真,您只需将数组粘贴到范围中。。。我误解了吗?如果是这样,就好像你只需要一个“reverseArray”函数/子程序
  • 我们基本上只是生成一个新数组“reversedArr”,它颠倒了行的顺序,但保留了列
  • 您向函数传递nrow和ncol有什么特殊原因吗?当nRows和nCols不仅仅是所传递数组的行数和列数时,是否希望使用该函数?如果没有,那么我认为没有理由传递这些变量,而只是从传递的数组在函数内部生成它们

您可以分解代码(断点/任何东西)并查看问题所在。您还可以优化writeArrToWS子项,以便在整个工作集范围内调用ClearContents,并将数组写入一个工作表hit@MacroMarc,当excel工作表停止响应时,通常位于这一行,
thisCurveDataRow=findInArrCol(curveNameToMarketData(thisCurveMapRow,2),2,curveData)
您所说的“停止”是什么意思?它会崩溃、返回错误或其他什么吗?对不起,我的意思是excel没有响应,我现在刚刚通过它,当我进入
writearTows
子栏时,会出现此错误,这是基于代码的大小/复杂度,以及excel没有响应很难跟踪。我尝试的前两件事是:1)将generateIRandCRshocks末尾的块更改为“With ActiveWorkbook.Sheets(“IR_CR_Shocks”)”块,2)将writeArrToWS的“clear”部分更改为,而不是通过数组循环,生成一个range对象并对其使用.ClearContents方法。clear实际上工作得很好,只是下一个
写入部分导致excel没有响应。@excelguy。NROW和NCOL有多大?行数大约为10k,大约为18列(您需要精确的数字吗)。不管怎样,你可以帮我处理阵列吗?Nrows=7440,ncols=18