2011-10-21 14 views
1

私は3つの範囲(シート)を横断し、前後にデータをチェックする際に助けが必要です。しかし、これらのForループは私を殺している..私にとっては3ループが多すぎるし、コードを論理的にどのように拡散するのかも分からない。Excel vba - 3つの範囲を比較

自分のバリアントの配列に及ぶ:

  • 概要
  • ユーザー
  • 記事

私はオンライン表示には、ここにシートを持っています。それをダウンロードする必要はありません。要約シートが空の場合、データを収集するマクロコードがあります。そしてこれはそれがやるべきこととして働いています。 https://skydrive.live.com/view.aspx?cid=5D018DB0458F03ED&resid=5D018DB0458F03ED%21164

スプレッドシートは、その中にいくつかのノルウェーの言葉がありますが、それはあまり重要ではないはず:)それは基本的にOppsummering(概要)、Brukere(ユーザー)とArtikler(関連記事)です。

とにかく、要約シートに記事がある回数だけ各ユーザーが含まれていることを確認したいと思います。基本的にはミラーリングされているはずです。ユーザーシートから行(名前)を削除した場合は、その行も[概要]シートから削除する必要があります。しかし同時に、要約シートの列Dのデータも保持したいと考えています。ですから、私はそのデータをユーザーIDとアーティクルIDとともに保管して、列Dのデータが正しい場所にあることを確認する必要があります。あるループの場合3、それは私が思う私のために少しあまりにも多くのですか

それが今であるように、これは私の(悪い)コード..です

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 

お知らせ..私はここの前に同様のスレッドを持っていました私は別のシートを追加して基本的に要約シートからデータをコピーすることをお勧めしました。そうすれば、最後に要約シートからデータを消去することができます。しかし、なぜ私はそれをする必要があるのか​​わかりません。とにかく、サマリーシートのすべてのデータをshtSummaryに保存しています。それはちょうどArray内にあります。とにかくそれは同じデータですか?

編集:このことがどのように機能するかを簡略化します。記事の各項目のユーザー名を繰り返してください。意味は、記事が10件ある場合は、ユーザー名を10回繰り返します。記事は記事のシートにあり、ユーザーはユーザーのシートにあります。しかし、要約シートの列Dのデータは別のシートから収集されず、要約シートに直接入力されます。要約シートを空にして、ユーザーと記事のシートからデータを再インポートするだけで、データが失われるという問題があります。原因は簡単です(上記のマクロで行います)。問題の各ユーザーの各アイテムの金額データを覚えているだけです。ユーザID「2」、articleNumber「452」の値が列Dにある場合、その値を保持し、ColumnDの値「2」がuserID「2」の行に「接着」されていることを確認します。 "

+0

こんにちは、ファイルはskydriveから消えたようですか? – brettdj

+0

申し訳ありませんが、許可はすべて間違っていました。 :) –

+0

この部分は私を混乱させました。「同時に、D列のデータも要約シートに保存したい」ユーザーを削除した場合(例: Ringo - そのユーザーに関連するすべての行(この場合は20〜25行)を完全に削除するか、列D以外のすべてを削除する必要がありますか? – barrowc

答えて

1

あなたの質問には、その量は列Dにありますが、サンプルファイルでは列Eに入っていたため、その列を参照するときに列Eを使用します。

  • コピー列A:

    が、私はAccessで行うことは、おそらくより簡単であることを、コメントに同意するが、ほとんどのユーザーはExcelを使用するのが大好きどのように見て、ここで私はこの問題を解決するために使用するアルゴリズムがあります(ユーザーID)、C(品目ID)、E(金額)を一時的なシートに保存して金額を保存して後で追加できるようにします。

  • 要約シートの内容を消去します/または記事を削除する必要があります)
  • 2つのネストされたfor-loopsを使用してユーザーおよび記事シートの内容を繰り返し、すべてのcomサマリーシートの列A、B、C、FにUser ID(関連付けられた名前)とアーティクルID(関連する名前と価格が含まれます)を埋め込みます。
  • 要約シートを繰り返して、ユーザIDと記事IDを検索キーとして使用して一時的なシートを記入してください。

私は正確なVBAコードを解決できませんでしたが、コード内に援助が必要な特定の部分がある場合は、私に教えてください。

関連する問題