• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:アプリケーション定義またはオブジェクト定義のエラー)

アプリケーション定義またはオブジェクト定義のエラー

このQ&Aのポイント
  • VBAを勉強して1週間ほど経ち、アプリケーション定義またはオブジェクト定義のエラーが発生しました。エラーの原因や解決策を探しているが見つからず、質問をすることになりました。
  • あるSUBプロシージャで表を作成しており、その表をクリアするためのSUBプロシージャを作成しました。しかし、Rangeプロパティの行でエラーが発生しています。デバッグモードで確認してみると、変数の値は正しく入っているようです。なぜエラーが発生しているのか、理解できていません。
  • 問題の箇所はRangeプロパティの行で、変数を使用するとエラーが発生し、数値を直接指定すると正常に動作します。原因や解決策を教えていただけると助かります。

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

  • ベストアンサー
  • hotosys
  • ベストアンサー率67% (97/143)
回答No.3

excelの変数の扱いはいい加減(良く言えば柔軟)で Cells("1", 2) などは、 Cells(1, 2) に変換してくれると思います。 これはCells(行,列)の行側は必ず数値なので、勝手に変換する(してくれる?)のだけれど、列側は数値の場合の他に"A"や"B"と文字列で指定する場合があると思います。 Cells(1,1) は Cells(1,"A") ともかけると思います。 なので Cells(1,"1") の列側は数値と文字列で全く違う扱いなので、さすがに"1"を勝手には数値化できないのだと思います。 試しに列側の文字列をval関数で数値化する Worksheets("計算").Range("d7", Cells(MaxRow, Val(MaxCol))).ClearContents がエラーにならないのはもちろん、列側の文字列に数値の0を加えて Worksheets("計算").Range("d7", Cells(MaxRow, MaxCol + 0)).ClearContents としても、文字+数値は数値として扱ってくれるので、エラーにはならないと思います。 ただ、文字列同士の足し算は思わぬ値なので注意が必要だと思います。 Sub sample() Dim a As Integer Dim b As Integer Dim c As String Dim d As String a = 1 b = 2 c = "3" d = "4" MsgBox a + b ' 1 + 2 = 3 (数値同士なので足し算) MsgBox c + d ' "3" + "4" = "34" (文字列同士なので、文字列の結合) MsgBox c + a ' "3" + 1 = 4 '文字列と数値の足し算なので文字列を数値化して足し算 End Sub

suzuki_yuu
質問者

お礼

なるほど。 そういうことなんですね。 まさに霧が晴れたとはこのことです。 大変ありがとうございます。 VAL関数なども初めて知りました。 試したら問題なく動作すしました。 まだまだ、知らないことばかりですがこれから勉強していきます。 ありがとうございます。

その他の回答 (2)

  • layy
  • ベストアンサー率23% (292/1222)
回答No.2

困ったときは、眺めてもわからないもの。 今回のは IF MAXCOL=16 THEN や IF MAXCOL="16" THEN 等して検証 罠を仕掛けるのも手法。 少し見直しで 質問しないでも自己解決できるほうが良い。 定義エラーだから定義もみる。 さらなるデバッグをしてほしい。投稿し回答待っている時間がもったいない。

suzuki_yuu
質問者

お礼

確かに自己解決できるのが一番よいですね。 もちろんただ眺めていたわけではないです。 今の自分に出来ることや書籍の購入などして調べましたが、はっきりと分かりませんでした。 バリアント型にすれば動作することも確認してますし(実際その状態で使用してました) Msgboxにて変数に数値が代入されているかなどの確認もしました。 使用に関してはまったく問題なかったのですが、なにぶん気持ち悪かったので、 はっきりとした答えが知りたく思い質問させていただきました。 そういう意味では、回答者(3)さんの回答で霧が晴れた感じです。 なにぶんやり始めて1週間(延べ7~8時間ぐらいの知識)しかないため、 デバッグのやり方や柔軟な解決方法などなかなか思いつきませんでした。 今後も質問させていただく可能性はありますので、その時も忌憚のない意見を お願いします。 ありがとうございます。

  • MARU4812
  • ベストアンサー率43% (196/452)
回答No.1

> Dim MaxRow As String '表の最終行を取得 > Dim MaxCol As String '表の最終列を取得 どちらも文字列型ではなく数値型で定義してみて下さい。

suzuki_yuu
質問者

お礼

Dim MaxRow As Integer '表の最終行を取得 Dim MaxCol As Integer '表の最終列を取得 型宣言を変更したら問題なく動作しました。 ありがとうございます。 実は、バリアント型にすれば、動作するのが分かっていたのですが、 数値型にすればよいことは思いつきませんでした。 今一型宣言の意味を理解していませんでしたが、今回のことで、 なんとなく分かった気がします。 ありがとうございました。

関連するQ&A

専門家に質問してみよう