変数の定義について

このQ&Aのポイント
  • 変数の定義について他のブックから検索値をVLOOKで転記させるマクロを作成しましたが、変数の型宣言が上手くないために転記処理ができません。
  • 変数宣言部分をコメントアウトすると動作しますが、宣言部分をコメントアウトして動作確認した結果、『Dim 検索値 As Double』があると動作しないことが分かりました。
  • Valiantに変更しても動作しなかったため、この原因をご存知の方は助けてください。
回答を見る
  • ベストアンサー

変数の定義について

変数の定義について 変数の定義について 他のブックから検索値を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 ////////////////////////////////////////////////////////

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

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.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

quia_10
質問者

お礼

回答ありがとうございます。希望通りの動作になりました。 モジュールレベルの変数にしたのは、同モジュール内で取り込んだリストをソートする等 といった小さなマクロでも使用するためです。ご指摘いただいた2バイト変数名についても 修正したいと思います。ありがとうございました。

その他の回答 (1)

  • mar00
  • ベストアンサー率36% (158/430)
回答No.1

間違っていたらすいません。 検査値がどのような値になっているかわかりませんが 整数型なら   Dim 検索値 As Integer(-32,768 ~ 32,767 の範囲の値) 長整数型なら   Dim 検索値 As Long(-2,147,483,648 ~ 2,147,483,647 の範囲の値) 文字列型なら   Dim 検索値 As String あたりではないでしょうか。

quia_10
質問者

お礼

お返事ありがとうございました。 情報が中途半端で申し訳ありません。検査値は6桁の整数です。 変数の型名を調べる~TypeName関数を使って調べたら、「Double」と出たので それを用いました。 また、回答をいただいた「Integer」「Long」「String」でテストしましたが 同じ結果となりました。 貴重な時間を割いていただきありがとうございました。

