• ベストアンサー

エクセル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

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

まだ、引きずっていたのでしょうか。 質問内容そのものが変わったようですね。 >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のコードの荒っぽさが目立ちますね。

hinoki24
質問者

お礼

どうもありがとうございます。 まだ少し引きずっていました。 まだまだ応用が利かないんで、少しパターンが変わるとすぐいきづまってしまい何日もどつぼにはまります。 あと知識不足もあるんですが質問の内容が片手落ちで2パターンの回答で考えさせて申し訳ございません。 質問的には1の方でしたが、両方試してみました。 両方とも問題なく動作しました。また動き的も思い通りでした。 現実的には表示形式と合わせてすると簡単になると思いましたが、今回は勉強のために質問させていただきました。 学ぶ場であってほしいという心遣い感謝いたします。 VBAのコードの荒っぽさというのが初心者には良く分からないのですが、「コードのネストは深くしない!」「プロパティの省略はしない」ということなんでしょうね。 なかなか初心者には、そこまでの配慮に行く前にコードの意味を理解できて動作すればいい、となってしまいます。すいません。 また今後もしょうもない質問もするかもしれませんが、よろしくお願いいたします。 質問者のためにという心遣いが良く感じられたので、今回ベストアンサーに選ばせてください。 どうもありがとうございました。

その他の回答 (2)

  • watabe007
  • ベストアンサー率62% (476/760)
回答No.3

>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月")

hinoki24
質問者

お礼

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

  • keithin
  • ベストアンサー率66% (5278/7940)
回答No.1

A1に1月から12月まで記入されています。 sub macro1() range("A1") = replace(range("A1"), "月", "") mod 12 + 1 & "月" end sub #年月日(年月)では無い値にdateaddは使えません。

hinoki24
質問者

お礼

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

