[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『対応する日、場所にデータを転記』(上)
お世話になります。
一日にかかった経費をひと月毎に管理する表を作りたいです。
今あるレイアウトとしては
A列:日付(1日、2日…のみの表記)
B列以降:名前とかかった金額を行で分けている
A B C D E・・・ K L 1 見出し(平成28年〇月度経費) 2 空欄 月別合計欄 3 1日 名前 名前 名前 名前・・・ 4 金額 金額 金額 金額・・・ 人別合計欄 5 2日 名前 名前 名前 名前・・・名前 合計金額 6 金額 金額 金額 金額・・・
↑分かりにくいですがこんな感じです
で、一か月の間に同じ人が何回も出てくる場合もあり 一か月間の合計と人毎の合計も端に列を作って出したいです。
たとえば 山田さんが 1日:¥1000 8日:¥2000 17日:¥1000 24日:¥1000
佐藤さんが 2日:¥1000 15日:¥2000
だとすると 合計欄に 「山田 ¥5000」 その山田さんの下に 「佐藤 ¥3000」 と表示したいです。
さらに、山田さんは月4回出てくるので
入力場所を設けてそこに 名前と日付(複数日数)、その日かかった金額を入力したら 対応する日付に一気に名前と金額を入力できたらいいなと思います。
今あるレイアウトが良くないなら変えたいですが 上記方法を実現させるにはどうしたらいいでしょうか…。
丸投げの質問ではありますが どなたか知恵をお貸しくださいm(__)m
< 使用 Excel:Excel2010、使用 OS:Windows7 >
日付 名前 金額 1日 Aさん 100 1日 Bさん 200 1日 Cさん 300
こんなレイアウトにしたらオートフィルタでいいんでない? (GobGob) 2016/04/26(火) 15:36
こんな感じにしたらどうでしょうか?
<当月>シート 反映前 行 __A__ ____B____ ____C____ _D_ __E__ __F__ _G_ _H_ ____I____ 1 反映可能 ←右Click 西暦 2016 年 4 月度経費 2 氏名 日付 金額 3 山田 1 101 4 3 1,002 5 4 10,004 6
11 12 月合計 13 14 人名別 合計金額
<当月>シート B1セルを右クリックして、入力情報を表に反映させた後 行 __A__ ____B____ ____C____ _D_ __E__ ___F___ _G_ _H_ ____I____ 1 入力待ち 西暦 2016 年 4 月度経費 2 氏名 日付 金額 3 1(金) 山田 4 101 5 6 7 3(日) 山田 8 1002 9 4(月) 山田 10 10,004 11 12 月合計 11,107 13 14 人名別 合計金額 15 山田 11,107
手順 1.新規ブックに1枚シートを挿入して、「当月」と言うシート名にする。 そのシートタブを右クリックして、コードの表示を選択してVBE画面に行く。 下のコートを貼り付けて、F5キーを押下して「OnlyOnce」マクロを実行する
Private Sub onlyOnce() ’当月シートのスケルトンを作成する Rem 生データのセルをまとめて処理 Range("E1").Value = "西暦" Range("G1").Value = "年" Range("I1").Value = "月度経費" Range("A2").Value = "氏名" Range("B2").Value = "日付" Range("C2").Value = "金額" Range("B12").Value = "月合計" Range("B14").Value = "人名別" Range("C14").Value = "合計金額"
Rem 数式セルをまとめて処理 Range("B1").FormulaR1C1Local = "=IF(AND(SUMPRODUCT(N((R[2]C:R[9]C="""")+(R[2]C[1]:R[9]C[1]="""")=1))=0,COUNTA(RC[4],RC[6],R[2]C[-1],R[2]C,R[2]C[1])=5),""反映可能"",""入力待ち"")" Range("C1").FormulaR1C1Local = "=IF(RC[-1]=""反映可能"",""←右Click"","""")"
Rem 標準外書式セルをまとめて処理 Range("C3:C7,C15:C500").NumberFormatLocal = "#,##0;[赤]-#,##0"
Rem 塗りつぶしセルをまとめて処理 Range("F1,H1,A3:C3,B4:C10").Interior.ColorIndex = 19
With Range("B1") '条件付き書式を設定する .FormatConditions.Add Type:=xlCellValue, Operator:=xlEqual, Formula1:="=""反映可能""" .FormatConditions(.FormatConditions.Count).SetFirstPriority With .FormatConditions(1).Interior .PatternColorIndex = xlAutomatic .Color = 10092441 End With End With
End Sub
2.実行後は用済みとなるので、上のコードは削除し、 代わって、以下のコードを貼り付ける
(1)「当月」シートのシートモジュールに
Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
Rem 事前チェック If Target.Address(0, 0) <> "B1" Then Exit Sub If Target.Value <> "反映可能" Then Exit Sub
Cancel = True
Rem 転記・集計 CKnBooking sumByName
End Sub
(2)標準モジュールに
Sub CKnBooking() '日付のチェックと転記 Dim NN As Long, TbRowNo As Long, TbColNo As Long, DTin, nameToProc
DTin = Range("B3:C10").Value
For NN = 1 To UBound(DTin) If DTin(NN, 1) <> "" Then If DTin(NN, 1) < 1 Or DTin(NN, 1) > [DAY(DATE(F1,H1+1,0))] Then MsgBox "日付が当月の範囲外です。処理中止" Exit Sub End If End If Next
Rem 書き込み nameToProc = Range("A3").Value For NN = 1 To UBound(DTin) If DTin(NN, 1) <> "" Then TbRowNo = DTin(NN, 1) * 2 + 1 TbColNo = Cells(TbRowNo, 500).End(xlToLeft).Column If TbColNo < 5 Then TbColNo = 5 Cells(TbRowNo, 5).Value = Format(DateSerial([F1], [H1], DTin(NN, 1)), "d(aaa)") End If Cells(TbRowNo, TbColNo + 1) = nameToProc Cells(TbRowNo + 1, TbColNo + 1) = DTin(NN, 2) End If Next
If MsgBox("転記完了。入力データをクリアしますか?", vbYesNo) = vbYes Then Range("A3:C10").ClearContents End If
End Sub
Sub sumByName() '合計算出 Dim DTin, dicT As Object Dim TbRowNo As Long, TbColNo As Long Dim MaxRow As Long, MaxCol As Long
Set dicT = CreateObject("Scripting.Dictionary")
MaxRow = Cells.Find(What:="*", After:=Range("A1"), LookIn:=xlValues, LookAt:= _ xlPart, SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row
MaxCol = Cells.Find(What:="*", After:=Range("A1"), SearchOrder:=xlByColumns, _ SearchDirection:=xlPrevious).Column
DTin = Range("F3", Cells(MaxRow, MaxCol)).Value
For TbRowNo = 1 To UBound(DTin) Step 2 For TbColNo = 1 To UBound(DTin, 2) If DTin(TbRowNo, TbColNo) <> "" Then If dicT.exists(DTin(TbRowNo, TbColNo)) Then dicT(DTin(TbRowNo, TbColNo)) = dicT(DTin(TbRowNo, TbColNo)) + DTin(TbRowNo + 1, TbColNo) Else dicT.Add DTin(TbRowNo, TbColNo), DTin(TbRowNo + 1, TbColNo) End If End If Next TbColNo Next TbRowNo
Range("B15:C500").ClearContents Range("B15").Resize(dicT.Count, 1).Value = Application.Transpose(dicT.keys) Range("C15").Resize(dicT.Count, 1).Value = Application.Transpose(dicT.items) Range("C12").Value = Application.Sum(Range("C15:C500")) End Sub
3.運用を開始する (1)年と月を、F1セル、H1セルに入力する。 例:2016 と 4
(2)A3に氏名を入力する。
(3)B3:C10に、日付(ただの数値。シリアル値ではない)と金額を入力する。 10行目に収まらない場合は、次のルーティンで処理する(つまり、2回に分ける)
(4)所用データを入力後、B1セルを右クリックする (そのセルには「反映可能」と表示されている)
(5)「転記完了。入力データをクリアしますか?。」と訊かれたら、それに応える。 通常はYESをクリックして、クリアさせることになります。 データが多くて、2回に分ける場合は、NOをクリックして、名前データを生かすような運用になる。
(6)次の人の処理に移る。つまり、上記(2)に戻って繰り返す。
※当月処理が終わったら、このシートは引き続き「当月」となり続けるため 全データを別のシート(例:4月シート)にコピペ(値の貼り付け)する。
そして、「当月」シートは、スケルトン部分を残してクリアし、翌月の「当月」として再利用する。
(半平太) 2016/04/27(水) 09:41
ご回答ありがとうございます。
すごく良さそうな感じがするのですが
マクロの解読に時間がかかりそうなので
ちょっとがんばってみます><
(上) 2016/04/27(水) 22:35
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.