- ベストアンサー
変数の定義について
- 変数の定義について他のブックから検索値をVLOOKで転記させるマクロを作成しましたが、変数の型宣言が上手くないために転記処理ができません。
- 変数宣言部分をコメントアウトすると動作しますが、宣言部分をコメントアウトして動作確認した結果、『Dim 検索値 As Double』があると動作しないことが分かりました。
- Valiantに変更しても動作しなかったため、この原因をご存知の方は助けてください。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
普通、モジュールレベルの変数の宣言をする必要はないと思います。Sub プロシージャ内に入れてあげればよいと思います。どういう目的なのか分かりませんから、会社名と検索値だけは、外に出しておきます。 If 検索値 = "" Then Exit Do 文字比較しているのですから、Double型で比較したら、エラーが発生します。 Double型ですと、何もデータが入っていないのか、それとも、0 なのか比較できません。 Range 型のまま、IsEmpty という方法もありますが、一般的には、セルの値には、If 検索値 = ""としますから、検索値のデータ型は、Variant 型でおけばよいです。慣例的なものです。 また、On Error Goto ErrorHandler では、ピンポイントエラーは検出できません。 掲示板では、違った書き方が流れているようですが、一般的には、以下のような方法が良いと思います。 ところで、VBAは、なるべく、2バイト文字の変数は使いづらいのでやめたほうがよいです。私の場合は、Excel の他のバージョンも入れていますので、検索が使えないという不具合があるからです。 '// Dim 会社名 As String Dim 検索値 As Variant 'Double Sub 一覧() Dim Base As Workbook, Code As Workbook Dim 範囲 As Range Dim i As Long Set Base = Workbooks("転記元.xls") Set Code = Workbooks("転記先.xls") Set 範囲 = Base.Worksheets("転記元").Range("A4:AX5000") Do 検索値 = Code.Worksheets("転記先のシート").Cells(i + 2, 1).Value If 検索値 = "" Then Exit Do On Error Resume Next 会社名 = "" '一旦、空にする。そうしないとエラー時に更新されない 会社名 = Application.WorksheetFunction.VLookup(検索値, 範囲, 6, False) On Error GoTo 0 If 会社名 <> "" Then Code.Worksheets("転記先のシート").Cells(i + 2, 2) = 会社名 End If i = i + 1 Loop End Sub
その他の回答 (1)
- mar00
- ベストアンサー率36% (158/430)
間違っていたらすいません。 検査値がどのような値になっているかわかりませんが 整数型なら Dim 検索値 As Integer(-32,768 ~ 32,767 の範囲の値) 長整数型なら Dim 検索値 As Long(-2,147,483,648 ~ 2,147,483,647 の範囲の値) 文字列型なら Dim 検索値 As String あたりではないでしょうか。
お礼
お返事ありがとうございました。 情報が中途半端で申し訳ありません。検査値は6桁の整数です。 変数の型名を調べる~TypeName関数を使って調べたら、「Double」と出たので それを用いました。 また、回答をいただいた「Integer」「Long」「String」でテストしましたが 同じ結果となりました。 貴重な時間を割いていただきありがとうございました。
お礼
回答ありがとうございます。希望通りの動作になりました。 モジュールレベルの変数にしたのは、同モジュール内で取り込んだリストをソートする等 といった小さなマクロでも使用するためです。ご指摘いただいた2バイト変数名についても 修正したいと思います。ありがとうございました。