関連するQ&A

  • エクセルvbaブック名の年を進めたい

    エクセル2013vbaです。 2014年という名前のファイルがあります。 vbaで、 Sub test() Dim myNew_path As String myNew_path = Format(DateAdd("yyyy", 1, Replace(ThisWorkbook.Name, "年.xlsm", "")), "yyyy") End Sub を実行すると、"1906/07/06"を取得しており、"1906"となってしまいます。 無理やりDateAddで110を足せば"2015"の取得はできますが、どうしてでしょうか? どのように修正すればまともにDateAddに1を足して"2015"を取得できるのでしょうか? すいませんが、お願いいたします。

  • エクセルVBAのエラー

    よろしくお願いします。 VBA初心者のものです。 下記のコードを作成しましたが、 アプリケーション定義?がされていません というエラーが出ます。 わかりやすく教えていただけないでしょうか。 修正方法を教えてください。 0901名簿.xlsという名前の ファイルAのsheet1の 情報(ファイルBのセルBD1に日付4桁が記入されている)を ファイルBのセルA1の情報を元にファイルBのセルB1に抽出したい Sub 関数の挿入() Dim i As Long Dim あ As String Dim い As String Dim う As String あ="=VLOOKUP(A1,[" い=Range("BD1") う="名簿.xls]Sheet1!$F:$I,1,0)" For i = 2 To 50 Range("A" & i )= あ & い & う Next i End Sub

  • セルの先頭文字のアポストロフィーが認識されない

    Sub t() Dim s As String Range("A1").Value = "'あああ" s = Left(Range("A1").Value, 1) Debug.Print Asc(s) End Sub を実行すると、「あ」の文字コードの-32096が返ってきます。 「‘」に対する39が返ってきてほしいのですが Range("A1").Value = "''あああ" こういう状態でセルに値が入ってないと無理なのでしょうか? シングルコーテーションが1つ入ってても それを一文字として認識させたいのですがエクセルでは不可能ですか?

  • エクセル 任意の文字をVBAで使いたい時

    Excel VBAで、任意の文字(特定の文字ではなく、何か文字があるという状態)を含んだ語を、置換したいです。 具体的には、「;?」を「; ?」として置換したいです。 ※ここで「?」は任意の文字としています。 以下のコードで試しましたが、うまくいきません。 Sub macro2() Dim myRange As Range Dim keyWord1 As String, keyWord2 As String Dim bool As Boolean Set myRange = Range("C4") keyWord1 = ";?" 'ワイルドカードを使用 keyWord2 = "; ?" bool = myRange.Replace(keyWord1, keyWord2, LookAt:=xlWhole) End Sub keyWord1 = ";?" 、keyWord2 = "; ?"の「" "」の部分に何を入れればいいか、ご教授願います。 宜しくお願い致します。

  • エクセルxpのVBA

    VBA初心者です。下記を実行すると、「elseに対応するifがありません」と出ます。なぜかわからず困っています。 For hiniti = DateSerial(Range("A3"), Range("A4"), 21) To DateAdd("m", 1, DateSerial(Range("A3"), Range("a4"), 20)) ActiveCell.Value = hiniti ActiveCell.Offset(0, 1).Select If ActiveCell.Column = 7 Then ActiveCell.Offset(1, -7).Select Else: ActiveCell.Offset(0, 1).Select End If next end sub

  • エクセルVBA

    こんばんは。 いつも拝見しています。初歩的でしょうが私ではまだ 解決できません。ご指導いただきたく思います。 ユーザーフォームにテキストボックスとスピンボタンを設置し日付を 変更するようにしています。ユーザーフォームを開くと今日の日付に 変わってしまいます。C2とリンクしテキストボックスに先に値を 取得するにはどうしたらよいでしょうか。お願します。 Private Sub spnDate_SpinDown() Dim dtDate As Date dtDate = UserForm1.txtDate.Value UserForm1.txtDate.Value = Format(DateAdd("m", -1, dtDate), "yyyy/mm") End Sub Private Sub spnDate_SpinUp() Dim dtDate As Date dtDate = UserForm1.txtDate.Value UserForm1.txtDate.Value = Format(DateAdd("m", 1, dtDate), "yyyy/mm") End Sub Private Sub txtDate_Change() Range("c2") = txtDate.Value End Sub

  • EXCEL VBA で複数の特定文字に色をつけたい

    マクロ実行で以下のように一括色変更できないでしょうか? 1文字での変更は下記コードでおこなうことができましたが、複数であると初心者でとても分かりません。 ※S25とF30.、F5.は加工進行でいろいろ数値のみ変えます。 ※M100、M101は全体の4文字は変わりませんが数字は増えていき、ランダムにこの先の加工進行上でてきます。 ※M03、M00は3文字で変わりません。 現在以下のコードで1文字ずつならできます。 Sub test01() Dim cl As Range For Each cl In Range("a1:a10") r = InStr(cl, "M00") If r <> 0 Then cl.Characters(r, 3).Font.ColorIndex = 3 End If Next End Sub

  • ExcelのVBAについて(再掲)

    ExcelのVBAについて(再掲) 以下のシートは作成中(勉強中)のものです。いずれは私的に実用しようと思っています。。 さて、質問ですが、「シート1のA3に入力、手動でシート2に移動自動で転記し、手動でシート1に移動し、また入力する」という単純動作を目的に作成しています。問題点は沢山ありますが、例えば『シート1の時間列が何かの変更で書き換えられてしまう』、『沢山書いていくと分かりますが、途中で行削除を行うと、時間列に削除行分の時間記録が下向きに書き込まれる』などです。他にもあると思っていますが、(1)この問題はなぜ発生するのか?(2)修正案としてはどの様な例があるか? 等をお聞きしたいです。細々と問題はあると思っていますので、その様な問題点もお聞きしたいです。 よろしくお願いします! '///Sheet1/// Private Sub Worksheet_Change(ByVal Target As Excel.Range) Dim time7 As Range For Each time7 In Target If time7.Column = 1 Then time7.Offset(0, 4).Value = Format(Now, "Short Time") & vbCrLf & _ Format(Now, "yyyy/mm/dd hh:nn:ss AM/PM") Application.EnableEvents = False Application.EnableEvents = True End If Next time7 Dim ws1 As Worksheet Dim ws2 As Worksheet Set ws1 = Worksheets("Sheet1") Set ws2 = Worksheets("Sheet2") ws2.Range("A3:H3").Value = ws1.Range("A3:H3 ").Value End Sub Private Sub Worksheet_Activate() Application.Goto ActiveSheet.Range("A3"), True Selection.EntireRow.Insert , CopyOrigin:=xlFormatFromLeftOrAbove Sheets("Sheet1").Range("H3").Select ActiveCell.FormulaR1C1 = "5" Sheets("Sheet1").Range("E3").Select Selection.ClearContents Dim str_Left As String 'セルE4に文字列、セルH4に数字を予め入れておくこと。 str_Left = Left(Cells(4, 5), Cells(4, 8)) MsgBox str_Left & vbCrLf & " " & "OKボタンを押してください!" Sheets("Sheet1").Range("A3").Select End Sub ' ///Sheet2/// Private Sub Worksheet_Activate() Application.Goto ActiveSheet.Range("A3"), True Selection.EntireRow.Insert , CopyOrigin:=xlFormatFromLeftOrAbove Sheets("Sheet2").Range("A3").Select End Sub

  • Excel VBAの質問です

    いつも識者の皆様にはお世話になっております。 Excel VBAのことで質問させてください。 下記のマクロで質問があります。 改善したい点はForEach~Next文の中の s.Range("A:A").Cells.EntireColumn.Insert s.Range("A:A").Cells.EntireColumn.Insert s.Range("A:A").Cells.EntireColumn.Insert s.Range("E1").Copy Range("A1,C1") s.Range("A1") = "ddd" s.Range("B1") = "eee" s.Range("C1") = "fff" の部分です。 (1)s.Range("A:A").Cells.EntireColumn.Insertを3つも書くのはスマートじゃないと思うんですが、何かいい構文はありませんか? (2)E1セルをコピーしてからC1に"fff"と入力するところまでの部分がデバッグモードでやればうまくいくんですが、普通にVBAを実行するとうまくいきません。 具体的にはA列に色をつけて塗りつぶしていた場合、1枚目のシートはB1セルだけ塗りつぶしがなくなって文字列"eee"が入っており、、A1・C1セルは塗りつぶしはありますが"ddd" "fff"の文字列が入っていません。 2枚目以降のシートはA1:C1までのセルにそれぞれ"ddd" "eee" "fff" が入力されていますが、塗りつぶしがなくなっています。 どこかしら構文がおかしいんだと思いますが、どこが悪いのかご指摘いただけますでしょうか。 上記2点以外にもどこか改善点があれば教えていただきたく思います。 識者の皆様、よろしくお願いいたします。 Sub test() Dim myPath As String Dim myFile As String Dim s As Worksheet myFile = Application.GetOpenFilename() If myFile = "False" Then MsgBox "cancel" Exit Sub End If Application.ScreenUpdating = False Application.Calculation = xlCalculationManual Workbooks.Open myFile myPath = ActiveWorkbook.Path & "\" myFile = "bbb_" & ActiveWorkbook.Name For Each s In ActiveWorkbook.Worksheets s.AutoFilterMode = False s.Range("A:A").AutoFilter field:=1, Criteria1:="<>ccc" s.AutoFilter.Range.Offset(1).EntireRow.Delete shift:=xlShiftUp s.AutoFilterMode = False s.Range("A:A").Cells.EntireColumn.Insert s.Range("A:A").Cells.EntireColumn.Insert s.Range("A:A").Cells.EntireColumn.Insert s.Range("E1").Copy Range("A1,C1") s.Range("A1") = "ddd" s.Range("B1") = "eee" s.Range("C1") = "fff" s.Cells.Font.Name = "Arial" s.Cells.ColumnWidth = 255 s.Cells.EntireRow.AutoFit s.Cells.EntireColumn.AutoFit Next ActiveWorkbook.SaveAs Filename:=myPath & myFile ActiveWorkbook.Close False Application.Calculation = xlCalculationAutomatic Application.ScreenUpdating = True MsgBox "DONE" End Sub

  • ExcelのVBAについて(勉強中のです。)

    ExcelのVBAについて(勉強中のです。) ここからコード3以降に入力したコードを抜き出してデータ表を作成しそれを保存するコードを作成したいです。例えばCSV形式にするとか? データ表は1日分の表示で、保存して週間や月間または統計データまでを視野にいれています。今回は保存する所です。。 利用しやすい状態と保存形式で、よろしくお願いします。データは生活記録みたいなものです。何したどうしたどうなった? ※大分分岐する予定で、作成中であり、今回はコードの整理は不要です。 '///Sheet1/// Private Sub Worksheet_Change(ByVal Target As Excel.Range) Dim time7 As Range For Each time7 In Target If time7.Column = 1 Then time7.Offset(0, 4).Value = Format(Now, "Short Time") & vbCrLf & _ Format(Now, "yyyy/mm/dd hh:nn:ss AM/PM") End If Application.EnableEvents = False Application.EnableEvents = True Next time7 '(1)シートを変数にセット Dim ws1 As Worksheet Dim ws2 As Worksheet Set ws1 = Worksheets("Sheet1") Set ws2 = Worksheets("Sheet2") '(2)シートを指定してデータを転記 ws2.Range("A3:H3").Value = ws1.Range("A3:H3 ").Value End Sub Private Sub Worksheet_Activate() ' ' 新規行挿入 ' ' Worksheets("Sheet2").Range("3:3").Insert Sheets("Sheet1").Range("H3").Select ActiveCell.FormulaR1C1 = "5" Sheets("Sheet1").Range("E3").Select Selection.ClearContents Dim str_Left As String 'セルE4に文字列、セルH4に数字を予め入れておくこと。 str_Left = Left(Cells(4, 5), Cells(4, 8)) MsgBox str_Left & vbCrLf & " " & "OKボタンを押してください!" Sheets("Sheet1").Range("A3").Select Dim se_r As String se_r = Application.InputBox("バーコードを入力してください") Select Case se_r Case "False" MsgBox "キャンセルされました" Case "" MsgBox "空欄が入力されました" Case Else Range("A3").Value = se_r End Select End Sub ' ///Sheet2/// Private Sub Worksheet_Activate() Dim Emp(1 To 300) As String Dim msg As String Dim i, i2, Cnt As Integer Dim N_In As Variant For i = 3 To 3 If IsEmpty(Cells(i, 1).Value) = False Then 'ここで空欄判定 Worksheets("Sheet1").Range("3:3").Insert '対象セルアドレスを改行処理 End If Next i '(1)シートを変数にセット Dim ws1 As Worksheet Dim ws2 As Worksheet Set ws1 = Worksheets("Sheet1") Set ws2 = Worksheets("Sheet2") ws1.Activate End Sub

専門家に質問してみよう