2015-06-21 33 views
0

我有一個程序,根據某些條件從工作表中收集一些行,然後將選定的行粘貼到新工作表中。在Excel工作表中高效編寫多維變體

我想知道是否可以減少必須在新工作表中寫入選定行的次數。現在我正在逐行進行。

爲了簡單起見,我創建了一個假設的例子。假設我有一個變量數組「表」如下:

Dim table(100) as Variant 
For i = 0 To 100 
    table(i)= Range(Range("A1").offset(i,0), Range("A1").Offset(i, 8)).Value 
Next i 

現在,如果我想將值粘貼在一個新的工作表,我做的:

Worksheets(2).activate  
For i = 0 To 100 
Range(Range("A1").offset(i,0), Range("A1").Offset(i, 8)).Value = table(i) 
Next i 

是否有可能做粘貼在一個單一的步驟?我想知道,因爲我已經發現,如果我創建了一個多維的變體,如

Dim data(100,8) as Variant 
data = Range("A1:I100").Value 

然後,我可以將此作爲新的工作表

Worksheets(2).activate 
Range("A1:I100").Value = data; 

的問題在我的節目單步是因爲我根據某些條件將一維水平範圍逐個插入到變體數組中。正如最初所示,我最終得到了一個像'table'這樣的變體數組。是否有可能以某種方式將此錶轉換爲標準的二維數組(如上面所示的「數據」),以便我可以在新工作表中使用單個步驟進行粘貼?

我在VBA方面比較新,在C++方面有一定的經驗。任何幫助將不勝感激。謝謝!

+0

注'(100)'指定了afray的上限,並且For循環的上限是包含性的。因此你的數組有101個元素,for循環循環101次。 (數組的下限由'Option Base'語句確定,通常爲0.) –

回答

0

您可能會遇到惱人的事實,即使是一維範圍複製到二維變體陣列。下面的函數採取這樣不必要地2維數組的數組,並將其合併到該可直接粘貼單一的2維陣列(你的情況 - 可以粘貼鞏固(表)):

Function consolidate(arrays As Variant) As Variant 
'assumes that each entry of arrays is a 2-dimensional array of the form 1 to 1, 1 to n 
'with the same n for each entry 
    Dim block As Variant 
    Dim i As Long, lb As Long, ub As Long, n As Long, j As Long 
    lb = LBound(arrays) 
    ub = UBound(arrays) 
    n = UBound(arrays(lb), 2) 
    ReDim block(lb To ub, 1 To n) 
    For i = lb To ub 
     For j = 1 To n 
      block(i, j) = arrays(i)(1, j) 
     Next j 
    Next i 
    consolidate = block 
End Function 
+0

謝謝!正是我在找什麼。 – user3427916

+0

我回答了您的具體問題 - 但Paul Oglivie的修改後的答案可能會更好地解決您的具體問題。如果所有你想要做的是將一行數據粘貼到另一個表單上,那麼繞過中間商並直接粘貼範圍來識別它們(可能關閉屏幕更新)會更好。我的方法涉及嵌套for循環,只有在代碼需要在粘貼之前對這些值執行操作時纔有意義。 –

0

下面應該工作:

Range(Range("A1").Offset(0, 0), Range("A1").Offset(100, 8)).Copy 
Worksheets(2).Activate 
ActiveSheet.Range("A1").PasteSpecial Paste:=xlPasteValues 

即選擇你想要複製的所有東西,激活另一個woksheet,然後將值粘貼到那裏。

+0

謝謝Paul。但實際上我面臨着一個不同的問題。在我的程序中,我有一個包含一些數據的工作表。我向下滾動每一行,並根據某些條件,選擇性地將一些水平範圍添加到變體數組中。所以需要複製的數據不是順序的。 '表'的例子只是一個假設情況。所以在我的程序中,在選擇性地將一些行添加到變體中之後,我最終得到了類似「table」類型的變體。現在有了這種類型的變體,我不得不將它逐行地粘貼在新表中 – user3427916

+1

「我有一個包含一些數據的工作表,我向下滾動每行並根據某些條件,我......」_立即複製每一行到另一張紙上。因此,請完全避免使用陣列,而是直接複製並粘貼。 –

+0

是的,我想過。但是,當我將它張貼在新表中時,列的數量不會相同,儘管在所有記錄中都是相同的。我將根據用於選擇的標準執行一些調整,然後粘貼它們。實際上,我仍然可以通過直接複製來做到這一點,但數據可能被其他函數用作參數的可能性很小。所以想把它存放在一些容器中。但是直接複製並且在第一個循環中包含操作本身是有道理的。 – user3427916