VBAを使用してエクセルの同じ内容のセルの行を合わせる方法

このQ&Aのポイント
  • エクセルで売上集計表を作成しており、同じ内容のセルの行を合わせる作業を毎日手動で行っています。VBAを使用してこの作業を自動化したいのですが、方法がわかりません。
  • 売上データをエクセルで集計した後、商品コード別に数量を入力し、同じ内容のセルの行を合わせる作業が必要です。現在は毎日手動で行っていますが、VBAを使ってこの作業を効率化したいです。
  • 売上集計表には商品コードが入力されており、毎日の売上データを商品コード別に入力しています。同じ商品コードの行の位置を合わせるために、空白のセルを挿入する作業が必要です。この作業をVBAで処理したいですが、方法が分かりません。
回答を見る
  • ベストアンサー

エクセル VBA 同じ内容のセルの行を合わせたい

売上集計表があり、A列に全商品のコードが表示されてます。 毎日の売上商品のデータを商品コード別に数量を入力して同じ内容のセルの行の位置を合わせる作業を毎日行っています。 毎日の売上データはエクセルで集計されたデータを貼り付けて行っています。これをなんとかVBAで処理したいのですが、どうしたらいいのかわかりません。 内容としてはA列に全商品の商品コードが既に入力されています。 月のはじめは、B列とC列に一日の集計データそのまま貼り付けます。 A列の商品コードと同じ商品コードの行に合うまで空白のセルを挿入していきます。 次の日は、D列とE列、その次はF列とG列と右に貼り付けしていきます。 商品コードは約3000件、毎日の集計データ数は約500件です。 どうか教えてください。 完成例)   A列   B列   C列     D列    E列       F列    G列   H列   I列 商品コード    10/1分        10/2分            10/3分       10/4分・・・続く        商品コード 数量   商品コード 数量      商品コード数量 CZ1.000  CZ1.000   10    CZ1.000   20 CZ1.005                                CZ1.010  15   ←セルの挿入で CZ1.010  CZ1.010   30                    CZ1.020 30    下げる作業を CZ1.015                                CZ1.030  10 毎日行ってます。 CZ1.020  CZ1.020   11   CZ1.020    20       CZ1.040  40 CZ1.025 CZ1.030  CZ1.030   11   CZ1.030    10 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • ki-aaa
  • ベストアンサー率49% (105/213)
回答No.1

こんにちわ 試してみて Sub 商品コード配置() Dim Dic商品コードと行 As Object Dim 配列商品コード数量, 編集前商品コード数量 Dim 最終行 As Long Dim i As Long, j As Long, k As Long Dim 商品コード As String Sheets("Sheet3").Activate '実際のシート名に変更 最終行 = Cells(Rows.Count, "A").End(xlUp).Row 配列商品コード数量 = Cells(3, "A").Resize(最終行 - 2, 1).Value Set Dic商品コードと行 = CreateObject("Scripting.Dictionary") For i = 1 To 最終行 - 2 Dic商品コードと行.Add 配列商品コード数量(i, 1), i Next i For i = (31 * 2) To 2 Step -2 '最大31日 一日二列 ReDim 配列商品コード数量(1 To 最終行 - 2, 1 To 2) k = Cells(Rows.Count, i).End(xlUp).Row If k > 2 Then 編集前商品コード数量 = Cells(3, i).Resize(k - 2, 2).Value For j = 1 To k - 2 商品コード = 編集前商品コード数量(j, 1) If 商品コード <> "" Then If Dic商品コードと行.exists(商品コード) Then 配列商品コード数量(Dic商品コードと行.Item(商品コード), 1) = 商品コード 配列商品コード数量(Dic商品コードと行.Item(商品コード), 2) = 編集前商品コード数量(j, 2) Else MsgBox "商品コード " & 商品コード & " に間違いがあります。" End If End If Next j Cells(3, i).Resize(最終行 - 2, 2).Value = 配列商品コード数量 End If Next i Set Dic商品コードと行 = Nothing End Sub

ryuu2101
質問者

お礼

すぐに回答いただきまして有難うございます。 やりたいことにも、コード違いの対処まで 考えていただき、大変助かりました。(^▽^)♪

その他の回答 (1)

  • mt2008
  • ベストアンサー率52% (885/1701)
回答No.2

