• 締切済み

VBAで変数定義の必要性について

==(1)================= Dim abc As Long abc = 5 ===================== ==(2)================= abc = 5 ===================== あるパソコンで(2)のコードで 「オブジェクトまたはライブラリが見つかりません」 とのエラーになります。(多数のパソコンでエラーになりません) VBAに対して、変数が定義されなくても、値をセットされた際に、 変数属性を与えるとのように考えれば良いですか。 以上、よろしくお願いします。

みんなの回答

回答No.5

==(1)================= Dim abc As Long abc = 5 ===================== ==(2)================= abc = 5 ===================== (2)の場合、abcという変数はVariant型になります。 よって、処理する度に内部で自動的に型確認・変換が行われ、 処理が遅くなると共に、 色んな型の値を代入する事が可能ですので、 値の変化を確認する事が難しくなり、 その分のメモリ容量も消費されます。 上記の場合、(A)では変数abcに4バイトを消費していますが、 (B)では数値を保持するのに16バイト、 文字を保持するのに22バイト+文字数を消費しています。 Variantでないと処理出来ない場合以外にはVariantは利用するべきではありません。 望ましいのは、No.1でも回答があるよう、モジュール毎に(General) Declaration内で Option Explicitと記述しておき、 変数宣言が無い変数は利用出来なくする事です。 変数名間違いによるバグを抑制出来ます。 > 「オブジェクトまたはライブラリが見つかりません」 とのエラーになります。(多数のパソコンでエラーになりません) この症状は、上記(B)だけを記述した場合には発生しません。 別の問題でしょう。 Private Sub Workbook_Open() abc = 5 End Sub

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.4

#3のWendy02です。 以下、読み違えました。失礼しました。 >>VBAに対して、変数が定義されなくても、値をセットされた際に、変数属性を与えるとのように考えれば良いですか。 自動キャストは、VB/VBAの専売専用みたいなものですが、それをすると、いろんな障害が現れます。確かに、ある程度は可能ですが、キャスト(型の変換)をすると遅くなるのと、読み違いが起きて、エラーが発見ししづらくなります。 それから、コードは、行の抜き出しで、後は、回答者さんたちに想像し、考えてください、というよりは、全体が見通しできるような形で掲示してほしいものです。

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.3

こんばんは。 Excel VBAだと思いますが、ブックで作ったバージョンと使用するバージョンの違いで、参照設定が合っていないとしか考えられません。#1のhana-hana3さんの示した、AccessClub の参照設定を調べてみてください。 >VBAに対して、変数が定義されなくても、値をセットされた際に、変数属性を与えるとのように考えれば良いですか。 面倒でも、変数の宣言をしなくては、VBAが上達しませんよ。

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.2

Option Explicit Sub test01() abc = 5 MsgBox abc End Sub で実行すると 「コンパイルエラー」「変数が定義されていません」と出ます・ 「オブジェクトまたはライブラリが見つかりません」 はどのようなときに出たのでしょうか。それが質問でしょうか。 VBAはエクセル、アクセス・・なんでしたか。 >VBAに対して、変数が定義されなくても、値をセットされた際に、 変数属性を与えるとのように考えれば良いですか。 ミスタイプがあるようで、意味がわかりにくいように思います。 この表現で正しいのでしょうか。

  • hana-hana3
  • ベストアンサー率31% (4940/15541)
回答No.1

こちらでしょう。 コードモジュールの先頭に Option Explicit が書かれていると、変数定義を強制します。 変数定義をしない場合、予想外の値(属性)になってしまう場合もあるので、注意しましょう。 http://www.accessclub.jp/vba/vba_016.htm http://oshiete1.goo.ne.jp/kotaeru.php3?q=1735354

