[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『表の作成方法』(初心者)
表を作成する方法。
材料表を作成するように上司に頼まれました。
もとの表は色々データが入っているのですが
A列→商品名
K列→材料(01たまご、11お米、91ソース・・・)
(今、200種類くらいの材料が入力されています。
材料の前の数字は項目番号です。調味料は90番台など)
この二つのデータを2種類の表にしたいのです。
新しくシートを作成し、
(商品ごと)シート
A列→商品名をあいうえお順に
B列以降→材料名をあいうえお順で材料分のセルを作成する。
商品名の入力されている行が該当があれば(〇)を入力。
(材料ごと)シート
A列→材料名あいうえお順に
B列以降→商品名をあいうえお順に
材料の入力されている行が該当があれば(〇)を入力。
関数やピポットテーブル?を使えば作れるのでしょうか?
さっぱりわからずに、今一個ずつ見ながら転記しているのですが
訳が分からなくなってきていて困っています。
どなたか、アドレス頂けますか?
よろしくお願いいたします。
< 使用 Excel:Excel2010、使用 OS:Windows10 >
説明だけではぼんやりなので、具体的な例をあげてもらえますか? (コナミ) 2019/03/05(火) 12:45
「元シート」
A列/K列 1/商品名/材料 2/目玉焼き/22卵、92塩 3/アイス/23牛乳、21砂糖 4/カップケーキ/01小麦粉、21砂糖、31バター
「商品ごとシート」
A列/B列/C列/D列。。。。 1/商品名/01小麦粉/21砂糖/22卵/。。。。 2/アイス//〇//。。。 3カップケーキ/◯/◯//。。。 4目玉焼き///◯/。。。
「材料ごとシート」
A列/B列/C列/D列。。。。
1/材料名/アイス/カップケーキ/目玉焼き/。。。。
2/01小麦粉//◯//。。。
3/21砂糖/◯/◯//。。。
4/22卵//◯/◯//。。。
こんな感じで大丈夫でしょうか?
(初心者) 2019/03/05(火) 13:07
シート名:元 A K 1 商品名 材料 2 目玉焼き 22卵、92塩 3 アイス 23牛乳、21砂糖 4 カップケーキ 01小麦粉、21砂糖、31バター
シート名:商品 A B C D 1 商品名 01小麦粉 21砂糖 22卵 2 アイス 3 カップケーキ 4 目玉焼き
シート名:材料 A B C D 1 材料名 アイス カップケーキ 目玉焼き 2 01小麦粉 3 21砂糖 4 22卵
商品シートのB2:=IF(SUMPRODUCT((元!$A$2:$A$4=$A2)*ISNUMBER(FIND(B$1,元!$K$2:$K$4))),"○","") 右方向と下方向にコピー
材料シートのB2:=IF(SUMPRODUCT(ISNUMBER(FIND($A2,元!$K$2:$K$4))*(元!$A$2:$A$4=B$1)),"○","") 右方向と下方向にコピー
$A$2:$A$4などは実際のデータ範囲に変えてください。 (bi) 2019/03/05(火) 13:34
Sub データ整理()
Dim tmp As Variant Dim i As Long, cnt As Long, col As Long Dim c As Range Dim hani As String
Application.ScreenUpdating = False
Sheets.Add After:=Sheets(Sheets.Count) ActiveSheet.Name = "作業シート"
With Sheets("作業シート") Sheets("元").Columns("K").Copy .Columns("A") col = 2 For r = 2 To .Cells(.Rows.Count, 1).End(xlUp).Row tmp = Split(Cells(r, 1).Value, "、") For i = LBound(tmp) To UBound(tmp) Cells(r, col).Value = tmp(i) col = col + 1 Next i col = 2 Next r .Columns("A").ClearContents hani = .Range("B2").CurrentRegion.Address For Each c In .Range(hani) If c <> "" Then cnt = cnt + 1 .Cells(cnt, "A") = c End If Next c .Range(.Columns(2), .Columns(300)).ClearContents .Columns("A:A").Range("$A$1:$A$" & .Cells(.Rows.Count, 1).End(xlUp).Row).RemoveDuplicates Columns:=1, Header:=xlNo .Columns("A").Sort key1:=.Range("A1"), Order1:=xlAscending End With
Application.ScreenUpdating = True
End Sub
作業シートに材料名の一覧が出るようになっています。 作業シートのA列をコピーして行列入れ替えで貼り付けてください。 ちなみにこのコードは私が一から考えたものではなくネットから情報を拾ってきて一部加工したものです…。
コード内容はこちらを参考にさせていただきました。 http://officetanaka.net/excel/vba/tips/tips62.htm https://oshiete.goo.ne.jp/qa/9285234.html (bi) 2019/03/05(火) 17:10 修正17:19
'元データはSheet1にある前提 '材料の区切り文字は "、" Dim ast As Worksheet, sht As Worksheet, dic As Object, c As Range, i As Long Set ast = Sheets("Sheet1") For Each sht In Worksheets If sht.Name = "商品ごと" Or sht.Name = "材料ごと" Then Application.DisplayAlerts = False: sht.Delete Next sht Set dic = CreateObject("Scripting.Dictionary") Sheets.Add after:=ast ActiveSheet.Name = "商品ごと" Sheets.Add after:=ast ActiveSheet.Name = "材料ごと" For Each c In ast.Range("A1:A" & Rows.Count).SpecialCells(2) Sheets("商品ごと").Range("A" & Rows.Count).End(xlUp).Offset(1).Value = c.Value For i = 0 To UBound(Split(c.Offset(, 10).Value, "、")) dic(Split(c.Offset(, 10).Value, "、")(i) & Chr(2) & c.Value) = True If Sheets("材料ごと").Range("A:A").Find(Split(c.Offset(, 10).Value, "、")(i), , , xlWhole) Is Nothing Then Sheets("材料ごと").Range("A" & Rows.Count).End(xlUp).Offset(1).Value = Split(c.Offset(, 10).Value, "、")(i) End If Next i Next c With Sheets("材料ごと").Sort .SortFields.Add Key:=Sheets("材料ごと").Range("A1") .SetRange Sheets("材料ごと").Range("A2:A" & Rows.Count) .Apply End With With Sheets("商品ごと").Sort .SortFields.Add Key:=Sheets("商品ごと").Range("A1") .SetRange Sheets("商品ごと").Range("A2:A" & Rows.Count) .Apply End With Sheets("材料ごと").Range("A:A").SpecialCells(2).Copy Sheets("商品ごと").Range("B1").PasteSpecial , Transpose:=True Sheets("商品ごと").Range("A:A").SpecialCells(2).Copy Sheets("材料ごと").Range("B1").PasteSpecial , Transpose:=True For Each c In Sheets("材料ごと").Range("A1").CurrentRegion.SpecialCells(4) If dic(c.EntireRow.Cells(1) & Chr(2) & c.EntireColumn.Cells(1)) = True Then c.Value = "○" Next c For Each c In Sheets("商品ごと").Range("A1").CurrentRegion.SpecialCells(4) If dic(c.EntireColumn.Cells(1) & Chr(2) & c.EntireRow.Cells(1)) = True Then c.Value = "○" Next c End Sub (mm) 2019/03/05(火) 18:13
mmさまもありがとうございます。
一回で表が作成されて感動しました!
一点教えていただきたいのですが、表を作成すると商品名と材料名も一緒に作成されるのですが
商品名と材料名を除いた表にすることはできますか?
とっても簡単にできる様になったので、このままでも全然大丈夫です。
もし、除けそうであればお願いいたします。
(初心者) 2019/03/06(水) 10:31
'元データはSheet1にある前提 Dim ast As Worksheet, sht As Worksheet, dic As Object, c As Range, i As Long Set ast = Sheets("Sheet1") For Each sht In Worksheets If sht.Name = "商品ごと" Or sht.Name = "材料ごと" Then Application.DisplayAlerts = False: sht.Delete Next sht Set dic = CreateObject("Scripting.Dictionary") Sheets.Add after:=ast ActiveSheet.Name = "商品ごと" Sheets.Add after:=ast ActiveSheet.Name = "材料ごと" For Each c In ast.Range("A1:A" & Rows.Count).SpecialCells(2) Sheets("商品ごと").Range("A" & Rows.Count).End(xlUp).Offset(1).Value = c.Value For i = 0 To UBound(Split(c.Offset(, 10).Value, "、")) dic(Split(c.Offset(, 10).Value, "、")(i) & Chr(2) & c.Value) = True If Sheets("材料ごと").Range("A:A").Find(Split(c.Offset(, 10).Value, "、")(i), , , xlWhole) Is Nothing Then Sheets("材料ごと").Range("A" & Rows.Count).End(xlUp).Offset(1).Value = Split(c.Offset(, 10).Value, "、")(i) End If Next i Next c With Sheets("材料ごと").Sort .SortFields.Add Key:=Sheets("材料ごと").Range("A1") .SetRange Sheets("材料ごと").Range("A2:A" & Rows.Count) .Apply End With With Sheets("商品ごと").Sort .SortFields.Add Key:=Sheets("商品ごと").Range("A1") .SetRange Sheets("商品ごと").Range("A2:A" & Rows.Count) .Apply End With Sheets("材料ごと").Range("A:A").SpecialCells(2).Copy Sheets("商品ごと").Range("B1").PasteSpecial , Transpose:=True Sheets("商品ごと").Range("A:A").SpecialCells(2).Copy Sheets("材料ごと").Range("B1").PasteSpecial , Transpose:=True For Each c In Sheets("材料ごと").Range("A1").CurrentRegion.SpecialCells(4) If dic(c.EntireRow.Cells(1) & Chr(2) & c.EntireColumn.Cells(1)) = True Then c.Value = "○" Next c For Each c In Sheets("商品ごと").Range("A1").CurrentRegion.SpecialCells(4) If dic(c.EntireColumn.Cells(1) & Chr(2) & c.EntireRow.Cells(1)) = True Then c.Value = "○" Next c
Sheets("商品ごと").Rows(1).ClearContents '追加 Sheets("商品ごと").Columns(1).ClearContents '追加 Sheets("材料ごと").Rows(1).ClearContents '追加 Sheets("材料ごと").Columns(1).ClearContents '追加
End Sub
(mm) 2019/03/06(水) 11:06
→ こちらの環境(2007)では再現しませんので対応できません。すみません。
(mm) 2019/03/06(水) 13:15
シート名:sheet1 A K 1 商品名 材料 2 目玉焼き 22卵、92塩 3 アイス 23牛乳、21砂糖 4 カップケーキ 01小麦粉、21砂糖、31バター シート名:商品ごと A B C D E 1 01小麦粉 21砂糖 22卵 材料 2 アイス 3 カップケーキ 4 目玉焼き 5 商品名 ◯ シート名:材料ごと A B C D E 1 アイス カップケーキ 目玉焼き 商品名 2 01小麦粉 3 21砂糖 4 22卵 5 材料 ◯
恐らく
For Each c In ast.Range("A1:A" & Rows.Count).SpecialCells(2)
の部分を
For Each c In ast.Range("A2:A" & Rows.Count).SpecialCells(2)
にすればうまく行くと思うのですが如何でしょうか?
(みろく) 2019/03/06(水) 20:30
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.