3行の一番右に値がある列とその1つ左の列を対象に並び替えます。 あくまでもサンプルですのでエラー処理等は入れていません。あしからず。 Sub Sample()   Dim nData(), nPos()   Dim nRight, nDown, i      '3行目一番右の列を対象   nRight = Cells(3, Columns.Count).End(xlToLeft).Column   nDown = Cells(Rows.Count, nRight).End(xlUp).Row   ReDim nData(nDown - 3)   ReDim nPos(nDown - 3)   For i = 0 To (nDown - 3)     '移動先の行をワークシート関数のMatchで調べる     nPos(i) = WorksheetFunction.Match(Cells(i + 3, nRight - 1), Range("A:A"), 0)     nData(i) = Cells(i + 3, nRight)   Next i   '元のデータを消す   Range(Cells(3, nRight - 1), Cells(nDown, nRight)).ClearContents   For i = 0 To (nDown - 3)     '移動先に代入     Cells(nPos(i), nRight - 1) = Cells(nPos(i), 1)     Cells(nPos(i), nRight) = nData(i)   Next i End Sub

ryuu2101
質問者

お礼

ご回答いただき有難うございます。 やりたいことが、とても簡単に出来るようになりました。 大変、とっても助かりました。(^▽^)♪

関連するQ&A

  • EXCEL VBA について教えてください。

    EXCEL VBA について教えてください。 先ほど質問した内容ですが、補足ができなかったので、再度質問しています。 条件を満たす行をコピー(挿入)さらに(数量)を分割する場合 下記のデータで , (品名 ) , (数量) , (マスタ) , (A/B) , A , B , C , D 1 , 商品1 , 1000 , 2000 , 0.5 2 , 商品2 , 3000 , 1000 , 3 3 , 商品3 , 3000 , 2000 , 1.5 4 , , , , 5 , , , , 6 , , , , このように(数量)>(マスタ)の場合に(数量)/(マスタ)分を行コピー(挿入)して , (品名 ) , (数量) , (マスタ) , (B/C) , A , B , C , D 1 , 商品1 , 1000 , 2000 , 0.5 2 , 商品2 , 1000 , 1000 , 1.0 3 , 商品2 , 1000 , 1000 , 1.0 4 , 商品2 , 1000 , 1000 , 1.0 5 , 商品3 , 2000 , 2000 , 1 6 , 商品3 , 1000 , 2000 , 0.5 さらにB列の(数量)も(マスタ)以下になるように分割する。 単に行のコピーだけなら自分でもできるのですが。。。これはさっぱりです。 どうか教えてください。 また、データの位置が変わった場合、どこを修正すればよいでしょうか? 例) 品名:P列 数量:R列 マスタ:AR列 よろしくお願いします。

  • EXCEL VBA について教えてください。

    EXCEL VBA について教えてください。 条件を満たす行をコピー(挿入)さらに(数量)を分割する場合 下記のデータで , (品名 ) , (数量) , (マスタ) , (A/B) , A , B , C , D 1 , 商品1 , 1000 , 2000 , 0.5 2 , 商品2 , 3000 , 1000 , 3 3 , 商品3 , 3000 , 2000 , 1.5 4 , , , , 5 , , , , 6 , , , , このように(数量)>(マスタ)の場合に(数量)/(マスタ)分を行コピー(挿入)して , (品名 ) , (数量) , (マスタ) , (B/C) , A , B , C , D 1 , 商品1 , 1000 , 2000 , 0.5 2 , 商品2 , 1000 , 1000 , 1.0 3 , 商品2 , 1000 , 1000 , 1.0 4 , 商品2 , 1000 , 1000 , 1.0 5 , 商品3 , 2000 , 2000 , 1 6 , 商品3 , 1000 , 2000 , 0.5 さらにB列の(数量)も(マスタ)以下になるように分割する。 単に行のコピーだけなら自分でもできるのですが。。。これはさっぱりです。 どうか教えてください。

  • Excel VBA

    Excel VBAについて シート1にはデータが入ってます。 G列に日付、L列に商品名、N列に件数。 シート2には集計結果を入力したいです。 セルB2に、日付が10月1日から15日までで、商品名がAの件数の合計。 セルB3は、日付が10月16日から末日まで、セルB4は、日付が11月1日から15日までと半月毎に集計を半年後の末日まで繰返し、B2の数行下には、商品名Bの集計行を作り、その数行下には商品名Cの集計行を作りたいです。 これまでは関数SUMIFSで集計していましたが、複数店舗分のシートの更新・メンテナンスが大変なので、VBAでの集計を考えいろいろ調べてるのですが、方法が思い付かないので、ご教授ください。

  • EXCELで1行おきのセルの計算をしたいのですが?

    仕事で販売集計表を作成することになりました。 その集計表は、行方向に商品、列方向は日付毎に数量、金額となっています。 数量と金額の合計の欄を作らなければならないのですが、列方向がかなりの数になります。セルを金額だけを1つおきに指定していたら、あまり効率が良くないので、簡単に設定する方法をご存知の方がいらしたら是非教えてください。

  • エクセル 網掛けしてあるセルの行を残してそれ以外の行を削除するVBA

    windows-xp、エクセル2003を使っています。 エクセルデータがA列からU列まであります。 (1000件程かな、時々AA列まである時もあります) G列には、網掛けしてあるセルがあります。 そこで!! 網掛けしてあるセルの行だけを残して、網掛けがされていない行のデータを一気に削除する!というマクロ(VBA)を作りたいのですが、どうすればよいでしょうか? VBAまだ、よくわかっていないので、初心者レベルでわかりやすく教えてくださると助かります。 宜しくお願い致しますm(_ _)m

  • エクセル関数で行を抽出したいのですが…

    エクセルでsheet1にA2:AQ2034とデータがあります。 A列=コード(重複コードなし) B列=商品名(重複商品名なし) C~AQ=月々の売上(2003.1~2006.5までの月々売上) これをsheet2でA列、A1をタイトル行とし、A2以下にコードを入れると そのコードの行(B~AQ)が抽出されるようにしたいのですが、 関数でどのようにしたらいいでしょうか? ご教授お願いします。

  • Excelの行挿入で

    Excelのシートにデータがつまっているのですが(これから新しく表を作るということではないということです。)、行の挿入をしたいのです。 このとき、行を選択して、右クリックで「挿入」を選べば挿入自体はできます。 しかし、 既にある表は、行が、A列とB列が結合されているのですが、 単に上記のように挿入すると、 A列B列が分かれている行が挿入されてしまいます。 新しく挿入された行のA列とB列を選択して、「セルの書式設定」の「配置」でセルを結合させてもいいのですが、 いちいちそうしなくても 挿入時点ですでに結合されているようにするにはどうすればよいですか。 (Excel2000)

  • 日付から特定の行のセル内データを取得したい。

    列に日付、行に時間を入力データの内容は商品の販売個数です。 要するに日付毎の時間別販売数を調べたいのですが、 列の日付の下に各品名を数項目並べております。 この様なデータを個人別のシートで入力しています。 行いたい事は、そのデータを別シートで日付毎に参照したいのです。 あるセルに18と入力すれば、18日分の売り上げデータを一枚のシートに表示させたいのです。 これが一商品だけの集計なら「HLOOKUP」関数で普通に参照できるのですが、列に日付と商品、行に時間を入れているためどの様に参照すればよいのか判りません。 =HLOOKUP(A1,'名前'!A3:AF20,6,0) コレではその日の一番左の列の商品データしか参照できませんでした。 日付を入力するだけで複数の商品を時間帯毎に参照出来るような上手いやり方はありませんでしょうか? 宜しくお願い致します。

  • 行を挿入するVBAコードを教えてください

    日々の予定を記録・集計しています。 A列に用事のタイトル B列に開始日 C列に開始時 D列に終了日 E列に終了時 の記載されているエクセルシートがあります。 睡眠が0時を過ぎて日を跨いでしまいますので、週別、月別に集計する際に、正確なデータがでません。 正確に集計するために、開始日B列と終了日D列が一致していない場合、 行を挿入して、もとの行は0時で終了させ、挿入行は0時開始にすることで、日別ごとに正確に集計したいです。 ※一つのタスクが2日以上にまたがることはありえないので想定しないでください VBAコードをおしえていただけないでしょうか。 よろしくお願いします

  • エクセル2003 VBAで セル内を 一発呼び出し

    エクセル2003 オートフィルタではなく VBAで セル内を 一発呼び出ししたいので。  よろしく お願いします。 表 列A~E(結合2行) :商品名と内容   列H~K(結合2行) 住所氏名電話番号を記載してます。 1年分を オートフィルターで  氏名 や 商品名で 探すのは 結構 時間がかかります。 同じものが ほぼ少ないため。。。 そこで  たまに 同じ氏名  同じような 品を 検索する セルを 2個ほど作って  そこへ セル1へ 商品名を入力すると  該当する 行のみ 表示される。 セル2に 名前をを入力すると  該当する 行のみ 表示される。 また、セルを赤色に塗った部分の結合行(2~3行)を 赤色に塗りつぶした行のみ 表示も できれば うれしいです。 コマンドボタン等を使ってもいいので お願いします。 そんな VBAを 作っていただけませんでしょうか^^; お手数おかけしますが どなたか よろしく お願いします。 

専門家に質問してみよう