スポンサーリンク
今回は、Excelで「月」記述を1ヶ月前に進めるマクロというものを紹介する。
といっても何のことか分からないはずなので、例をあげて説明する。
問題
上図でA列に書かれている摘要には、「11月」「12月」など「○月」の文字列が含まれている。
経理業務で仕訳というものを入力するとき、結構こんな感じで摘要を書いていくんだけどね。
さてこれ、1ヶ月後になったらまたパターンにはめて同様の仕訳を入れるんだけど、そのときは「11月分」というのは「12月分」と1ヶ月前に進めないといけない。
もちろん「12月の電気代と1月分の前払家賃」って摘要は「1月の電気代と2月分の前払家賃」としなければならない。
これを、大量の摘要に対して一気にやりたいということだ。
置換じゃ駄目なの?
さて、この解決方法だけど、普通こういうのは、Excelの置換の機能でやる。
置換と、あと検索の機能については、別の記事を書いているのでそちらをどうぞ。
でもこの場合は駄目だ。
摘要に「11月」「12月」「1月」と幾つもの「月」記述があるから、置換対象が絞れない。
そして「11月を12月に置換する」を先にやると、次に「12月を1月に置換する」の作業が必要になるが、そのときどうなるかは分かるだろう。
この課題を置換機能で解決するのは、複雑なケースになると無理なのだ。
解答
・・・というのが今回の課題だけど、まあ需要がどのくらいあるかは微妙なところだ。
私は実際の経理業務で、これやってるのだけどね。
それでは、この問題をスムーズに解決するための、マクロのソースコードを示す。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
Sub monthOnePlus() '「月」記述を1ヶ月分プラス If MsgBox("「月」記述の数字を1月分プラスしますか?", vbOKCancel + vbQuestion, "確認") = vbCancel Then Exit Sub Dim rng As Range Dim eachRng As Range Dim i As Long Dim str As String Application.ScreenUpdating = False '描画を省略 Set rng = Selection '「○月」とあるものを1ヶ月前に進める。 '1ヶ月前に進めたものは、もう一度処理が掛からないよう、「#」文字を付しておく。 For Each eachRng In rng str = Replace$(eachRng.Value, Find:="12月", Replace:="1#月") '先に12月を1月にする For i = 1 To 11 str = Replace$(str, Find:=i & "月", Replace:=(i + 1) & "#月") '月を1つ前に進める Next i str = Replace$(str, Find:="#月", Replace:="月") '仮付けした「#」文字を消しておく eachRng.Value = str 'セルに代入 Next eachRng End Sub |
解説
このマクロは、対象となる摘要を書き込んだセルを選択しておいてから、それらのセルに対して「月」を1ヶ月前に進める処理を加えるものだ。
私はこのブログでマクロを取り上げるときは大抵、個人用マクロブックに組み込んでExcelを改造するようなものを紹介するけど、今回のマクロは個人用マクロブックに組み込んで汎用的に使うようなものでもあるまい。
このマクロを対象のExcelブックに付け加えたければ、
Alt+F11
でVBEというエディタを開き、その中にソースコードをまんま貼付ければ良い。詳細な図とかは省略する。
さてこのマクロの中身だが、
まず「12月」を「1月」に進めるのは特別扱いなのは分かっていただけるだろう。
そして「1月」~「11月」までを順に検索して、Replaceで1ヶ月後に置換している。
そして、一度前に進めたものをもう一度やっちゃわないように、一時的に「#」文字を付すことで検索の対象外としているというわけだ。
これが業務で役に立つよって人、いないかなあ。
スポンサーリンク