首页 文章

自动化Excel时缓慢循环

提问于
浏览
1

我需要创建一个excel表,其中包含一个位数组的可视化表示 . 目前,我测试位值并更新单元格内容

For h = 1 To 128
    value = Mid(array, h,1)
    If value = "1" Then
        xl.Application.Sheets("Sheet1").Cells(129 - h,5).value = "X"
    Else
        xl.Application.Sheets("Sheet1").Cells(129 - h,5).value = ""
    End If
Next

如果我在Next之前添加 WScript.Sleep 100 ,那么excel表中的输出结果是正确的 .

如果没有,那么X是在错误的地方 .

最初我认为这是Excel很慢,所以我尝试制作一个CSV文件,我可以稍后导入,但结果相同:太快而且X位于错误的位置,减速并且它们是正确的 .

这些128位阵列中有大约128个,如果每个需要3~5秒,那么制作这张表将需要永远 .

有谁知道如何快速实现这一目标?我对其他想法/解决方案(使用VBS)输出excel文件持开放态度 .

谢谢!

2 回答

  • 0

    尝试将阵列一次性放入范围,就像这样

    ReDim dat(1 To 128, 1 To 1)
        For h = 1 To 128
            v = Mid$(arr, h, 1)
            dat(129 - h, 1) = IIf(v = "1", "X", "")
        Next
        xl.Application.Sheets("Sheet1").Cells(1, 5).Resize(128, 1).Value = dat
    
  • 0

    这对我有用(在vbscript而不是vba测试) .

    由于它使用数组, "" 输出作为 IF 的一部分是冗余的,因为数组是空白的,因此只需要在位为1时写入X.

    Dim StrArr
    Dim xl
    
    Set xl = CreateObject("excel.application")
    Set wb = xl.Workbooks.Add
    
    'sample array
    StrArr = "1100111011001110110011101100111011001110110011101100111011001110110011101100111011001110110011101100111011001110110011101100111"
    Dim X(128, 1 )
    
    For lngrow = 1 To UBound(X)
        If Mid(StrArr, lngrow, 1) = "1" Then X(lngrow, 0) = 1
    Next
    
    wb.Sheets(1).Cells(1, 5).Resize(UBound(X), 1).Value = X
    xl.Visible = True
    

相关问题