2014-11-01 59 views
0

我是一名總新手,涉及到vba並需要一些幫助。基本上在一張紙上我有一張桌子,在另一張紙上(相同的工作簿),我有一個每天都在變化的列表,我需要相應地更新這張表,即相應地添加和/或刪除條目。只是想法,我想我會開始是:使用excel比較列表並輸出新條目VBA

1) Do I need to determine the size of the table/list since it's changing 
2) Shall I make use of vlookup combined with a nested loops to compare each cell of the list with each cell of the table? 

所有反饋意見。

+0

您的問題目前非常含糊。如果您向我們提供一些示例數據,以及您迄今爲止嘗試過的任何代碼,這將有所幫助。而且,這聽起來像是一個數據透視表能夠做到的事情。我會先看看,然後嘗試使用VBA,如果一個數據透視表無法完成你所需要的。 – BobbitWormJoe 2014-11-01 06:55:23

回答

1

我剛剛在幾天前回答了一個與此非常相似的問題。
Here is the link在這個例子中,它是基於一個數組。你可以稍微修改這個來獲得你的結果。

  1. 是的,你需要確定你正在檢查的列表的最後一行。 - GetLastRow(請參閱下文)
  2. vLoopup不如Match或Match with Match有效。您可以使用worksheetFunction.Match跳過第一次出現,甚至查看是否有任何匹配。

步驟來考慮:

  • 確定正在檢查列表的最後一行。 - GetLastRow
    (見下文)

  • 創建原始列表的陣列

  • 確定第二列表的最後一行

  • 關於第二片 針對每個項目對每個項目進行的循環在第一。 - 循環內循環,這是你可能想要使用匹配或其他東西 ,雖然我不知道 使用WorksheetFunction節省了多少時間,它只是在後臺工作。但它仍然在努力 和類似的工作,你可以編碼。 使用使用ReDim你的陣列來設置它的大小一個 一次較大 -

  • 爲 無與倫比的項目創建陣列。

  • 將不匹配的項目添加到原始工作表。 (參見下面)

大部分情況是一遍又一遍。通過一次循環一個單元格將項目添加到數組。檢查一個值是否爲另一個值。如果是這樣,match = true ..就是這樣。看看鏈接,看看另一個例子。

爲此,請使用.Cells而不是.Range。 .Cells(row#,Col#)格式非常適合循環。對於Row#或者Column#只需要一個變量,然後增加它來循環。這與單擊工作表上的向下箭頭效果相同。您還可以使用字符串定義公式。

Dim r As Long ' Or Integer although I've read that Long is more efficient. 
r = 4 
Sheets("Sheet1").Cells(r, 3) = "Hello There C4!" 
'Result = Sheet1!C4 = Hello There C4 

舉例:這會是怎樣運行到您的無與倫比的項目添加到原始列表。你只想添加那些不在那裏的。

Private Sub AddToSheet() 

    Call GetLastRow 
    r = lastRow + 1 
    i = 0 

    For i = 0 To n 
     Sheets("Sheet1").Cells(r, 1) = unMatchedArray(i) 
     r = r + 1 
    Next i 

End Sub 

Private Sub GetLastRow() 

    ' checking Range("A1:A65536") 
    lastRow = Sheets("Sheet1").Cells(65536, 1).End(xlUp).Row 

End Sub