関連するQ&A

  • シート毎にマクロでVOOKをしたい

    シート毎にマクロでVOOKをしたい 先日、こちらで回答を頂いたコードを用いて、顧客会社一覧から顧客個人名別の名簿を を作成しようと思っております。 ですが、この名簿が「あ」~「わ」行まで各シートに分かれています。 コードを「あ」~「わ」行まで順に書いていく方法の他に、もう少し簡易的な方法は ないかと思い、質問をしました。他にもやり方があればご教授ください。 #シートは「あ」~「わ」まで分かれており、フォーマットは統一している #検索値(顧客個人名番号)は各シートのA列に設けている ///////////////////////////////////////////////////////////////////////////////// Sub 一覧() Dim Base As Workbook, Code As Workbook Dim myrange As Range '転記先の範囲 Dim i As Long Dim strname As String '顧客個人名 Dim vntSearch As Variant '顧客個人番号   Set Base = Workbooks("転記元.xls")   Set Code = Workbooks("転記先.xls")   Set myrange = Base.Worksheets("転記元").Range("A4:AX5000") Code.Worksheets("あ").Range("B2:F200").ClearContents Code.Worksheets("い").Range("B2:F200").ClearContents   Do '------------------------------------------------------------------------------- 'あ行     vntSearch = Code.Worksheets("あ").Cells(i + 2, 1).Value     If vntSearch = "" Then Exit Do     On Error Resume Next     strname = ""     strname = Application.WorksheetFunction.VLookup(vntSearch, myrange, 6, False)     On Error GoTo 0     If strname <> "" Then       Code.Worksheets("あ").Cells(i + 2, 2) = strname     End If '------------------------------------------------------------------------------- 'い行     vntSearch = Code.Worksheets("い").Cells(i + 2, 1).Value     If vntSearch = "" Then Exit Do     On Error Resume Next     strname = ""     strname = Application.WorksheetFunction.VLookup(vntSearch, myrange, 6, False)     On Error GoTo 0     If strname <> "" Then       Code.Worksheets("い").Cells(i + 2, 2) = strname     End If     i = i + 1   Loop ↓↓↓この先 ~「わ」までコードを書く以外に方法があるのかが知りたい↓↓↓ End Sub /////////////////////////////////////////////////////////////////////////////////

  • 変数を動的に作るには?

    変数を作成する際には必要な分だけ一つずつ宣言する必要があるのでしょうか? 例えば、連番を格納する文字列型変数を一時的に100個必要だとすると Dim textdat1 As String = "Number1" Dim textdat2 as String = "Number2" Dim textdat3 as String = "Number3"      ・      ・      ・ と100個宣言しないといけないと思うのですがこれを For i As Integer = 1 To 100 Dim textdat(i) As String = "Number" & i Next i という様な形で変数を作成することは出来ないのでしょうか。 初歩的な質問かもしれませんが、よろしくお願いします。

  • Excelマクロで別のブックをVLOOKした際のエラー処理

    Excelマクロで別のブックをVLOOKした際のエラー処理 【やりたいこと】 VLOOKで検索値から別のブックの値を拾い、検索値が見当たらない場合は "該当なし"を入力して、次の検索値に移り作業を再開させたい 【 困っていること 】 1:検索値が無くても適当な値を拾ってしまう(VLOOK関数でTRUEを指定したみたいに) 2:処理終了後に「Base.Close」を指定してるが、閉じないで残ったままになる どこを見直せば良いのか、全く検討が付かず困っています。 どなたかご教授お願いします。 【その他の質問】 教えてgooにはソフトウェアのカテゴリに"MS Office"と"Office系ソフト"がありますが、 今回の質問内容だと、どちらのカテゴリが相応しいのでしょうか? ---------------------------------------------------------------------------------- Sub 検索して値を取得する() Dim Base As Workbook Dim 出力 As Worksheet Dim 範囲 As Range Dim 検索値, i As Long Dim 検索結果 As String Set Base = Workbooks.Open"C:\~\Book1.xlsm", ReadOnly:=True, UpdateLinks:=0) Do Set 範囲 = Base.Worksheets("全体").Range("A2:D20") Set 出力 = Workbooks("検索結果.xlsm").Worksheets("Sheet1") Set 検索値 = Workbooks("検索結果.xlsm").Worksheets("Sheet1").Cells(i + 2, 1) If 検索値.Value = "" Then Exit Do On Error GoTo ErrorHandler 検索結果 = Application.WorksheetFunction.VLookup(検索値, 範囲, 2, False) 出力.Cells(i + 2, 2).Value = 検索結果 i = i + 1 Loop Exit Sub ErrorHandler: 出力.Cells(i + 2, 2).Value = "該当なし" Resume Next Base.Close savechanges:=False End Sub ----------------------------------------------------------------------------------

  • 「変数の宣言」と「変数の定義」は同じ意味ですか?

    Dim myStr As String は、変数の宣言と定義、どちらになるのでしょうか? どちらともいいますか?

  • ExcelVBAの転記(1つのひな形へ複数シート)

    お世話になります。ExcelVBAを少し学んだ程度の者です。 1つのExcelファイルに複数存在する個別のシートから、1つのひな形シートへ転記する方法に頭を悩ませております。イメージとしては名簿管理のようなものとご理解してください。 複数存在するシート(約200シート)には、項目名に対するデータ(例えば、名前や住所などが定められたセルに入力されています)が揃っておりますが、書式の変更によりひな形のシートへ転記する必要があります。 200ほどのシートには、M10セルには名前が、B15セルには住所、C16セルには電話番号が……という具合に入力されています。これらのデータをひな形シートでは、N5セルに名前、C13セルに住所、D14セルには電話番号などを転記する必要があります(セル番地は適当です)。 ひな形シートは1枚で、マクロを実行する際にひな形シートをコピーして(Xとします)、200ほどの個別のシート(A、B、C……)を転記しようと思っております。A、B、C……に入力された複数の値は項目別にCells(i,j).Valueを、XへCells(x,y).Valueへ転記すれば良いと考えておりましたが、上手くいきません。ひな形をコピーしたXのシートへ上手く転記ができず、Aを転記したシートばかりが量産され、B、C以降のシートへ制御が移っていないようです。恐らく、Workwsheetオブジェクトのカウンタ変数に問題があると思われます。 VBAのコードとしては下記のように記述しております。 Sub SheetCopy() Application.ScreenUpdating = False Dim cnt As Long 'シート数カウント変数 Dim i As Long 'シート用のカウンタ変数 Dim wb As Workbook 'コピー元 Dim ws1 As Worksheet 'コピー元 Dim ws2 As Worksheet 'コピー先 '1がコピー元で2がコピー先 cnt = Worksheets.Count 'シート数をカウント i = 2 Set wb = Workbooks("転記用.xlsm") Set ws1 = wb.Worksheets(i) Set ws2 = wb.Worksheets("ひな形") For i = 1 To cnt ws2.Copy after:=Worksheets(i) Set ws2 = wb.Worksheets(i) ws2.Cells(2, 2).Value = ws1.Cells(2, 13).Value '名前 ws2.Cells(3, 2).Value = ws1.Cells(6, 10).Value '住所 以下、同様の転記処理を記述しています。 Next i End Sub 上記のコードを、パッと見たところ、コピーはしているものの、転記先がコピー元になっているのも原因だと思います(コピー先へ転記する方法が現時点でわかりかねます……ここがネックだと考えております)。 ご知見のある方々から、アドバイスをいただけると幸いです。 どうぞ、よろしくお願い申し上げます。

  • エクセル VBA シート名を別シートにコピー

    早速の質問ですが エクセルVBAで シート名を別シートにコピーなのですが 10個のシートを順にシート名をコピー&ペーストしたいのです。 Dim aworkbook As Workbook Dim bworkbook As Workbook Set bworkbook = ActiveWorkbook Workbooks.Add Set aworkbook = ActiveWorkbook for i=1 to 10 bworkbook.Activate Worksheets(i).Select Application.CutCopyMode = False aworkbook.Activate Worksheets(i).Select ここに入る文章がわかりません Range("A1").Select next と以上な感じで作ってみたのですが どう貼り付けして良いかわからない状況です nextでまわす以上変数でなければだめなんでしょうけれども 構文が思いつきません。 皆様よろしくお願いいたします。

  • エクセルマクロ 変数をワークシート名で使用したい

    Dim ws1 As Worksheet Set ws1 = ThisWorkbook.Worksheets("1月") Dim ws2 As Worksheet Set ws2 = ThisWorkbook.Worksheets("2月") ・・・・これが12月のws12まであります。 これとは別のシート(定義名:data)のあるセルには、数字(1~12) までを入力し、ここの数字によってdataシートからどの月毎のシートに値を転記するかを 分岐させる仕組みのマクロを作成しようとしております。 ※数字が7だったら、7月のws7に転記する。 ここで、変数を用いてできれば良いと思うのですが、うまくいきません。 現状、If .... then, elseif .... thenを12個作る方法しか思い浮かばず、コードの量が 膨大になってしまいます。 うまく分岐させる方法をご教示お願いいたします。 エクセル2003を使用しています。

  • Excel マクロ 値の転記

    Excel マクロ 値の転記 Sheet2をSheet1に転記したいのですが、A列だけは3回同じ値を転記 するのには、※をどのように変えたらいいのでしょうか? 宜しくお願い致します。 〔Sheet1〕転記先 A  B あ  10 あ  20 あ  30 い  40 い  50 〔Sheet2〕転記元 A  B あ  10 い  20 う  30 え  40 お  50 Sub テスト() Dim i As Long For i = 1 To 30    '↓※ココをどう書いて良いのかが分かりません Worksheets("Sheet1").Cells(i, "A") = Worksheets("Sheet2").Cells(i, "A") Worksheets("Sheet1").Cells(i, "B") = Worksheets("Sheet2").Cells(i, "B") Next i End Sub

  • VBでの変数宣言は1行に2つできないのですか?

    Visual BASICで変数宣言は1行に2つ以上記述しても実際、動作します。 例 DIM A、B as Integer このように宣言すると、AもBも整数となります。 しかし、このように宣言して、この変数を Call サブプログラム名(B) のように、パラメ-タとして引き渡そうとするとエラーとなってしまうようです。 よくわからないまま、 DIM A as Integer DIM B as Integer と分けて記述したらエラーがきえたようです。 変数宣言は1行に2つ以上まとめて記述してはいけないのでしょうか? VBは Ver 5 です。

  • 変数が増えてしまうのはなぜだか教えてください。

    こんにちは、マクロ初心者ではないつもりですが、基本ができていないのか、以下のSubで、変数の値が増えてしまいます。i = 3のままだと思っていたのですが、シートが移動するにつれてiの値が増えてしまうのは何故でしょうか。教えてください。 Sub tes() Dim i As Integer Dim ws As Worksheet i = 3 Debug.Print i For Each ws In Worksheets ws.Select For i = 1 To i Debug.Print i Cells(i, i) = i Next Next End Sub 新規のブックに書きました。Sheetは1~3です。

専門家に質問してみよう