こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

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日から末日までひと月全ての日付を左端に入れ、ひと月を一枚とする(金額が発生していない日は空欄となる)

簡単なマクロなら使ったことがあるのですが、はたしてこのような処理をするのは可能でしょうか・・・。
どなたかお分かりになる方がいらっしゃいましたら、お教え頂ければと存じます。

投稿日時 - 2008-02-27 21:39:51

QNo.3815725

困ってます

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(5)

ANo.5

すごく遅くなってごめんなさい。
名前を変数に入れるコードを作ってみました。
(データが入っているシートが、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

これでどんなですかね???^^

投稿日時 - 2008-03-04 23:17:52

ANo.4

こんばんわ。ちょっと忙しくてコード書く時間が無いので、文字にて説明しますね。
==============================================================
現状は「予めA子・B子を印刷フォーマットに設定しておく(A子・B子をマクロ内に設定する)ようになっていますが、これを「マクロ内には設定せず、データから都度抽出して表題としてつける」ようにできますでしょうか。
==============================================================
↑ちょっと面倒ですけど、できますよ。

たとえば、名前の列を選択して、【データ】-【フィルタオプション】-【重複するレコードは無視する】にチェックを入れると、重複しない名前だけ表示されるので、それを名前として変数に入れる。
データのシートから何月かを取得して、変数にでも入れておく。
(↑作業用シートを一つ作って、可視セルのみ貼り付ける、などしたらラクかも)

新規シートを作成して(月名にシート名を変更)、A1から順に、【名前1】、【月&1日】、【一つ上のセル+1】・・・と作って行きます。
29日が表示される部分からはIF文を使って、「一つ上のセル+1が28より小さい場合は空白、そうでなければ一つ上のセル+1」という感じで。

それから合計行を作る。
その後、【名前2】、【月&1日】・・・という風に繰り返す。

こうして新規でシートから作成すればいいかな?

あ、元データのあるシートを、【データ】-【全て表示】に戻しておくこともわすれずに^^

投稿日時 - 2008-02-29 01:50:48

お礼

教えてくださいましてありがとうございます。
この方法で上手く日数を設定することができました!
でも、データから名前を抽出して表題に転記するマクロを作ることはできませんでした↓
せっかく考え方を教えて頂いたのに・・・私のスキルの問題ですね。。残念です。

投稿日時 - 2008-02-29 23:58:12

ANo.3

データが入っているシートの名前を「元データ」、月ごとのシートを「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

こんな感じでいけるんじゃないですかね?
私も初心者で、めんどくさいやり方かもしれませんがすみません。

投稿日時 - 2008-02-28 00:56:39

補足

丁寧に教えてくださりありがとうございます。
早速やってみました。
それでさらにお伺いしたいと思います。
現状は「予めA子・B子を印刷フォーマットに設定しておく(A子・B子をマクロ内に設定する)ようになっていますが、これを「マクロ内には設定せず、データから都度抽出して表題としてつける」ようにできますでしょうか。
といいますのは、「A子」「B子」のみ例示したものの、実際には「名前」は50件程あり、又、随時変更があるため、マクロ内に設定してしまうと都度の更新が容易でないのです。
又、別の点ですが、「30日」「31日」等々の月の日数の変化にも対応できる方法はありますでしょうか。
無理を申しましてすみませんが、教えて頂ければと思います。

投稿日時 - 2008-02-28 18:35:34

ANo.2

「可能です」が簡単ではありません。ピボットテーブルを推奨します。

ピボットテーブルで、行フィールドに日付
列フィールドに費目
データアイテムに金額
ページフィールドに名前をドラッグ&ドロップして下さい。
(金額が発生していない日は空欄となる)以外は、ほぼご希望のことが、マクロを組まずに出来ます。名前フィールドをA子、B子に切り替えて印刷すれば良いでしょう。その部分だけマクロ記録で自動化するのは簡単だと思います。

-出来上がりのイメージ

名前 A子▼ (ドロップダウンリストで選択可能)

合計:金額 費目
日付 交通費 食費 総計
2008/2/27 500    500
2008/2/28    100 100
総計 500    100  600

参考URL:http://sweety.jp/honobono/faq/pibo/index.htm

投稿日時 - 2008-02-28 00:15:40

お礼

ピボットテーブルは思いつきませんでした!
おっしゃるとおりこれで大体のことができますね^^
ただ、ピボットテーブルだと印刷のレイアウトが決まってしまい、他のことを書いたりできないので、できればマクロがよいなと思っています。
でも大変参考になりました。
ありがとうございます。

投稿日時 - 2008-02-28 18:12:59

ANo.1

可能です。
要は名前と日付でソートして1日ずつ費目ごとに移送・集計してやればよいと思います。
データをAccessのMDBに入力するようにすればさらに簡単になります。

投稿日時 - 2008-02-27 22:44:33

あなたにオススメの質問