- 締切済み
エクセルフォームを使ってのデータ集約化について悩んでます。
エクセルを使った手当申請用の所定フォームが下記の通りあります。 部門別に申請が上がってきます。 【A部門】 従業員番号・氏名・金額 0001 佐藤A夫 6,000 【B部門】 従業員番号・氏名・金額 0005 斎藤B夫 3,000 0008 加藤B作 4,000 1.まず、A部門・B部門それぞれの申請フォームをひとつにまとめるマクロを作成したい。 【統一】 従業員番号・氏名・金額 0001 佐藤A夫 6,000 0005 斎藤B夫 3,000 0008 加藤B作 4,000 2.その上で、項目及び、データ未入力の行及ぶ列を削除するマクロを作成したい。 (項目を削除) 0001 佐藤A夫 6,000 (この列より右を削除) 0005 斎藤B夫 3,000 0008 加藤B作 4,000 (この行より下を削除) 特に悩んでいる箇所は以下です。 (1)まとめる際に、重複や欠落が無く一本にする方法はありますか? (2)データが未入力となる行や列は変動する為、当該行や列を的確に選択する必要があります。 表現が不足している箇所もあると思いますが、有効な方法をご教示頂ければ幸いです。宜しくお願い申し上げます。
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- imogasi
- ベストアンサー率27% (4737/17069)
仕事の課題を丸投げしているに近い。このコーナーは丸投げ禁止のはず。 一表にまとめる課題は、VBAの経験を積むしかない。 しかし、もしVBAの本も読んでいないような人なら、作れるわけが無い。 一応1つのやり方を書いておく。 シートを挿入して、名前をつける(累積表とする) ーーー シートをすべて捉える Sub test01() Dim sh As Worksheet For Each sh In Worksheets If sh.Name <> "累積表" Then MsgBox sh.Name '本来ここへ処理が来る End If Next End Sub ーーー 処理のメインは各シートをコピーして、累積表に順次貼り付けること。 Sub test01() Dim sh As Worksheet For Each sh In Worksheets If sh.Name <> "累積表" Then MsgBox sh.Name sh.Range("a1").CurrentRegion.Copy Worksheets("累積表").Range("A5") End If Next End Sub これだと累積表最後のシートを中心にしてしか、残らない。 ").Range("A5")をその時どきの最終行+1を指すように変えればよい。 それと見出し行は累積範囲から除く必要がある。 累積表第1行には、見出しだけは貼り付けて置いてください。 結果 Sub test01() Dim sh As Worksheet Dim cntRow As Integer Dim cntCol As Integer Dim Rng As Range For Each sh In Worksheets If sh.Name <> "累積表" Then MsgBox sh.Name d = Worksheets("累積表").Range("A65536").End(xlUp).Row MsgBox d Set Rng = sh.Range("A1").CurrentRegion If Rng.Rows.Count < 2 Then GoTo p01 '見出しのみ cntRow = Rng.Rows.Count - 1 cntCol = Rng.Columns.Count Set Rng = Rng.Offset(1) '※一行ずらす Set Rng = Rng.Resize(cntRow, cntCol) '※一行削る Rng.Copy Worksheets("累積表").Range("A" & (d + 1)) End If p01: Next End Sub ======= >エクセルフォームを使って フォームという言葉は、注意して使ってほしい。 (1)メニューのデーターフォームのフォーム (2)ユーザーフォームのフォーム。VBのフォーム (3)一般的な意味で、様式のあるコンピュタ帳票画面や印刷画面 (4)印刷物(コピー)で様式のある、コンピュタで印刷する帳票の内容白紙の用紙 質問では(3)かと思う。 しかし質問の内容ぐらいでは、(わざわざフォームといわず)エクセルのシートとかエクセルの表とかエクセルのデータがあります、でよいと思う。小生など(2)をまず思う。 ======= >重複や欠落が無く一本にする方法はありますか 同時にやる方法は、上記のような全行一括してコピー・貼り付けのコピーメソッドを使うロジックでは出来ない。 累積完了後にそういう処理をすることになる。 元シートから1行1行、累積表に値を代入する方式を採るときは、重複をチェックしていくロジックを入れれば、出来ないことではないが。 重複排除は、操作(フィルタオプションの設定)や関数でも出来る。 >データが未入力となる行や列は変動する為、当該行や列を的確に選択する必要があります。 変動するなど当たり前の話。書く必要なし。的確とは。コンピュタ処理では的確は当たり前。書く必要なし。 未入力行も累積の時に考えるのでなく、累積してからチェックするなり削除する(ただし削除は賢明でないと思う、集ったデータは出来るだけ残す。本来問い合わせでもして、補充するのが担当者の役目?) 処理は出来るだけ別のステップに分ける方が良い。チェックしながら 集積するというやり方コードの作り方は、特に初心者には勧めない。
- n-jun
- ベストアンサー率33% (959/2873)
1)重複とは、何をもって判断するのか? 欠落とは、発生する要因があげられるのなら先に提示された方がよいかと。 2)未入力とはどう言った状態を示すのか?(例題では不明かな) 必要な列だけを集約するのなら、A~C列だけ選択範囲とするなり方法はとれるかと。