- 締切済み
ExcelでVBAを使いデータの転記や印刷をするには
以下の4項目のデータが入っているファイルがあります。 「名前」「日付」「費目」「金額」 ex) A子 ○月×日 食費 100円 B子 △月×日 交通費 200円 ・・・ <条件> ・「名前」は複数ある ・「日付」はひと月分ずつ別シートになっている ・「費目」は「食費」と「交通費」だけ ・「金額」はまちまち このデータをもとにして、以下のような表形式に転記し、印刷をするにはどうすればよいでしょうか。 A子 日付 費目1 金額 費目2 金額 ○月1日 食費 100円 ○月2日 交通費 100円 ○月3日 ○月4日 ○月5日 食費 100円 交通費 300円 ・・・ ○月31日 合計 200円 400円 B子 上記同様 ・・・ <条件> ・名前毎に別の紙に印刷をする ・食費と交通費は別の列にして、一番下の行で各々の合計をとる ・1日から末日までひと月全ての日付を左端に入れ、ひと月を一枚とする(金額が発生していない日は空欄となる) 簡単なマクロなら使ったことがあるのですが、はたしてこのような処理をするのは可能でしょうか・・・。 どなたかお分かりになる方がいらっしゃいましたら、お教え頂ければと存じます。
- みんなの回答 (5)
- 専門家の回答
みんなの回答
- sakura9113
- ベストアンサー率50% (2/4)
すごく遅くなってごめんなさい。 名前を変数に入れるコードを作ってみました。 (データが入っているシートが、A1に名前、A2から下に名前が並んでいるものとして作ってます) Dim LastRow As Integer, i As Integer Dim Namae() As String, actSheetNM As String LastRow = Range("A65536").End(xlUp).Row With Range("A1:A" & LastRow) .AdvancedFilter Action:=xlFilterInPlace, Unique:=True .SpecialCells(xlCellTypeVisible).Copy End With '==================================== '捨てシートを作って名前リストを作成 '==================================== Sheets.Add ActiveSheet.Cells(1, 1).Select ActiveSheet.Paste LastRow = Range("A65536").End(xlUp).Row '==================================== '変数にセットする '==================================== ReDim Namae(2 To LastRow) '------配列 For i = 2 To LastRow Namae(i) = Cells(i, 1) Next '==================================== '↑で作った捨てシートを削除 '==================================== actSheetNM = ActiveSheet.Name Application.DisplayAlerts = False Sheets(actSheetNM).Delete Application.DisplayAlerts = True これでどんなですかね???^^
- sakura9113
- ベストアンサー率50% (2/4)
こんばんわ。ちょっと忙しくてコード書く時間が無いので、文字にて説明しますね。 ============================================================== 現状は「予めA子・B子を印刷フォーマットに設定しておく(A子・B子をマクロ内に設定する)ようになっていますが、これを「マクロ内には設定せず、データから都度抽出して表題としてつける」ようにできますでしょうか。 ============================================================== ↑ちょっと面倒ですけど、できますよ。 たとえば、名前の列を選択して、【データ】-【フィルタオプション】-【重複するレコードは無視する】にチェックを入れると、重複しない名前だけ表示されるので、それを名前として変数に入れる。 データのシートから何月かを取得して、変数にでも入れておく。 (↑作業用シートを一つ作って、可視セルのみ貼り付ける、などしたらラクかも) 新規シートを作成して(月名にシート名を変更)、A1から順に、【名前1】、【月&1日】、【一つ上のセル+1】・・・と作って行きます。 29日が表示される部分からはIF文を使って、「一つ上のセル+1が28より小さい場合は空白、そうでなければ一つ上のセル+1」という感じで。 それから合計行を作る。 その後、【名前2】、【月&1日】・・・という風に繰り返す。 こうして新規でシートから作成すればいいかな? あ、元データのあるシートを、【データ】-【全て表示】に戻しておくこともわすれずに^^
- sakura9113
- ベストアンサー率50% (2/4)
データが入っているシートの名前を「元データ」、月ごとのシートを「2月」とします。 まず月ごとのシートの表示を整えます。 A B C D 1 A子 2 1日 3 2日 ・・・ 32 31日 33 合計 34 35 B子 36 1日 ・・・ という感じで。 それから合計行の合計を表示させたい部分に数式"=SUM(R[-31]C:R[-1]C)"を入れます。 そして、A子さんとB子さんの間に改ページを挿入します。 (↑これらもVBAでやってもよいですけど^^) こうして転記先のシートを整えておいてから、 Sub SheetTenki() Dim i As Integer, j As Integer, lastrow As Integer, colNo As Integer, tuki As Integer Dim dd() As Integer, rowNo() As Integer, namae() As String, koumoku() As String, kingaku() As Long Sheets("元データ").Select lastrow = Range("A65536").End(xlUp).Row ReDim namae(1 To lastrow) ReDim dd(1 To lastrow) ReDim rowNo(1 To lastrow) ReDim koumoku(1 To lastrow) ReDim kingaku(1 To lastrow) tuki = Month(Cells(1, 2)) For i = 1 To lastrow namae(i) = Cells(i, 1) dd(i) = Day(Cells(i, 2)) koumoku(i) = Cells(i, 3) kingaku(i) = Cells(i, 4) Select Case namae(i) Case "A子": rowNo(i) = dd(i) + 1 Case "B子": rowNo(i) = dd(i) + 35 End Select Next Sheets(tuki & "月").Select For i = 1 To lastrow Select Case koumoku(i) Case "交通費": colNo = 2 Case "食費": colNo = 4 End Select Cells(rowNo(i), colNo) = koumoku(i) Cells(rowNo(i), colNo + 1) = kingaku(i) Next End Sub こんな感じでいけるんじゃないですかね? 私も初心者で、めんどくさいやり方かもしれませんがすみません。
補足
丁寧に教えてくださりありがとうございます。 早速やってみました。 それでさらにお伺いしたいと思います。 現状は「予めA子・B子を印刷フォーマットに設定しておく(A子・B子をマクロ内に設定する)ようになっていますが、これを「マクロ内には設定せず、データから都度抽出して表題としてつける」ようにできますでしょうか。 といいますのは、「A子」「B子」のみ例示したものの、実際には「名前」は50件程あり、又、随時変更があるため、マクロ内に設定してしまうと都度の更新が容易でないのです。 又、別の点ですが、「30日」「31日」等々の月の日数の変化にも対応できる方法はありますでしょうか。 無理を申しましてすみませんが、教えて頂ければと思います。
- mitarashi
- ベストアンサー率59% (574/965)
「可能です」が簡単ではありません。ピボットテーブルを推奨します。 ピボットテーブルで、行フィールドに日付 列フィールドに費目 データアイテムに金額 ページフィールドに名前をドラッグ&ドロップして下さい。 (金額が発生していない日は空欄となる)以外は、ほぼご希望のことが、マクロを組まずに出来ます。名前フィールドをA子、B子に切り替えて印刷すれば良いでしょう。その部分だけマクロ記録で自動化するのは簡単だと思います。 -出来上がりのイメージ 名前 A子▼ (ドロップダウンリストで選択可能) 合計:金額 費目 日付 交通費 食費 総計 2008/2/27 500 500 2008/2/28 100 100 総計 500 100 600
お礼
ピボットテーブルは思いつきませんでした! おっしゃるとおりこれで大体のことができますね^^ ただ、ピボットテーブルだと印刷のレイアウトが決まってしまい、他のことを書いたりできないので、できればマクロがよいなと思っています。 でも大変参考になりました。 ありがとうございます。
- tos_net
- ベストアンサー率48% (66/137)
可能です。 要は名前と日付でソートして1日ずつ費目ごとに移送・集計してやればよいと思います。 データをAccessのMDBに入力するようにすればさらに簡単になります。
お礼
教えてくださいましてありがとうございます。 この方法で上手く日数を設定することができました! でも、データから名前を抽出して表題に転記するマクロを作ることはできませんでした↓ せっかく考え方を教えて頂いたのに・・・私のスキルの問題ですね。。残念です。