2016-11-18 35 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