2011-10-21 57 views
1

我需要一些幫助來遍歷三個範圍(工作表)和來回檢查數據。但這些For循環正在殺死我..三個循環對我來說有點過分,我甚至不知道如何在邏輯上分散代碼,什麼地方等。Excel vba - 比較三個範圍

好吧,所以基本上我收集這三個範圍到自己的變體數組:

  • 摘要
  • 用戶
  • 文章

我這裏有片,在線觀看。不需要下載它或任何東西。如果彙總表爲空,那麼我在那裏收集數據的宏代碼。這是按照它應該做的。 https://skydrive.live.com/view.aspx?cid=5D018DB0458F03ED&resid=5D018DB0458F03ED%21164

該電子表格中有一些挪威語的話,但這應該不重要:)它基本上是反對(總結),Brukere(用戶)和Artikler(文章)。

無論如何,我想確保彙總表包含每個用戶多次有文章。基本上它應該是鏡像的。如果我從用戶工作表中刪除一行(姓名),那麼這些行也應該從彙總表中刪除。但同時我也想保留彙總表中D列的數據。因此,我需要保留這些數據以及用戶ID和文章ID,以確保D列中的數據位於正確的位置。

這是我的(壞)的代碼,因爲它是現在..

With shtSummary 
    ReDim tempArr(1 To UBound(arrUsers) * UBound(arrarticles), 1 To 6) 
    If Not .Range("A2") = "" Then 
     arrsummary = .Range("A2", .Cells(Rows.Count, "A").End(xlUp)).Resize(, 6) 

     ' Start collecting data, make sure summary sheet contains refreshed data while keeping the amount of each item for that particular user 
     For u = 1 To UBound(arrsummary) 
      For i = 1 To UBound(arrUsers) 
       For p = 1 To UBound(arrarticles) 
        j = j + 1 
        ' Check ID 
        If arrsummary(u, 1) = arrUsers(i, 1) And arrsummary(u, 3) = arrarticles(p, 1) Then 
         ' ID 
         tempArr(j, 1) = arrUsers(u, 1) 
         ' Name 
         tempArr(j, 2) = arrUsers(u, 2) 
         ' Article Number 
         tempArr(j, 3) = arrarticles(i, 1) 
         ' Article Name 
         tempArr(j, 4) = arrarticles(i, 2) 
         ' Amount of that item 
         tempArr(j, 5) = arrsumary(u, 5) 
         ' Price of that article 
         tempArr(j, 6) = arrarticles(i, 3) 
        End If 
       Next 
      Next 
     Next 

    Else 
     ' If summary sheet is empty, add all data from the two other sheets 
     For u = 1 To UBound(arrUsers) 
      For i = 1 To UBound(arrarticles) 
       j = j + 1 
       ' ID 
       tempArr(j, 1) = arrUsers(u, 1) 
       ' Name 
       tempArr(j, 2) = arrUsers(u, 2) 
       ' Article number 
       tempArr(j, 3) = arrarticles(i, 1) 
       ' Article name 
       tempArr(j, 4) = arrarticles(i, 2) 
       ' Article price 
       tempArr(j, 6) = arrarticles(i, 3) 
      Next 
     Next 
     ' Finally add data to spreadsheet Summary 
     .Range("A2").Resize(j, 6).Value = tempArr 
    End If 
End With 

注意如何有三個For循環,這是一個有點太多對我來說,我認爲。我之前在這裏有過類似的線程在Stackoverflow和有人推薦我添加了另一個工作表,基本上覆制摘要工作表中的數據。這樣我就可以從最後的彙總表中清除數據。但我不明白爲什麼需要這樣做,我的意思是,我始終將彙總表中的所有數據保存在shtSummary中,它只是在Array中。但無論如何,這是相同的數據?

編輯:所以簡化這個東西的工作原理。重複每個項目在文章表中的每個用戶名。意思是,如果有10篇文章,請重複用戶名10次。文章可在文章頁面找到,用戶可在用戶表格中找到。但彙總表D列中的數據不是從另一張表中收集的,而是直接輸入彙總表。問題在於,如果我只是清空彙總表並從用戶和文章表中重新導入數據,數據就會丟失。原因很簡單(在上面的宏中完成)。它只是記住每個用戶的每個項目的數量數據,這就是問題所在。如果用戶ID「2」,articleNumber「452」在列D中的值爲2,那麼我想保留該值,並確保ColumnD中的值「2」粘貼到用戶標識「2」的行,articleNumber「452 」。

+0

嗨,文件似乎是從SkyDrive中消失了? – brettdj

+0

對不起,權限都是錯誤的,應該現在就工作吧! :) –

+0

這部分搞糊塗了:「但在同一時間,我想保持從列d的數據彙總表,以及」如果我們刪除的用戶 - 例如Ringo - 那麼應該將與該用戶有關的所有行(本例中爲行20-25)全部刪除,否則應刪除列D以外的所有行? – barrowc

回答

1

一個快速提示:在你的問題中,它表示數量在D列,但在你的示例文件中,它在E列,所以我將在使用列E引用該列時。

我同意的意見,認爲它可能是更容易的訪問做,但看到大多數用戶如何喜歡使用Excel,這裏是算法的我會用解決這個問題:

  • 複製列將(用戶ID),C(文章編號)和E(金額)到一個臨時片以保持量,所以我們可以將其添加回以後
  • 清除彙總表的內容(這是比手動檢查更容易哪些用戶和/或物品需要被刪除)
  • 使用兩個嵌套的for循環遍歷用戶和物品表內容並輸入所有COM用戶ID的binations(與相關聯的名稱)和第標識(與相關聯的名稱和價格)到列A,B,C和彙總表
  • 遍歷彙總表的F和查找在原始量臨時表使用用戶ID和文章ID作爲搜索鍵來填寫E欄

我希望這可以幫助,即使我沒有制定出確切的VBA代碼。如果您在代碼中需要幫助,請告訴我。