- ベストアンサー
表から別シートに一覧表を作成したいのですが
Excel2003にて複数店舗のシフト管理をしているのですが、 初心者のうえ独学で学んだ為全く分かりません。 縦に日付、横に人が並んでいる表といえば分かりますか? A1="日"、A2=1、A3=2… B1="佐藤"、B2="山田"、B3="鈴木" その交点にその人が行く店舗名が表示されている表を作成しています。 日 佐藤 山田 鈴木 1 A店 B店 2 C店 A店 そのデータから、 日付 応援に行く人 応援をもらう店舗 1 佐藤 A店 1 山田 B店 2 佐藤 C店 2 鈴木 A店 の様な表に変換しています。今までは手入力で変換していたため、 ミス等がないかチェックが大変で困っています。 何か良い方法がありましたら教えてください。 質問も初めてで分かりにくい所があるかもしれませんが よろしくお願いします。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
Sheet1に次の様式の元データ 日 佐藤 山田 鈴木 1 A店 B店 2 C店 A店 があり、Sheet1に何らかのデータ変更をした際、直ちに Sheet2に 日付 応援に行く人 応援をもらう店舗 1 佐藤 A店 1 山田 B店 2 佐藤 C店 2 鈴木 A店 の様式で表が自動更新される方法を提案します。 シート名「Sheet1」を右クリック→コード表示(V)にて、次のコードをコピー&ペースト、「×」クリックですべて完了。 あとは、Sheet1への入力操作だけです。 Private Sub Worksheet_Change(ByVal Target As Range) Sheets("Sheet2").Cells.ClearContents Sheets("Sheet2").Cells(1, 1).Value = "日付" Sheets("Sheet2").Cells(1, 2).Value = "応援に行く人" Sheets("Sheet2").Cells(1, 3).Value = "応援をもらう店舗" r2 = 1 For r = 2 To Range("A65536").End(xlUp).Row For c = 2 To 256 If Cells(r, c) <> "" Then r2 = r2 + 1 Sheets("Sheet2").Cells(r2, 1).Value = Sheets("Sheet1").Cells(r, 1) Sheets("Sheet2").Cells(r2, 2).Value = Sheets("Sheet1").Cells(1, c) Sheets("Sheet2").Cells(r2, 3).Value = Sheets("Sheet1").Cells(r, c) End If Next c Next r End Sub
その他の回答 (4)
- pc_knight
- ベストアンサー率66% (52/78)
ANo.2です。E-XCELさんのご質問の内容からは外れますが、少しでもシフト管理業務の省力化とミス防止のため、"Sheet1"への店舗名入力をリスト入力できるようにしたらいかがでしょう。 次のコードを前回答のコードの末尾または頭に追加すれば、セルに表示されたドロップダウンリストから店舗名を選択するだけで店舗名が入力され、キーボードからの入力が不要になります。 6行目の「Formula1:="A店,B店,C店"」にて店舗名を指定しています。実際の店舗名に要書き換えです。 これにより、店舗名を入力すべき任意のセルを選択したとき、そのセルにドロップダウンリストがセットされます。 Private Sub Worksheet_SelectionChange(ByVal Target As Range) If Target.Row >= 2 And Target.Column >= 2 Then Target.Validation.Delete Target.Validation.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:=xlBetween, _ Formula1:="A店,B店,C店" End If End Sub
お礼
アドバイスありがとうございます。 入力も省力化することが出来効率UP出来そうです。 今までは、ただ打ち込んで表にすることしか出来ませんでしたが、 色々とプログラムすることで何倍も時間が短縮することが わかりました。 参考のページもよくまとまっていて、とても重宝しています。 本当にありがとうございました。
- pc_knight
- ベストアンサー率66% (52/78)
ANo.2回答の解説(字数制限のため簡略) (1)Private Sub Worksheet_Change(ByVal Target As Range) →セルの内容が“変更”された時、次行以降の処理を行うことを宣言。処理とは、”Sheet1”のデータ変更を基に”Sheet2”の様式の表を作成することで、(2)~(16)行の記述で定義されます。 (2)Sheets("Sheet2").Cells.ClearContents → "Sheet2"の内容をすべてクリアー。 (6)r2 = 1 → 書き込むべき"Sheet2"のセルの行番号を指定する変数、初期値“1”を代入 (7)For r = 2 To Range("A65536").End(xlUp).Row →”r”は"Sheet1"の基データの行No.を指定する変数、2から最終データ行まで順次、行No.の取得を行う (8)For c = 2 To 256 → ”c”は"Sheet1"の基データの列No.を指定するための変数、2から最終列である256まで順次取得を行う (9)If Cells(r, c) <> "" Then → "Sheet1"のr行c列のデータが“空白”以外、即ちデータがあるなら(10)~(13)の処理(="Sheet2"への転記)を行う。 (10)r2 = r2 + 1 → "Sheet2"への書き込み行No.を+1する。 (11)Sheets("Sheet2").Cells(r2, 1).Value = Sheets("Sheet1").Cells(r, 1) → "Sheet1"の1列目の日付データを"Sheet2"の1列目”日付”欄に転記 (15)Next c → cを+1して(8)にもどる。 (16)Next r → rを+1して(7)にもどる。 (17)End Sub → 最終行データまですべての処理終了宣言。 VBAの一般知識の学習は、参考URL欄の「Let's Excel VBA 第一章 VBAを始める準備 」などでの学習がお薦めです。
[ANo.1この回答へのお礼]に対するコメント、 》 関数について分かり易く書かれている本などありましたら教えてく 》 ださい 「本」を全く読まずに「独学で学んだ為全く分かりません」。 Excelに付いている[ヘルプ]で充分ですよ。
A B C D E F G H 1 日 佐藤 山田 鈴木 日付 行く人 店舗 2 1 A店 B店 1 佐藤 A店 3 2 C店 A店 1 山田 B店 4 2 佐藤 C店 5 2 鈴木 A店 H2: =IF(ISERROR(MATCH(G2,A$1:D$1,0)),"",VLOOKUP(F2,A$2:D$20,MATCH(G2,A$1:D$1,0),0))
お礼
早々のご回答ありがとうございます。 とても参考になりました。 実際に作ってテストしました。 F列、G列に入力するとH欄に自動ではいるのですね。 VBAに関してまだまだ勉強不足のようです。 ISERRORやMATCH等がどんな役割をするのか 式を見るとわかるのですが、式が無いと全く組み立てられない のが現状です。 漢字が読めても、書けない様なものですかね? ^^; もし知っていたらで良いのですが、関数について分かり易く 書かれている本などありましたら教えてください。 ありがとうございました。
お礼
ご回答ありがとうございます。 早速コピー&ペーストしたところ、 とても感動です!! 自分が思っていたものそのものです!! これだけでも十分なのですが出来れば解説も頂ければ、 とてもありがたいです。 ただコピーして貼るだけでは、一生ここの世話になりそうです。 (大変贅沢なお願いになってしまいましたが ><; ) 今後、別の機会に応用出来ればと思います。 宜しくお願いします。m(_ _)m