VBA,Code在excel 2010中运行良好,在2013年缓慢而没有响应错误

时间:2018-06-17 14:10:17

标签: excel vba excel-vba

以前在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年没有?

1 个答案:

答案 0 :(得分:1)

这不是一个真正的答案。但是,我不确定代码是否会在评论部分进行格式化。如果有人愿意告诉我将来如何处理这种情况,请告诉我!

无论如何,优秀的家伙,我的意思是:

'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

OK ...接下来将更改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”,它会反转行的顺序,但只留下列。
  • 你有什么特别的理由将nRows和nCols传递给函数吗?当nRows和nCols不仅仅是传递数组的行数和列数时,您是否想要使用该函数?如果不是,那么我认为没有理由传递这些变量,而只是在传递的数组中在函数内生成它们。