関連するQ&A

  • VBAで変数定義を変更する方法

    Data_Typeという変数の中に文字列doubleが入っていたら、 AIyyという変数をdoubleで定義、 longが入っていたらlongで定義するというプログラムを作りたいのですが If Data_Type = "double" Then Dim AIyy As Double ElseIf Data_Type = "long" Then Dim AIyy As Long End If と書くと、定義が重複しているというエラーが表示されてうまくいきません。 これはどうすれば良いでしょうか? それと一度integerで定義した変数をlongなどに定義を変更したい場合どのようにすれば良いでしょうか?

  • 配列にすると変数が入らない

    お世話になっています MS Excel2003のVBAで質問です find関数の結果を オブジェクト型変数だと入るのに、オブジェクト型配列だと入らない、 そういう仕様なんでしょうか? 成功 Dim result As Object Set result = wb2.Worksheets(1).Range(Cells(2, num), Cells(500, num)).Find(key) 実行時エラー1004 アプリケーション定義またはオブジェクト定義のエラーです Dim result(10) As Object '検索結果 Set result(0) = wb.Worksheets(1).Range(Cells(i, num), Cells(500, num)).Find(key)

  • 変数の定義について

    変数の定義について 変数の定義について 他のブックから検索値をVLOOKで転記させるマクロをこちらの掲示板ログなどを 拝見しながら、ツギハギして作成しました。 転記先のシートのA列に区別コードを設けています。 これを基に転記元のブックから社名などを転記させようと思っているのですが、 変数の型宣言が上手くないらしく?転記処理が出来ません。 「Option Explicit」と「変数宣言」をコメントアウトすると動作します。 変数の宣言が違うのだろうか?と宣言部分をコメントアウトして動作確認して いったら、「Dim 検索値 As Double」があると動作しないようなのです。 これをValiantに変更しても動作しませんでした。 この原因が分かる方、どうぞ助けてください。 //////////////////////////////////////////////////////// Dim Base As Workbook, Code As Workbook Dim 範囲 As Range Dim i As Long Dim 会社名 As String Dim 検索値 As Double ←←←←←←←←←←←←←←←←←ここの部分? Sub 一覧() Set Base = Workbooks("転記元.xls") Set Code = Workbooks("転記先.xls") Set 範囲 = Base.Worksheets("転記元").Range("A4:AX5000") On Error GoTo ErrorHandler Do 検索値 = Code.Worksheets("転記先のシート").Cells(i + 2, 1) If 検索値 = "" Then Exit Do 会社名 = Application.WorksheetFunction.VLookup(検索値, 範囲, 6, False) Code.Worksheets("転記先のシート").Cells(i + 2, 2) = 会社名 i = i + 1 Loop Error トラップ開始 ErrorHandler: 会社名 = "" Resume Next End Sub ////////////////////////////////////////////////////////

  • VBAのオブジェクト変数について

    人に教えなければいけないことなので、、、 困っています。 あるVBAのテキストを見て、そのテキストをそのまま入力しても実行できません。 (条件としては、Book1.xlsとBook2.xlsというファイルを開いた状態で、Book1.xlsのほうに、以下のモジュールを入力します。) Sub Set1() Dim myBook As Workbook Dim mySheet As Worksheet Dim myCell As Range Set myWBook = Workbooks("Book2.xls") Set myWSheet = Worksheets("Sheet2") Set myCell = Range("A1:D10") myWBook.Activate myWSheet.Activate myCell.Value = "ABC" End Sub これを実行すると、アクティブな状態のファイルにしか、値"ABC"が入ってこないのです。テキストでは、Book2.xlsのSheet2のA1:D10に値"ABC"が入ってくると言っていますが、Book1.xlsに値が入ってしまったりします。 長くなってしまってすみません。 もちろん、他の方法で実現することができるのはわかるのですが、なぜこのコードが実行できないのかがわかりません。 理由を教えていただけたら・・・と思います。 よろしくお願いいたします。

  • VB6にて文字型変数の内容をオブジェクト変数に代入する方法

    VB初心者ですが オブジェクト変数に文字型変数で作成した オブジェクト名を代入したいのですが 上手くいきません。 Dim anyCmb As ComboBox Dim cmb_name As String cmb_name = "ABC" Set anyCmb = cmb_name 誰かわかる方がいましたら、教えてください。 よろしくお願いします。

  • VBA オブジェクト定義エラー

    VBA初心者です。 アプリケーション定義エラーまたはオブジェクト定義エラーが出ました。 原因を教えてください。 A=2800 B=3300 委託料=AとBの合計の5% Cell(5,j)のセルにAとBの合計の5%の数値"305"を入力したいです。 Sub syouhinbubetu() Dim Sheetobj As Worksheet Dim A As Integer Dim B As Integer Dim 委託料 As Integer Set Sheetobj = ThisWorkbook.Worksheets("Sheet1") With Sheetobj A = .Cells(3, j) B = .Cells(4, j) 委託料 = .Cells(5, j) For j = 3 To 6 .Cells(5, j) = (A + B) * 0.05 Next j End With End Sub 定義は、きちんと整数の定義にしているはずなのですが、どうしてでしょうか? それから、もう一つ教えてください。 C/Dの値をセルに入れるのは次の式でよいと思いますが、 .Cells(7,j)=C/D その数値が少数になる場合四捨五入をした値(小数点以下すべて切り捨て)を入れる場合はどのような式になりますか? 初心者過ぎて申し訳ありません。 VBAの基本の本で勉強したのですが、それを応用して実践する場合にどのようなプログラムになるのかが分かりません。 良い本があれば紹介していただけないでしょうか。 私が勉強した本は、「世界で一番簡単なExcel VBAのe本」です。 分かりやすい応用編の本があれば教えてください。 たくさんの質問で申し訳ありませんが、よろしくお願いいたします。

  • VBA オブジェクトが空かどうか判定する

    皆様のお知恵を拝借させてください。 エクセルVBAでオブジェクトを入れる変数を定義し、その変数にオブジェクト が入っているかどうか検査したいのですがどうしたらいいでしょうか。 例えば--- Dim a As Workbook If a <> nothing then ←この部分が分からない。このままだとエラー。 処理 End if --------- 環境 エクセル2003 WinXPsp1

  • VBAでOracleにSQL発行(ADO)

    ExcelのVBAからOracleにADOで登録したく下記のコードを作成しましたが コンパイルで"変数定義がされていません”に成ってしまいます。 参照設定に何か必要なのでしょうか? ----------------------------------------------- 'ADO用のオブジェクト変数の宣言 Dim cn As New ADODB.Connection ← ここでエラー Dim rs As New ADODB.Recordset Dim rownum As Long Dim colnum As Integer 'ADOコネクションの生成 cn.Open "Provider=OraOLEDB.Oracle;Data Source=" & ActiveSheet.Cells(26, 1) & ";User ID=scott;Password=tiger;", "scott", "tiger" 'ADOレコードセットの生成(全データを返すレコードセットの生成) rs.Open "select * from emp", cn, adOpenDynamic, adLockOptimistic, adCmdText ... ... ...

  • VBAで変数定義のコンパイルエラーの解消

    VBAでOutlookのメールを自動作成するコードをネットで探して実行したら最初の『Dim OutlookAP As Outlook.Application』のところで『コンパイルエラー:ユーザ定義型は定義されていません。』というメッセージが出て止まってしまいます。Outlookは起動してからVBAを実行しています。VBAの初心者です。この解消方法を教えて頂きたいので、よろしくお願いいたします。

  • VBAの内容について

    エクセルファイルのVBAを少し手直ししたいのですが、 超初心者で行き詰っております。 下記は全体の一部なのですが、、どんな内容を表しているのか 教えていただけないでしょうか? 調べてみても、変数を定義して、計算している(?) くらいしかわかりませんでした。 Public Sub abc計算() Dim vi As Class1 Set vi = New Class1 Dim k As Long For k = CLng(vix_ro) To 6 Step -1 If (vi.abc_flg(CLng(k - 1), 6) = True) Then si_to.Cells(CLng(k - 1), 6).Value = "○" End If Next End Sub excel2007 vista使用です。 どうぞよろしくお願い申し上げます。

専門家に質問してみよう