• ベストアンサー

エクセルの抽出?のマクロ作成について

こんばんは、じつはエクセルでどうしても整理したい事項がありましてどうやらマクロでやらないとすごい時間かかりそうなもので、是非ともお教えいただきたいのですが(VBAはほとんど初心者です^^;;) 例えば ガンダムのおもちゃが置いてある店のリストのシートと ルパンのおもちゃが置いてある店のリストのシートと ドラクエのおもちゃが置いてある店のリストのシートの3つのシートを手に入れている場合に ガンダムは a,b,c,dの4店にあり ルパンは b,c,d,e の4店にあり ドラクエは d,eの2店にあるようなばあいに a店 ガンダム b ガンダム ルパン c ガンダム ルパン d ガンダム ルパン ドラクエ e ルパン ドラクエ というようにわかりやすくどのおもちゃはどこに何種類おいているかの表をつくりたいのですが、どのようにマクロを作成したらよいのでしょうか?? 是非お教えいただけると幸いです。よろしくお願いします。

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

  • ベストアンサー
  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.4

本件の質問例は「例え話し」のようですが、 質問がエクセルシートに即して具体的でないので、VBAコードを挙げても、ご質問者が自分の実際のケースに合わせて修正可能する力があるかどうか心配です。 (データ)各シートのA1以下に、同一フォーマットで Sheet1に A列   B C D E ガンダム a b c d Sheet2に A列   B C D E ルパン b c d e Sheet3に A列   B C D E ドラクエ d e (ロジック) (A)各シートを1シートに集める。手動で貼りつけが簡単ですが、シート数が多いと仮定してVBAでやる。 (B)これをガンダム-a,ガンダム-b・・・のように 玩具-販売店の2項目の組み合わせ行に分解する。 A列玩具、B列販売店になる。 (C)それを販売店をキーにして、並び替える   これで1つの販売店の玩具の行は固まった行になる。 (D)この販売店では多数行を販売店をA列、玩具をB、C、D・・列にならべ、1行内に並べる (Sheet1) 玩具 販売店 ガンダム a b c d ゴジラ c a (Sheet2) 玩具 販売店 ルパン b c d e キメラ f a リカ d b a (Sheet3) 玩具 販売店 ドラクエ d e f パンチ g c ポケモン f a モンスタ d b (Sheet4)Sheet1-Sheet3を1シートに集めた ガンダム a b c d ゴジラ c a ルパン b c d e キメラ f a リカ d b a ドラクエ d e f パンチ g c ポケモン f a モンスタ d b (Sheet5)玩具と店に分解 ガンダム a ガンダム b ガンダム c ガンダム d ゴジラ c ゴジラ a ルパン b ルパン c ルパン d ルパン e キメラ f キメラ a リカ d リカ b リカ a ドラクエ d ドラクエ e ドラクエ f パンチ g パンチ c ポケモン f ポケモン a モンスタ d モンスタ b (Sheet5(2))手動でB列をキーにしてソート ゴジラ a キメラ a リカ a ポケモン a ガンダム b ルパン b リカ b モンスタ b ガンダム c ゴジラ c ルパン c パンチ c ガンダム d ルパン d リカ d ドラクエ d モンスタ d ルパン e ドラクエ e キメラ f ドラクエ f ポケモン f パンチ g (Sheet6)望みの表に再編成 a ガンダム ゴジラ キメラ リカ ポケモン b ガンダム ルパン リカ モンスタ c ガンダム ゴジラ ルパン パンチ d ガンダム ルパン リカ ドラクエ モンスタ e ルパン ドラクエ f キメラ ドラクエ ポケモン g パンチ (VBAコード) 1シートに統合 Sub test01() Dim sh As Worksheet j = 1 For Each sh In ActiveWorkbook.Worksheets If sh.Name = "Sheet4" Then GoTo p01 d = sh.Range("A65536").End(xlUp).Row For i = 2 To d sh.Cells(i, "A").EntireRow.Copy Worksheets("Sheet4").Cells(j, "A").PasteSpecial j = j + 1 Next i p01: Next End Sub 玩具と店の行に分解 Sub test02() Dim sh1 As Worksheet Dim sh2 As Worksheet Set sh1 = Worksheets("sheet4") Set sh2 = Worksheets("sheet5") k = 1 d = sh1.Range("A65536").End(xlUp).Row For i = 1 To d For j = 2 To 250 If sh1.Cells(i, j) = "" Then Exit For sh2.Cells(k, "A") = sh1.Cells(i, "A") sh2.Cells(k, "B") = sh1.Cells(i, j) k = k + 1 Next j Next i End Sub 店別に並べ替え後 玩具-店の行から店-玩具(複数列)に組替え。 Sub test03() Dim sh1 As Worksheet Dim sh2 As Worksheet Set sh1 = Worksheets("Sheet5 (2)") Set sh2 = Worksheets("Sheet6") k = 1: j = 2 d = sh1.Range("A65536").End(xlUp).Row m = sh1.Cells(1, "B") For i = 1 To d If sh1.Cells(i, "B") = m Then Else k = k + 1 j = 2 m = sh1.Cells(i, "B") End If sh2.Cells(k, "A") = sh1.Cells(i, "B") sh2.Cells(k, j) = sh1.Cells(i, "A") j = j + 1 Next i End Sub

