• ベストアンサー

マクロをすっきりさせたい・・・

いつもお世話になっております。 下記、マクロを組んだのですが、 簡潔にまとめるには、どうしたら良いでしょうか・・・ 宜しくお願い致します。 Set 範囲 = Workbooks("A.xls").Worksheets("マスター").Range("A2:G4000") ThisWorkbook.Activate 列番号 = 7 検索値 = (Worksheets("B").Range("B24")) Range("D14").Value = WorksheetFunction.VLookup(検索値, 範囲, 列番号, False) Set 範囲 = Workbooks("A.xls").Worksheets("マスター").Range("A2:G4000") ThisWorkbook.Activate 列番号 = 7 検索値 = (Worksheets("B").Range("B25")) Range("D15").Value = WorksheetFunction.VLookup(検索値, 範囲, 列番号, False) Set 範囲 = Workbooks("A.xls").Worksheets("マスター").Range("A2:G4000") ThisWorkbook.Activate 列番号 = 7 検索値 = (Worksheets("B").Range("B26")) Range("D16").Value = WorksheetFunction.VLookup(検索値, 範囲, 列番号, False)

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

  • ベストアンサー
  • mc-aumsc
  • ベストアンサー率32% (9/28)
回答No.1

行番号を変数にしてFor~Nextでループさせてみるのはいかがでしょうか? 以下のような感じで…。 Dim I As Integer For I=14 To 16 Set 範囲=Workbooks("A.xls").Worksheets("マスター").Range("A2:G4000") This Workbook.Activate 列番号=7 検索値=(Worksheets("B").Cells(I+10,2)) Cells(I,4).Value=WorksheetFunction.VLookup(検索値,範囲,列番号,False) Next I たぶん、これで動くと思います。 ミスってたらごめんなさい。

mimomosan
質問者

お礼

ご回答有難うございます! じつは、14行ほどありまして。 あほほど、長かったのが、ものすごくすっきりです!

その他の回答 (1)

  • end-u
  • ベストアンサー率79% (496/625)
回答No.2

同じ変数を何回もSetし直さなくてもよいです。 Set 範囲 = Workbooks("A.xls").Worksheets("マスター").Range("A2:G4000") ThisWorkbook.Activate 列番号 = 7 検索値 = Worksheets("B").Range("B24") Range("D14").Value = WorksheetFunction.VLookup(検索値, 範囲, 列番号, False) 検索値 = (Worksheets("B").Range("B25")) Range("D15").Value = WorksheetFunction.VLookup(検索値, 範囲, 列番号, False) 検索値 = (Worksheets("B").Range("B26")) Range("D16").Value = WorksheetFunction.VLookup(検索値, 範囲, 列番号, False) また、1回しか使わない変数なら直値で書いても良いかもしれません。 Range("D14").Value = WorksheetFunction.VLookup(Worksheets("B").Range("B24"), 範囲, 列番号, False) しかしExcelの関数を利用するのであれば、まとめて数式をセットして値に直したほうが効率は良いです。 With Range("D14:D16")   .Formula = "=VLOOKUP(B!B24,'[A.xls]マスター'!$A$2:$G$4000,7, False)"   .Value = .Value End With 変数を使用して文字列として繋ぐ事もできます。 ':   .Formula = "=VLOOKUP(B!B24," & 範囲.Address(external:=True) & ",7, False)" ': 以下余談。 ワークシート関数は引数と使い方によっては配列の答えを返します。 (複数の答えをまとめて返せるという意味) また、エラー結果を考慮するとApplication.VLookupを使ったほうが良い場合もあります。 Range("D14:D16").Value = Application.VLookup(Worksheets("B").Range("B24:B26"), _                        Workbooks("A.xls").Worksheets("マスター").Range("A2:G4000"), _                        7, False)

mimomosan
質問者

お礼

ご回答有難うございます。 検証にじかんがかかり、お礼が遅くなり申し訳ありません。 色々な方法を伝授して頂きありがとうございました!!

