dポイントプレゼントキャンペーン実施中!

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

A 回答 (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のコードの荒っぽさが目立ちますね。
    • good
    • 0
この回答へのお礼

どうもありがとうございます。
まだ少し引きずっていました。
まだまだ応用が利かないんで、少しパターンが変わるとすぐいきづまってしまい何日もどつぼにはまります。

あと知識不足もあるんですが質問の内容が片手落ちで2パターンの回答で考えさせて申し訳ございません。

質問的には1の方でしたが、両方試してみました。
両方とも問題なく動作しました。また動き的も思い通りでした。

現実的には表示形式と合わせてすると簡単になると思いましたが、今回は勉強のために質問させていただきました。

学ぶ場であってほしいという心遣い感謝いたします。

VBAのコードの荒っぽさというのが初心者には良く分からないのですが、「コードのネストは深くしない!」「プロパティの省略はしない」ということなんでしょうね。
なかなか初心者には、そこまでの配慮に行く前にコードの意味を理解できて動作すればいい、となってしまいます。すいません。

また今後もしょうもない質問もするかもしれませんが、よろしくお願いいたします。

質問者のためにという心遣いが良く感じられたので、今回ベストアンサーに選ばせてください。
どうもありがとうございました。

お礼日時:2014/11/16 20:18

>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月")
    • good
    • 0
この回答へのお礼

問題なく動作しました。
どうもありがとうございました。

お礼日時:2014/11/16 20:19

A1に1月から12月まで記入されています。



sub macro1()
range("A1") = replace(range("A1"), "月", "") mod 12 + 1 & "月"
end sub


#年月日(年月)では無い値にdateaddは使えません。
    • good
    • 0
この回答へのお礼

思い通り動きます。replaceで消去するんですね。MODの応用で繰り返すことができるんですね。
どうもありがとうございました。

お礼日時:2014/11/16 20:02

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!