0

私の目標:同じ行の複数のレポート (既に同じスプレッドシート内) から同じ件名に関するすべてのデータを取得すること。

とりとめのないバックストーリー:毎月、さまざまな長さの複数のレポートが (列ごとに) 並べられた新しいデータダンプ Excel スプレッドシートを受け取ります。これらのレポートのほとんどは、重複する主題を持っていますが、完全ではありません。幸いなことに、彼らが同じ話題について話しているときは、数字で示されます。この番号タグは、常に各レポートの先頭の最初の列です。ただし、レポートの長さが可変であるため、同じ件名が同じ行にあるわけではありません。数字の列がシフトすることはなく (report1 の数字は常に列 A、report2 の数字は常に列 G など)、数字は常に昇順です。

私の目標の解決策: 昇順の列は変わらないため、(たとえば) アクティブなデータ行の数を列 A の列 G と比較するマクロの VBA コードを記述しようとしています。そうでなければ、その行 (およびその下) のすべてのデータを列 G:J から 1 行下に移動します。次に、次のデータ行に進みます。

私は試しました:いくつかの "For Each" と、DataRow + 1 を使用したいくつかのループを作成し、比較を行うと思われるものを呼び出しましたが、それらはすべて惨めに失敗しました。構文が間違っているだけなのか、コンセプトが間違っているのかわかりません。また、私の検索のどれも、この問題、または私が略奪して一緒に石畳にすることができるその部分さえも発見しませんでした. それは私のグーグルスキルを反映したものかもしれませんが:)

ありとあらゆる助けをいただければ幸いです。

注: 重要な場合のために、列にはヘッダーがあります。回避するために DataRow = Found.Row + 1 を使用しています。さらに、私はこれに非常に慣れておらず、独学なので、お気軽に詳細に説明してください

4

1 に答える 1

1

私はあなたの目的を理解していると思います。これはうまくいくはずです。説明を読んでいるときに使用していた方法論は使用されていません。続行する方法がよくわかりました。それが私の謝罪を探しているものではない場合。

定義済みの列 (FIRST_ROW 定数を参照) から開始し、2 つのセル (MAIN_COLUMN と CHILD_COLUMN) を比較して行ごとに移動します。MAIN_COLUMN < CHILD_COLUMN の場合、SHIFT_START と SHIFT_END の間のすべてが 1 行下にプッシュされます。空の行に到達するまで続行します。

Sub AlignData()
  Const FIRST_ROW As Long = 2       ' So you can skip a header row, or multiple rows
  Const MAIN_COLUMN As Long = 1     ' this is your primary ID field
  Const CHILD_COLUMN As Long = 7    ' this is your alternate ID field (the one we want to push down)
  Const SHIFT_START As String = "G" ' the first column to push
  Const SHIFT_END As String = "O"   ' the last column to push

  Dim row As Long
  row = FIRST_ROW
  Dim xs As Worksheet
  Set xs = ActiveSheet
  Dim im_done As Boolean
  im_done = False
  Do Until im_done
    If WorksheetFunction.CountA(xs.Rows(row)) = 0 Then
      im_done = True
    Else
      If xs.Cells(row, MAIN_COLUMN).Value < xs.Cells(row, CHILD_COLUMN).Value Then
        xs.Range(Cells(row, SHIFT_START), Cells(row, SHIFT_END)).Insert Shift:=xlDown
        Debug.Print "Pushed row: " & row & " down!"
      End If
      row = row + 1
    End If
  Loop
End Sub

マクロとして機能するようにコードを修正しました。マクロダイアログから直接作成して、そこからも実行できるはずです。コードを貼り付けて、SubEnd Subの行が重複しないようにします。ワークシート名を受け入れなくなりましたが、代わりに現在アクティブなワークシートに対して実行されます。

于 2012-09-12T16:49:36.060 に答える