souko1souko1
質問者

お礼

すごく色々考えてもらえたようで恐縮ですm( )m しかしこちらの説明不足でお教えしてもらった形式とはちょっと違うのですが、これからお教えしてもらった式も参考にしながら再度自分でも考えていきたいとおもいます ご回答ありがとうございます^^

その他の回答 (3)

回答No.3

とりあえず、作ってみました。 前提条件として、シートは「ガンダム」「ルパン」「ドラクエ」となっていて、最後にまとめるための「shops」というシートがあるとします。 「ガンダム」「ルパン」「ドラクエ」はA1セルから、下に向かって、 a b c d と順に店の名前が入っているものとします。途中に空欄は許されません。 で、以下のマクロを使用します。 Sub shop() Dim S(20, 20) As Integer Dim WN(20) As String Dim A As String Dim SMax As Integer Dim WMax As Integer Dim i As Integer Dim j As Integer WMax = Worksheets.Count - 1 For i = 1 To WMax Worksheets(i).Activate WN(i) = ActiveSheet.Name For j = 1 To 20 A = Worksheets(i).Cells(j, 1).Value If A = "" Then Exit For S(i, Asc(A) - 96) = 1 If SMax < (Asc(A) - 96) Then SMax = Asc(A) - 96 Next Next Worksheets("shops").Activate Range("A2").Activate For i = 1 To SMax Cells(i + 1, 1).Value = Chr(96 + i) For j = 1 To WMax If S(j, i) = 1 Then Cells(i + 1, j + 1).Value = WN(j) End If Next j Next i End Sub とりあえず、 a ガンダム b ガンダム ルパン c ガンダム ルパン d ガンダム ルパン ドラクエ e      ルパン ドラクエ となるはず。。

souko1souko1
質問者

お礼

すごい長い式をかんがえてくださってありがたいですm( )m だいたい仮定のとうりのシートなのですが実はもうちょっといろいろしたいところがありまして・・・。 doragonさんの式を参考にもうちょっと勉強してみたらできそうな感じがします! ご回答ありがとうございました^^

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.2

一応、作ってみました。 シート名がガンダム、ルパン、ドラクエとなっていて 各シートのA列 店名 a b c のような感じで書かれていることを想定しています。 統合シートに結果を書き込みます 店名のリストは、必要によりソートして下さい。 Public Sub まとめる() Dim list, hasList() Dim x, i As Integer, j, k As Integer Dim base As Range Dim sheetArray Set list = CreateObject("Scripting.Dictionary") list.CompareMode = vbTextCompare '大文字小文字、全角半角、カナひらを区別しない sheetArray = Array(Sheets("ガンダム"), Sheets("ルパン"), Sheets("ドラクエ")) ReDim hasList(UBound(sheetArray)) '集計 For i = 0 To UBound(sheetArray) Set hasList(i) = CreateObject("Scripting.Dictionary") Set base = sheetArray(i).Range("A2") '項目名があるので、その次から(A列に)店名が入っている j = 0 Do While base.Offset(j).Value <> "" If Not list.Exists(base.Offset(j).Value) Then list.Add base.Offset(j).Value, base.Offset(j).Value '店リスト作成 hasList(i).Add base.Offset(j).Value, True '商品毎の店リスト作成、ダブりは無いことが前提 j = j + 1 Loop Next '集計結果の表示 Sheets("統合").Cells.ClearContents Set base = Sheets("統合").Range("A1") j = 0 base.Offset(j).Value = "店名": j = j + 1 For Each x In list.keys base.Offset(j, 0).Value = list.Item(x) '店名 k = 0 For i = 0 To UBound(sheetArray) If hasList(i).Exists(x) Then 'その商品の店名リストにある? base.Offset(j, 1 + k).Value = sheetArray(i).Name k = k + 1 End If Next j = j + 1 Next End Sub

  • helonpa
  • ベストアンサー率38% (108/278)
回答No.1

どの程度の量があるリストなのか、シートは更新されるのかなどよく分からないのであれですが、 全部のシートを1つにまとめ、全行の先頭に店名を加え、店名で並べ替えたら如何ですか。

souko1souko1
質問者

お礼

じつはその方法でもやってみたのですがいまひとつスッキリ表示ができなかったもので・・・ ご回答ありがとうございました。

関連するQ&A