- ベストアンサー
エクセルvbaで月と文字の組み合わせで月を進める
vbaで月を進めたいのですが、文字と組み合わせると「型が一致しません」というエラーが出ます。 どうすればよいですか? 下記コードでは、 & s1 という部分がなければvba実行の度に1~12を順番に繰り返します。 しかし、文字と組み合わせるとエラーになります。セルの書式設定と組み合わせればやりたいことは実現できますが、vbaのみで行うには、下記のどこを修正すればよいでしょうか? よろしくお願いいたします。 Sub 月を進める() Dim s1 As String s1 = "月" Range("A1") = Format(DateAdd("M", 1, Format(Left(Range("A1").Value, 2), "0-00")), "m") & s1 End Sub
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
まだ、引きずっていたのでしょうか。 質問内容そのものが変わったようですね。 >vbaで月を進めたいのですが、文字と組み合わせると「型が一致しません」というエラーが出ます。 >どうすればよいですか? 質問を正確に読むと、よく分かりません。 元は、一体どうなっているのでしょうね。 例: 1) 11月 それとも、 2) 2014年11月 Left(Range("A1").Value, 2) となっているとなれば、1) らしい。 前の内容を引きずっていても、内容が一新されて、その経緯が書かれていませんので、当事者間しか分かりません。 '1) を採用し、「11月」は、文字列とみなした場合の例: '// Sub Test1() Dim myDate As Variant myDate = Range("A1").Text 'テキスト形式で受け取らないと、実際は分からない If myDate = "" Then Exit Sub myDate = Val(myDate) '2014年12月になっていたら取れない。 myDate = DateValue(myDate & "/01") myDate = DateAdd("m", 1, myDate) Range("A1").Value = Format(myDate, "M月") '現代では、Format$ は好ましくない End Sub '// 'すでに、書式で11月になっていて、中身は日付のシリアル値が入っている場合 '// Sub Test2() Dim myDate As Variant myDate = Range("A1").Value If IsDate(myDate) = False Then Exit Sub myDate = DateAdd("m", 1, myDate) 'Range("A1").NumberFormatLocal = "m月" '書式は設定されている場合は不要 Range("A1").Value = myDate End Sub '// 注意:「コードのネストは深くしない!」「プロパティの省略はしない」 VBA/VB プログラミングの原則です。 こういう場合、Excelでは、文字列で"11月"とかしないで、表示形式で、11月として、日付のシリアル値をセルに入れれば、もっと簡単にできるでしょうに。 なお、前回の補足だけに書かれても、私は、ここに常駐して覗いているわけでもないので分かりません。それで、前置きもなく、新しい質問にされると、さっぱり事情が分からなくなります。 ベストアンサーが欲しい人は、ポイントの取れるチャンスが増えるから、質問は新しいほうがよいのでしょうが、こちらは、そんなことはどうでもよいことで、分かりやすく書けば、それだけ目的には近いはずです。それに、どの質問も誰が解決しようと、質問者さんが満足できればよいことです。ただ、かつての私がそうだったように、掲示板は学ぶ場であってもほしいと思います。ここでも、半年・一年と徐々に上達していった人もいます。 ただ、最近、一部の質問者も回答者もVBAのコードの荒っぽさが目立ちますね。
その他の回答 (2)
- watabe007
- ベストアンサー率62% (476/760)
>Range("A1") = Format(DateAdd("M", 1, Format(Left(Range("A1").Value, 2), "0-00")), "m") & s1 ↓ Range("A1").Value = Format(DateAdd("M", 1, DateValue(Range("A1").Value & "1日")), "m月")
お礼
問題なく動作しました。 どうもありがとうございました。
- keithin
- ベストアンサー率66% (5278/7941)
A1に1月から12月まで記入されています。 sub macro1() range("A1") = replace(range("A1"), "月", "") mod 12 + 1 & "月" end sub #年月日(年月)では無い値にdateaddは使えません。
お礼
思い通り動きます。replaceで消去するんですね。MODの応用で繰り返すことができるんですね。 どうもありがとうございました。
お礼
どうもありがとうございます。 まだ少し引きずっていました。 まだまだ応用が利かないんで、少しパターンが変わるとすぐいきづまってしまい何日もどつぼにはまります。 あと知識不足もあるんですが質問の内容が片手落ちで2パターンの回答で考えさせて申し訳ございません。 質問的には1の方でしたが、両方試してみました。 両方とも問題なく動作しました。また動き的も思い通りでした。 現実的には表示形式と合わせてすると簡単になると思いましたが、今回は勉強のために質問させていただきました。 学ぶ場であってほしいという心遣い感謝いたします。 VBAのコードの荒っぽさというのが初心者には良く分からないのですが、「コードのネストは深くしない!」「プロパティの省略はしない」ということなんでしょうね。 なかなか初心者には、そこまでの配慮に行く前にコードの意味を理解できて動作すればいい、となってしまいます。すいません。 また今後もしょうもない質問もするかもしれませんが、よろしくお願いいたします。 質問者のためにという心遣いが良く感じられたので、今回ベストアンサーに選ばせてください。 どうもありがとうございました。