関連するQ&A

  • vlookでコメントの内容を取得・・・

    お世話になっております。 A列の数字に対応したB列についているコメントをC列表示させる・・・ マクロで組んでいるのですが、 できれば、コメントの内容を取得できたらいいな、と思いまして。 Set 範囲 = Workbooks("あああ.xls").Worksheets("マスター").Range("A2:G4000") ThisWorkbook.Activate 列番号 = 7 検索値 = (Worksheets("いいい").Cells(C + 10, 2)) Cells(C, 4).Value = WorksheetFunction.VLookup(検索値, 範囲, 列番号, False) Next C といった具合に組んでいます。 調べたのですが、ヒットしなくて・・・ きっとできないのかな?思い最終手段として、こちらでご質問させて いただきました。 宜しくお願い致します。

  • excel マクロ vlookupがわかりません(泣)

    初心者です。 ほんとに迷宮にはいっていまい、提示のコードもめちゃめちゃですが ご回答頂ける方はいらっしゃいますでしょうか・・・ マクロのコード記載のある "A.xle" ファイルの"報告書"シートのE2セルに 外部ファイル(一覧.xls)からVLOOKで値をひっぱってきて入力させたいです。 Vlookで入力させたい値が複数あるので、一気にできたらと思っているのです。 Private Sub CommandButton111_Click() Dim wb1 As Workbooks Dim 範囲 As Range Dim 列番号 As Range Dim 検索値 As Range Range("E2") = TextBox1.Value   Set wb1 = Workbooks.Open("\\192.168.~\~\一覧.xls") Set 範囲 = \\192.168.~\~\一覧.xls 状況!A3:P3000 ←ここに外部ファイルを設定したいのですが、どう記述すればよいかわかりません。 列番号 = 11 検索値 = (Worksheets("報告書").Range("E2")) Range("D3").Value = WorksheetFunction.VLookup(検索値, 範囲, 列番号, False) Unload Me End Sub どうぞ、ご教授宜しくお願い致します。

  • VBマクロについて

    VBマクロについて 0864_001.xls 0864_002.xls … 0864_009.xls というxlsファイルがあります。 0864_001.xlsを開く→処理→閉じる→0864_002.xls→… のようなループを考え、matome.xls内で以下のようなマクロを作成したのですが実行されません。 Sub Test() Dim i As Integer For i = 1 To 9 Workbooks.Open ThisWorkbook.Path & "\0864_00" & CStr(i) & ".xls" Workbooks("\0864_00" & CStr(i) & ".xls").Activate Range("F1").Formula = "=max($B$11:$B$17)" Range("G1").Formula = "=max($B$391:$B$398)" Range("F1:G1").Copy Workbooks("matome.xls").Activate Sheet1.Activate Range("A" & CStr(i + 1)).PasteSpecial Paste:=xlPasteValues Workbooks("\0864_00" & CStr(i) & ".xls").Close SaveChanges:=False Next i End Sub 5行目でエラーが発生し、「インデックスが有効範囲にありません」とのメッセージが表示されます。 どのようにすれば実行されるのか教えていただきたいです。

  • VBAの関数について

    VBA初心者です。 VLOOKUP関数の使い方がわかりません。 具体的に書かせてもらうと VBAの中にVLOOKUP関数を使いたいです 試験1ファイルのシート"sheet1"にある 検索値を使い 試験2ファイルの指定した検索範囲を 試験1ファイルのシート"sheet1"の指定した位置に数値を挿入することです。 例えばですが(この使い方も間違ってるかもしれません)コードを書いてみると 試験1の検索値はA5セルとします 試験2の検索範囲はB1~C20とします 検索範囲から取得した数値の位置はD5とします VLOOKUPに関してですが 検索値は変数を使い 検索値範囲も変数を使い 列番号はC列がいいので3で 検索方法はFALSEでお願いします sub test() dim a as range dim b as workbooks dim c as range set a = range("B1~C20") set b = workbooks("sheet1") set c = range("A5") workbooks("試験1").worksheets("sheet1").range("D5").value=workbooks("試験2").activesheet."=VLOOKUP(ここがわかりません)".value end sub そもそも変数やsetの使い方が間違ってるかもしれませんm(__)m コードを書いて貰えるととても助かります。 回答お願いします。

  • エクセルのマクロが上手く働いたり働かなかったりです。

    ブック「住所録管理」で以下をオートマクロで作り、C7セルに郵便番号を入力するとブック「郵便」の郵便番号から住所を参照してC8:D8セルにコピーペーストするようにしましたが、VLOOKUPが上手く働いたり働かなかったりします。 ブック「郵便」には A    B    C 郵便番号   住所 フリガナ の形式で、2000件以上のデータがありますが、多すぎる為でしょうか? VLOOKUP以外の方法でも構いませんので、何か良い方法がありましたらご教授下さいます様、宜しくお願いします。 Sub 住所検索() Application.ScreenUpdating = False Dim myFileName As String myFileName = ThisWorkbook.Path & "\郵便.xls" Workbooks.Open Filename:=myFileName Windows("住所録管理.xls").Activate Range("C8:D8").Select ActiveCell.FormulaR1C1 = "=VLOOKUP(R[-1]C,[郵便.xls]Sheet1!R1C1:R1838C2,2)" Selection.Copy Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Windows("郵便.xls").Activate ActiveWindow.Close Application.ScreenUpdating = True End Sub

  • Vlookupマクロにつきまして

    初心者で、 エクセルのマクロにて、下記の処理を行おうとしているのですが、 上手く行きません。 どなたかお助けください! B3=Vlookup(A3,Sheet2!A:F,3,False) B4 A4 B5 A5 とA列に値がある限りカウントアップしていきます。 以下の通り考えてみたのですが、動きません。 Sub vlookup() Dim i As Long For i = 3 To Cells(Rows.Count, "A").End(xlUp).Row Cells(i, "B") = Application.WorksheetFunction.VLookup(Range(Cells(i, "A")), Worksheets("Sheet2").Range("A:F"), 3, False) Next End Sub すみません、宜しくお願いします。

  • VLookupで一致しなかった時のVBAでの処理

    On Error ~を使わないで、 VLookup()で一致しなかった時の処理をさせたいのですが どのように記述すればよいでしょうか。 例えば、以下のようなコードの場合、 一致したデータがない時にyに-1を代入するには 以下のコードをどのように記述すればよいのでしょうか。 --------------------- Dim x As Integer Dim y As String x = 7 y = Application.WorksheetFunction.VLookup(x, Worksheets("Sheet1").Range("A1:B100"), 2, False) --------------------- 以下はいずれもエラーになりますが、以下のような感じで処理がしたいです。 --------------------- If IsError(Application.WorksheetFunction.VLookup(x, Worksheets("Sheet1").Range("A1:B100"), 2, False)) Then  y = -1 Else  y = Application.WorksheetFunction.VLookup(x, Worksheets("Sheet1").Range("A1:B100"), 2, False) End If --------------------- If Application.WorksheetFunction.IsNA(Application.WorksheetFunction.VLookup(x, Worksheets("Sheet1").Range("A1:B100"), 2, False)) Then  y = -1 Else  y = Application.WorksheetFunction.VLookup(x, Worksheets("Sheet1").Range("A1:B100"), 2, False) End If --------------------- y = Application.WorksheetFunction.IfError(Application.WorksheetFunction.VLookup(x, Worksheets("Sheet1").Range("A1:B100"), 2, False), -1) --------------------- なお、以下のように本来エラーではない処理で On Error Resume Nextを使うのは、 本当のエラーの処理と混同するため不可 --------------------- On Error Resume Next y = Application.WorksheetFunction.VLookup(x, Worksheets("Sheet1").Range("A1:B100"), 2, False) If Err <> 0 Then y = -1 On Error GoTo 0 ---------------------

  • マクロ:別ブックのデータの値を転記

    ExcelでVlook関数を使ってデータを検索していたのですが、マスタの件数(15,000件)と数式が多くなってしまいブックの容量が大きくなってしまって動きづらくなってしまったので、マスタと検索のブックに分け、マクロを使おうと思ってます。 簡単にいうと、 【マスタブック】   A列  B列 1  1   あ 2  2   い 【検索ブック】   A列  B列 1  2   い 2 検索ブックA列1行目に、「2」を入力してマクロを実行すると「い」が表示されるようにしたいのです。   開いておくのは検索ブックはのみです。 Sub 転記() Dim マスタ As Workbook Dim 検索 As Workbook Dim 行, 数字 As Long Dim Bname As String Bname = ActiveWorkbook.Name Workbooks.Open Filename:="C:\Documents and Settings\mi200274\デスクトップ\\マスタ.xls" Workbooks("マスタ.xls").Activate Set マスタ = Workbooks("マスタxls") Set 検索 = ThisWorkbook Set ws1 = マスタ.Worksheets("Sheet1") Set ws2 = 検索.Worksheets("Sheet1") On Error Resume Next 行 = 1 Do Until ws2.Range("A" & 行).Value = "" 数字 = ws2.Range("A" & 行).Value 対象 = ws1.Range("A:A").Find(数字, lookat:=xlWhole).Row ws2.Range("B" & 行).Value = ws1.Range("B" & 対象).Value 行 = 行 + 1 Loop ActiveWorkbook.Close Workbooks(Bname).Activate End Sub 以上のマクロを知人に教わりながら作ってみたのですが、マスタを一度開かないと検索はできないのでしょうか? 重たいデータなのでできれば開かずに検索して値を転記したいので、そのようなコマンド等ご存知の方教えてください。 ちなみにマクロは「新しいマクロの記録」から作る程度の初心者です。よろしくお願いします。

  • WorkbookのCopyについて

    Workbookのコピーについて教えてください。 下記のマクロにセル内の数式もコピーしたいのですが、出来ないで困ってます。 値と数式をコピーする、マクロを入れると指定した範囲にコピーされません。 Sub CopyWorkbookToWorkbook() Windows("sheet2.xls").Activate Workbooks.Open Filename:="D:\book1.xls" Workbooks("book1.xls").Worksheets("sheet1").Range("A6:k1000").Copy Workbooks("book2.xls").Worksheets("sheet1").Range("A6").PasteSpecial    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks :=False,Transpose:=False          Workbooks("book1.xls").Close End Sub よろしくお願いします。

  • エクセルマクロ if文を繰り返したい

    マクロ初心者です。 以下のようなマクロを作ったのですが、 これをE34まで繰り返しの処理をしたいです。 どこにどんな文章を挟んでいいのかわかりません。 Sub けいさん() If Workbooks("日報.xls").Worksheets("お手本").Range("O22") = "A" Then Workbooks("test.xls").Worksheets("II-1(1)").Range("E11") = "" ElseIf Workbooks("日報.xls").Worksheets("お手本").Range("O22") = "B" Then Workbooks("test.xls").Worksheets("II-1(1)").Range("E11") = "" ElseIf Workbooks("日報.xls").Worksheets("お手本").Range("O22") = "D" Then Workbooks("test.xls").Worksheets("II-1(1)").Range("E11") = "" ElseIf Workbooks("日報.xls").Worksheets("お手本").Range("C22") = "" Then Workbooks("test.xls").Worksheets("II-1(1)").Range("E11") = "" Else Workbooks("日報.xls").Worksheets("お手本").Range("C22").Copy Workbooks("test.xls").Worksheets("II-1(1)").Range("E11").PasteSpecial End If End Sub

専門家に質問してみよう