- ベストアンサー
年月日をつけたい VBA
- エクセルのA列に検針請求書(20120126~20120222).jpgといった形式のファイル名があります。
- これを検針請求書(2012年10月22日~2012年11月24日).jpgという形に置換したいのですが、VBAのfor文やformat関数をどのように使用すれば良いでしょうか。
- 回答をお願いします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
固定長文字列ですから、決まった長さの文字列を操作するだけです。 作成例:文字列を切り出してformat関数を使って再結合する sub macro1() dim h as range dim d1 as string dim d2 as string for each h in range("A1:A" & range("A65536").end(xlup).row) d1 = format(mid(h, 7, 8), "0000年00月00日") d2 = format(mid(h, 16, 8), "0000年00月00日") h = "検針請求書(" & d1 & "~" & d2 & ").jpg" next end sub #別の方法:決まった位置に決まった言葉を挿入する sub macro2() dim h as range for each h in range("A1:A" & range("A65536").end(xlup).row) h = application.replace(h, 24, 0, "日") h = application.replace(h, 22, 0, "月") h = application.replace(h, 20, 0, "年") h = application.replace(h, 15, 0, "日") h = application.replace(h, 13, 0, "月") h = application.replace(h, 11, 0, "年") next end sub
その他の回答 (2)
- n-jun
- ベストアンサー率33% (959/2873)
ちょっと違う方法になるかな? Sub try() Dim myReg As Object Dim r As Range Set myReg = CreateObject("VBScript.Regexp") myReg.Pattern = "(\d{4})(\d{2})(\d{2})~(\d{4})(\d{2})(\d{2})" For Each r In Range("A1", Cells(Rows.Count, 1).End(xlUp)) If myReg.Test(r.Value) Then _ r.Value = myReg.Replace(r.Value, "$1年$2月$3日~$4年$5月$6日") Next Set myReg = Nothing End Sub 一例になれば。
お礼
ありがとうございました。
- MarcoRossiItaly
- ベストアンサー率40% (454/1128)
dim i as integer for i = 1 to 9 cells(i, "b").value あるいは range("b"&i).value = ~ next i とか dim r as variant for each r in range("a1:a9") r.value = ~ next r とか。 ~の部分は、cells(i, "a").value とか r.value とかに対して、Left、Mid、Right、Format 関数ですね(上の 2 コードそれぞれの 3 行目の右辺において)。Left & Format(Mid(r.value)) & Right みたいに。で、同じセルに、できた文字列を代入・上書き(上の 2 コードそれぞれの 3 行目の左辺へ)。 Mid をたくさん使えば Format は不要との意味もありますが、式が長くなるんで、使ったほうがスマートには見えそう。 「検針~.jpg」という文字列中の、Mid とかでちょん切ってできる各部品は、それぞれのための変数・定数をあらかじめ宣言しておいたほうが、見やすいコードになります。あと、上の 2 コードでは each のほうにしたほうが短くスッキリ書けますね。r が何回も出てくるので。
お礼
ありがとうございました。
お礼
ありがとうございました。