- ベストアンサー
VBAの「型が一致しません」の原因がわかりません
- Excel2013でVBAを動かすと「型が一致しません」と表示され、動作が中断されます。
- 問題箇所を特定し、エラーを解決するために「on Error Resume Next」を使えますが、改善方法を知りたいです。
- 「型が一致しません」というエラーメッセージの原因と解決策について教えてください。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
>If Month(Range("H" & i)) <> Month(Range("H" & i + 1)) Then 後ろのRangeの引数だけど 最初は、i=2 なので「"H" & i」は「"H2"」になる。 それに「+ 1」するのだけれど、「"H2" + 1」はデータの型が違うので計算できないのでは? もし"H"に(i+1)を付け足したいなら Range("H" & (i + 1)) としないとだめです。 もっと厳密に言えば、数値変数を&演算子で付け足すのはデータ型を無視した書き方なので 以下のようにしてほしい。 If Month(Range("H" & CStr(i))) <> Month(Range("H" & CStr(i + 1))) Then
その他の回答 (4)
- imogasi
- ベストアンサー率27% (4737/17069)
処理データに起因するエラーではないか。コードばっかり目が行ってはだめ。データが不適当ならプログラムエラーなどすぐ起きる。 実情を知られたくないため、データを質問に載せない質問者がほとんどだが、問題のデータ行なり、要約して、質問にあげて回答を求めるべきだ。 ーー 日付かどうか、日付でない、可能性が多い。IsDate関数でも直前にかまして、チェックしてはどうか。それ以前に,シートのH列のデータを見れば、日付かどうか、わかりそうなものだ。 ーー 私製テストデータ H,I,J列 2015/8/28 a b 2015/8/29 a b 2015/8/30 a b 2015/8/31 a b 2015/9/1 a b 2015/9/2 a b 2015/9/3 a b 2015/9/4 a b 2015/9/5 a b 2015/9/6 a b 2015/9/7 a b 結果 A-B,C列 2015/8/28 2015/8/29 2015/8/30 2015/8/31 a b 2015/9/1 2015/9/2 2015/9/3 2015/9/4 2015/9/5 2015/9/6 2015/9/7 a b データ最終行にa、bが出るが,質問者の掲出したコードのロジックがまずいのではないのか。(質問には目的や処理概要だは書くこと。コードをコピペで済ますのは、楽だけれど適当でない) 質問のコードの通りだと、B-C列全行a,bが出てしまうので下記に(仮定)してみた。 --- コード Sub test01() Dim i As Long, k As Long, MaxRow As Long MaxRow = Range("H" & Rows.Count).End(xlUp).Row MsgBox MaxRow k = 2 For i = 2 To MaxRow If Month(Range("H" & i)) <> Month(Range("H" & (i + 1))) Then '← ここで中断する 次の行と比較. H列は日付 MsgBox Month(Range("H" & i)) & "=" & Month(Range("H" & (i + 1))) Range(Cells(i, 8), Cells(i, 10)).Copy 'H-J列コピー Cells(k, 1).PasteSpecial Paste:=xlPasteValues 'A-C列に貼り付け Else '月が次行で変われば MsgBox Month(Range("H" & i)) & "=" & Month(Range("H" & (i + 1))) ' MsgBox Format(Range("H" & i), "yyyy/mm/dd") Cells(i, 8).Copy 'H 列だけコピー <==これで意図通りか Cells(k, 1).PasteSpecial Paste:=xlPasteValues 'A列だけに貼り付け End If k = k + 1 Next i End Sub Next iなどを質問のコードに入れて一応動く形にして質問のこと。
お礼
ありがとうございます。無事に解決しました。 Range("H" & (i + 1)) に変更したら、エラーなく動作しました。 質問の投稿に不慣れだったため、適切に質問できませんでした。 コードだけではなく、動作内容も説明に入れるべきでした。 勉強になりました。
- dogs_cats
- ベストアンサー率38% (278/717)
全てのコードが記載されていないので何とも言えませんが、on Error Resume Next がこのコードでは必要な構文では無いと思いますが、本当に必要なのでしょうか? on Error Resume Next を冒頭に挿入してもエラー無く実行しました。 Range("H" & i).Valueとでもして確認下さい。特に問題になるような構文じゃないですよね。 If Month(Range("H" & i).Value) <> Month(Range("H" & i + 1).Value) Then 処理速度が遅くなるだけなのでコピーは出来るだけ使用しないほうが良いですよ。 値だけ必要なら下記コードで可能です。 Range(Cells(k, 1), Cells(k, 3)).Value = Range(Cells(i, 8), Cells(i, 10)).Value 書式を含むコピーをしたい場合は.Copy Destinationを使用すると高速化出来ます。 http://www.happy2-island.com/excelsmile/smile03/capter00507.shtml
お礼
ありがとうございます。無事に解決しました。 コピー&ペーストは処理速度が遅くなるようですが、 変数を利用し、コピー&ペーストを使わない方法がわかりませんでした。 勉強になりました。
- eden3616
- ベストアンサー率65% (267/405)
No1の例で訂正です debug.Print month("平成27年9月") debug.Print month("27-9-1") ←訂正(「27-9」では「2015/09/27」として扱われます) debug.Print month("H27/9") debug.Print month("9/1") ←訂正(「9/1」のシリアル値は「42249」です) また結果は何れも2015/9/1として扱われるため、monthにより「9」が得られます。
- eden3616
- ベストアンサー率65% (267/405)
H列に入っている値が何か提示されてないので分かりませんが シリアル値として認識できていないかと。 たとえば日付と認識できない文字列を引数としてMonthに使うと「型が一致しません」と表記されます。 [ヘルプ引用]_________ Month(date) 引数 date は必ず指定します。引数 date には、日付を表すバリアント型 (Variant) の値、数式、文字列式、またはこれらを組み合わせた値を指定します。引数 date が有効な値を含まない場合は、Null 値を返します。  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ たとえば debug.Print month("平成27年9月") debug.Print month("27-9") debug.Print month("H27/9") debug.Print month("9/2") などは2015/9/1のserial値「42248」として扱われます。 ですが以下の場合は「型が一致しません」とエラーになります。 指定された引数をシリアル値として認識できないため、Monthで月を取得できないためです。 debug.Print month("文字列") debug.Print month("へいせい27/9") 全てにエラーが出る場合でない場合、入力されたセルの値でエラーのでた際に変数「i」の値をデバック画面で確認して該当行のH列の値を確認してください。 エラー時の変数の中身は以下の方法の何れかで確認できます。 ・エラー時のデバック画面でiにカーソルを合わせると変数の内容が表示される ・VBEの表示→ローカルウィンドウを表示させる ・ループの先頭に「debug.print i」などでループごとの変数値を書出す (最後に書出されたところがエラー時の「i」の値) ・「on error goto ラベル名」をコード冒頭に入れ、エラーラベルの箇所で「i」を書出す 該当のセルの内容が上記のようにシリアル値に変換可能な日付として認識できない値でないか確認して下さい。
お礼
ありがとうございます。無事に解決しました。 変数の中身の確認方法等、勉強になりました。
お礼
ありがとうございます。 Range("H" & (i + 1)) に変更したら、エラーなく動作しました。 変更はCStr関数で記述しました。