2016-11-18 48 views
1

我需要创建一个包含位数组的视觉表示的Excel表。目前我测试位值,以及更新单元格内容自动化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 

如果我下一步之前添加WScript.Sleep 100然后输出结果在Excel工作表是正确的。

如果没有,那么X的位置是错误的。

最初我以为这是Excel慢,所以我试着做一个CSV文件,我可以稍后导入,但结果相同:速度太快,X的位置错误,放慢速度,他们是正确的。

这些128位阵列中大约有128个,如果每个都需要3〜5秒,那么使这张表将永远占用。

有谁知道我该如何快速实现?我接受其他想法/解决方案(使用VBS)输出excel文件。

谢谢!

回答

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 
+1

由于对于那个答复,@chris neilsen。由于VBS不支持Iif语句,因此我使用标准的“IF Then Else EndIF”。当**创建数组时,会发生问题,而不是转置它。我通过创建CSV文件证明了这一点,运行_full速度时结果为_incorrect_,但在“For ... Next”循环之间添加WScript.Sleep 100时正确。这个正确的数组然后可以转置到Excel工作表。 – BertB

+0

全速创建时位阵列**表示**不正确。降低的速度是_not_,因为它一次写入excel表单,但是因为减慢“For ...... Next”循环提供了正确的位数组表示_。 – BertB

+0

我建议你发布[MCVE](http://stackoverflow.com/help/mcve),以便其他人可以测试这些。 –

0

这为我工作(在而不是测试)。

,因为它使用一个阵列,所述""输出作为IF的部分是多余的,因为阵列是空白的,所以仅需要写X当该比特为1。

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