• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:実行時エラー’13’ 型が一致しません VBA)

実行時エラー’13’型が一致しません VBA

このQ&Aのポイント
  • VBAで実行時エラー’13’型が一致しませんというエラーが発生しています。
  • エラーの原因は、A1に「( 」が含まれており、文字列として扱われているためです。
  • また、変数を宣言していないため、「型が一致しない」というエラーが発生している可能性もあります。

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

  • ベストアンサー
  • kagakusuki
  • ベストアンサー率51% (2610/5101)
回答No.1

>原因はA1に「( 」があるので文字列だからだと思うのですが  その通りです。 >「IF 条件文」が成立しないことは満たすのでElse以下を実行されるのを期待していたのですが。  それは無理です。 If Cells(1, 1) - Cells(2, 1) = 1 Then という構文でIfの判定を行わせているという事は、 「まず実際に Cells(1, 1) - Cells(2, 1) という計算を行ってから、その値が =1 であるかどうかを判定しなさい」 という指示をしている事になります。  Cells(1, 1) の値が数値には変換出来ない種類の文字列である以上、 Cells(1, 1) - Cells(2, 1) という計算を行おうにも、「Cells(1, 1) の値が計算に使用可能な値ではない」、即ち「型が一致しない」のでエラーとなってしまいます。  ですから、まず先にCells(1, 1)とCells(2, 1)の値が「数値」或いは「数値に変換可能な文字列」であるかどうかを判定して、もし「数値」或いは「数値に変換可能な文字列」であった場合に初めて If Cells(1, 1) - Cells(2, 1) = 1 Then という処理を行う様にしなければなりません。  幸い、本件の場合は Cells(1, 1) - Cells(2, 1) = 1 である場合も、そうではない場合でも、どちらの場合においてもCells(3, 1)の値を変更する事に変わりはありませんから、まず先に Cells(3, 1)="c" としてしまってから、 >Cells(1, 1)とCells(2, 1)の値が「数値」或いは「数値に変換可能な文字列」であるかどうかを判定 と If Cells(1, 1) - Cells(2, 1) = 1 Then という処理へと進み、両方のIf文の判定が共にTrueだった場合にのみ、 Cells(3, 1) = 1 としてしまい、Elseは使用しなければ良い事になります。 Cells(3, 1) = "c" If IsNumeric(Cells(1, 1)) And IsNumeric(Cells(2, 1)) Then If Cells(1, 1) - Cells(2, 1) = 1 Then Cells(3, 1) = 1 End If

fisica
質問者

お礼

ありがとうございます。 なるほど、最初に答えを決定しておくのですか、それはすばらしいアイデアですね。 思いつきませんでした。 参考にさせてもらいます。 型のエラーはそういうことだったのですね。 調べていたのですが、変数宣言についての対処しか見つけられなかったので困っていました。 大変ためになりました。

その他の回答 (1)

  • kagakusuki
  • ベストアンサー率51% (2610/5101)
回答No.2

 因みに、もし Cells(1, 1) - Cells(2, 1) = 1 という条件が満たされた場合には「Cells(3, 1)の値を変更する」という処理を行い、満たされていなかった場合には「Cells(3, 1)の値を変更する事無く、別の処理を行う」などといったように、全く別の処理を行うという様な場合には、 Cells(1, 1) - Cells(2, 1) = 1 という条件が満たされた際に、まず Cells(3, 1) = 1 という処理を行ってから、Gotoステートメントを使って Cells(3, 1)="c" よりも後の行にジャンプてしまう様にすれば良いと思います。 Sub QNo9161130_実行時エラー13_型が一致しません_VBA_第2案() If IsNumeric(Cells(1, 1)) And IsNumeric(Cells(2, 1)) Then If Cells(1, 1) - Cells(2, 1) = 1 Then Cells(3, 1) = 1 GoTo ジャンプ先 End If End If Cells(3, 1) = "c" ジャンプ先: End Sub 【参考URL】  VBAのIE制御入門 > ExcelのVBA入門 > エクセルVBAのステートメント一覧 > VBAのGoToステートメント   http://www.vba-ie.net/statement/goto.html  又別の方法として、もしも Cells(1, 1) - Cells(2, 1) = 1 という条件が満たされた場合には、 Cells(3, 1) = 1 という処理を行うだけで、その後には何もする事が無く、マクロを終了するだけという場合には、 Cells(3, 1) = 1 の次の行の処で、Exit Subを使う事でその行の処でマクロが終わる様にされると良いと思います。 Sub QNo9161130_実行時エラー13_型が一致しません_VBA_第3案() If IsNumeric(Cells(1, 1)) And IsNumeric(Cells(2, 1)) Then If Cells(1, 1) - Cells(2, 1) = 1 Then Cells(3, 1) = 1 Exit Sub End If End If Cells(3, 1) = "c" End Sub

fisica
質問者

お礼

ありがとうございます。 いずれもIF文の類系なんでしょうけどいろいろやり方があるのですね。 勉強になりました。 状況に応じて使い分けたいと思います。 URLも参考になりました。 体系立って書かれていてわかりやすかったです。 お気に入りに入れました。

関連するQ&A

専門家に質問してみよう