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

このQ&Aのポイント
  • 先日、こちらで回答を頂いたコードを用いて、顧客会社一覧から顧客個人名別の名簿を作成しようと思っております。
  • ですが、この名簿が「あ」~「わ」行まで各シートに分かれています。コードを「あ」~「わ」行まで順に書いていく方法の他に、もう少し簡易的な方法はないかと思い、質問をしました。
  • 他にもやり方があればご教授ください。シートは「あ」~「わ」まで分かれており、フォーマットは統一していて、検索値(顧客個人名番号)は各シートの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 /////////////////////////////////////////////////////////////////////////////////

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

  • ベストアンサー
  • keithin
  • ベストアンサー率66% (5278/7940)
回答No.2

#先に余談 Do Loopの脱出条件が間違ってるんじゃないかな? どのシートでも最初に""が現れたら,全体を脱出してしまうように見えます。 ご質問の本題。 アプローチ1: 普通にシートを巡回するだけに見えます。 codeのWorksheetsのIndexが例えば2番(左から数えて2枚目に合致)が「あ」で,Worksheets(Worksheets.count)が「ん」だとすれば dim j, k for j = 2 to worksheets.count  code.worksheets(j).range("B2:B200").clearcontents  for k = 3 to Code.worksheets(j).range("A65536").end(xlup).row   vntSearch = Code.Worksheets(j).Cells(k, 1).Value   strname = ""   On Error Resume Next   strname = Application.WorksheetFunction.VLookup(vntSearch, myrange, 6, False)   On Error GoTo 0   If strname <> "" Then    Code.Worksheets(j).Cells(k, 2) = strname   End If  next k next j アプローチ2: セルを舐めるように1個ずつ巡回していくのは,簡単かもしれませんが一番遅いです。 dim j for j = 2 to worksheets.count  with colde.worksheets(j).range("B3:B" & .range("A65536").end(xlup).row)   .formula = "=VLOOKUP(A3,[転記元.xls]転記元!$A$4:$AX$5000,6,FALSE)"   on error resume next   .specialcells(xlcelltypeformulas, xlerrors).clearcontents   on error goto 0   .value = .value  end with next j

quia_10
質問者

お礼

回答ありがとうございました。 Do Loopの脱出条件についてのご指摘ありがとうございます。早速、見直しを始めたいと思います。 また、少ない時間の中で2通りのやり方を教えて頂きありがとうございました。 今回の件で前述の方法を活用させて頂きたいと思います。

その他の回答 (2)

  • keithin
  • ベストアンサー率66% (5278/7940)
回答No.3

アプローチ2のマクロが編集中にミスっていたのに気がつきました。 【訂正】 アプローチ2: セルを舐めるように1個ずつ巡回していくのは,簡単かもしれませんが一番遅いので,エクセルの機能を使って一括で処理してみます。 大概の場合,ワークシートに本来機能で関数を使わせた方が,高速です。 更に工夫するなら,転記元の現在のデータ範囲を先に取得して「より合理的な数式」を書かせると,モアベターです。これはどの方式でも使える方策です。 dim j for j = 2 to worksheets.count  with colde.worksheets(j)   with .range("B3:B" & .range("A65536").end(xlup).row)    .formula = "=VLOOKUP(A3,[転記元.xls]転記元!$A$4:$AX$5000,6,FALSE)"    on error resume next    .specialcells(xlcelltypeformulas, xlerrors).clearcontents    on error goto 0    .value = .value   end with  end with next j 失礼しました。

quia_10
質問者

お礼

わざわざありがとうございます。 提示して頂いた2パターンを試してみて、どちらも今後に生かせるように、またアレンジが できるように読み解いて習得したいと思います。

  • kybo
  • ベストアンサー率53% (349/647)
回答No.1

Set myrange = Base.Worksheets("転記元").Range("A4:AX5000") 以降を以下の様にしてはどうでしょうか Do For i = 0 To Asc("わ") - Asc("あ") + 1 Code.Worksheets(Chr(Asc("あ") + i)).Range("B2:F200").ClearContents vntSearch = Code.Worksheets(Chr(Asc("あ") + i)).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(Chr(Asc("あ") + i)).Cells(i + 2, 2) = strname End If Next i Loop

quia_10
質問者

お礼

回答ありがとうございました。 お二人に回答を頂き、色々な考え方・やり方があるのだなと感心しております。 頂いたコードはこの先、色々な場面で活用したいと思います。

関連するQ&A

  • カットして隣のB列に順番にペーストするマクロ

    発注と納品の確認マクロを作成しました。 Sheet1の列を検索して、Sheet2にあればその数字のあるセルを赤くするのですが、 それを以下のように変更することは可能でしょうか? Sheet1の列を検索して、Sheet2にあれば、Sheet2上でその数字をカットして隣のB列に上から順番にペーストします。 宜しくお願いします。 Sub 発注と納品の確認マクロ() Dim Ws1 As Worksheet Dim Ws2 As Worksheet Dim myRange1 As Range Dim myRange2 As Range Dim c1 As Range Dim c2 As Range Dim myCt As Long Set Ws1 = Worksheets("Sheet1") Set Ws2 = Worksheets("Sheet2") Set myRange1 = Ws1.Range("A1", Ws1.Cells(Rows.Count, "A").End(xlUp)) Set myRange2 = Ws2.Range("A1", Ws2.Cells(Rows.Count, "A").End(xlUp)) For Each c1 In myRange1 myCt = 0 For Each c2 In myRange2 If c2.Value = c1.Value Then If myCt = 0 Then c2.Interior.ColorIndex = 3 Else c2.Interior.ColorIndex = 43 End If myCt = myCt + 1 End If Next c2 If myCt = 0 Then c1.Interior.ColorIndex = 6 Next c1 Set Ws1 = Nothing Set Ws2 = Nothing Set myRange1 = Nothing Set myRange2 = Nothing End Sub

  • エクセルの簡単なマクロ機能を追加したいのです

    既存のエクセルマクロ(Sub チェック()以下です)に下記の内容のマクロを付け足したいです。 教えていただけないでしょうか。 付け足したい条件です:  Sheet2のC列に 0  があれば  Sheet1のB列に 愛 と([太字]でセルの背景色を[灰色25%]にして)入れたいです 恐れ入りますがご存じの方がいらっしゃりましたら教えていただきたく何卒よろしくお願いいたします。 ----------------------------------------------- Sub チェック() Dim Ws1 As Worksheet Dim Ws2 As Worksheet Dim myRange1 As Range Dim myRange2 As Range Dim c1 As Range Dim c2 As Range Dim myCt As Long Set Ws1 = Worksheets("Sheet1") Set Ws2 = Worksheets("Sheet2") Set myRange1 = Ws1.Range("A1", Ws1.Cells(Rows.Count, "A").End(xlUp)) Set myRange2 = Ws2.Range("A1", Ws2.Cells(Rows.Count, "A").End(xlUp)) For Each c1 In myRange1 myCt = 0 For Each c2 In myRange2 If c2.Value = c1.Value Then If c2.Offset(, 1).Value = "" Then c1.Offset(, 1).Interior.ColorIndex = 3 Else c1.Offset(, 1).Value = c2.Offset(, 1).Value End If myCt = myCt + 1 End If Next c2 If myCt > 1 Then c1.Offset(, 1).Interior.ColorIndex = 10 Next c1 Set Ws1 = Nothing Set Ws2 = Nothing Set myRange1 = Nothing Set myRange2 = Nothing End Sub

  • Excel VBA For Each Next構文内の別シートを対象とする方法

    こんにちは。 VBA初心者のものですが教えてください。 「sheet1のC29:U29とsheet2のC31:G31について 1より小さければ小数第2位まで表示する」 の構文を作成したいのですが、 下記の構文ではエラーが出てしまいました。 どのように訂正すればよいでしょうか? ※できればrangeプロパティを使いたいのですが、  cellsプロパティを使わなきゃできませんか? すみませんがご教示をお願いいたします。 Sub test() Dim myrange As Range For Each myrange In Worksheets("sheet1").Range("C29:U29"),Worksheets("sheet2").Range("C31:G31") If myrange.Value < 1 Then myrange.NumberFormatLocal = "0.00" End If Next myrange End Sub

  • エクセルマクロ 検索して値を取得

    マクロはよく分かっていません。 既存のVBAを見ながらマネしてる状態なので、どこが間違っているのか教えて下さい。 sheet1 A 所属 1 789         2     3 sheet2    A     B 所属コード  所属 1 12345    あいう123 2 12346    あいう456   3 12347    あいう789 やりたいこと シート1の所属が「789」だったらとシート2の所属から「あいう789」を検索し、シート2の所属コード「12347」をシート1の所属に返す。 私が作ったやつだと「12347」は1行目でなく、3行目に返ってしまいます。 Dim SyozokuRange as Range Dim Syozoku as String Dim Buf as String Buf = "あいう" Syozoku = Buf & Syozoku Set SyozokuRange = worksheets(2).range("a:b").currentregion For i = 1 to SyozokuRange.rows.count If Syozoku = SyozokuRange.cells(i,2) Then worksheets(1).cells(i,1).value = SyozokuRange.cells(i,1) end if next i

  • シート1の氏名をシート2に反映

    sheet1の氏名をsheet2の日付、記号(A,B,C)にマッチした位置に入力させたいのですが下記コードで他で試したのですがうまくいきません。どなたかコードが解る方よろしくお願いします。 Sub 入力() Dim i As Long, j As Long, k As Long, L As Long Dim wS1 As Worksheet, wS2 As Worksheet Set wS1 = Worksheets("Sheet1") Set wS2 = Worksheets("Sheet2") i = wS2.Range(wS2.Cells(6, 1), wS2.Cells(8, 1)) j = wS2.Cells(3, Columns.Count).End(xlToLeft).Column Range(wS2.Cells(3, 2), wS2.Cells(i, j)).ClearContents On Error Resume Next For i = 2 To wS1.Cells(Rows.Count, 4).End(xlUp).Row If WorksheetFunction.CountA(wS1.Rows(i)) > 1 Then For j = 2 To wS1.Cells(i, Columns.Count).End(xlToLeft).Column If wS1.Cells(i, j) <> "" Then k = WorksheetFunction.Match(wS1.Cells(i, 4), wS2.Range(wS2.Cells(6, 1), wS2.Cells(8, 1)), False) L = WorksheetFunction.Match(wS1.Cells(5, j), wS2.Rows(3), False) wS2.Cells(k, L) = wS1.Cells(i, j) End If Next j End If Next i End Sub

  • Excel 2007 マクロのIF構文について

    Excel 2007 マクロのIF構文について Sheet1からSheet2にIF構文を使用して、 必要な情報を転記するマクロです。 下記マクロで実現できているのですが、IF構文が多く もっと効率的なマクロがあるのではないかと考えています。 IF構文が2つありますが、1つにまとめるマクロがありましたら お教えください。 Sub Rist() Dim i, j As Long Dim ws1, ws2 As Worksheet Set ws1 = Worksheets("Sheet1") Set ws2 = Worksheets("Sheet2") '「Sheet1」シートを更新 Worksheets("Sheet1").Range("A1").ListObject.QueryTable.Refresh BackgroundQuery:=False '「Sheet1」シートから「Sheet2」シートに転記 For i = 2 To ws1.Cells(Rows.Count, 1).End(xlUp).Row For j = 2 To ws2.Cells(Rows.Count, 13).End(xlUp).Row '「Sheet1」シートのL列から「Sheet2」シートのS列に転記 If ws2.Cells(j, "M") = ws1.Cells(i, "A") Then ws2.Cells(j, "S") = ws1.Cells(i, "L") End If '「Sheet1」シートのG列から「Sheet2」シートのQ列に転記 If ws2.Cells(j, "M") = ws1.Cells(i, "A") Then ws2.Cells(j, "Q") = ws1.Cells(i, "G") End If Next j Next i End Sub

  • 別のシートにあるリストを表示する方法

    すみません 検索シートから生徒シートの名前を検索したら検索シートに返されるようなマクロはどの様に書けばいいでしょうか? イメージとしては下記のような感じです。できれば左2行目3行目の検索結果も返したいです。 よろしくお願い致します。 Sub 名前検索() Dim myrange As Range Worksheets("生徒シート").Activate Set myrange = Range("C4:AG300").Find(what:=Range("C100").Value, LookIn:=xlValues) If Not myrange Is Nothing Then Worksheets("検索シート").Activate Cells(102, "C").Value = myrange.Offset(, -3).Value Else MsgBox "該当者なし" End If End Sub

  • すべてのシートでマクロを実行したい

    以下のプログラムでは、選択したシートのみマクロが動作しています。ネット検索で見よう見まねで作ったため何がまちがっているのかわかりません。ご教示いただけるとありがたいです。 ・月の予定表で利用者が休みの日に斜線を引くマクロ ・入力ミスを防ぐためシート保護をしている Sub すべてのシート() Dim s As Worksheet For Each s In Worksheets s.Select Call 斜線 Next End Sub Sub 斜線() ActiveSheet.Unprotect Password:="1234" For i = 1 To Range("E10").End(xlDown).Row Range("AS" & i).Borders(xlDiagonalUp).LineStyle = xlNone If Range("E10").Value = 0 Then Exit Sub If Cells(i, "E").Value = "日" And Range("BP9").Value = 0 Then Range("AS" & i).Borders(xlDiagonalUp).LineStyle = xlContinuous End If If Cells(i, "E").Value = "月" And Range("BP10").Value = 0 Then Range("AS" & i).Borders(xlDiagonalUp).LineStyle = xlContinuous End If If Cells(i, "E").Value = "火" And Range("BP11").Value = 0 Then Range("AS" & i).Borders(xlDiagonalUp).LineStyle = xlContinuous End If If Cells(i, "E").Value = "水" And Range("BP12").Value = 0 Then Range("AS" & i).Borders(xlDiagonalUp).LineStyle = xlContinuous End If If Cells(i, "E").Value = "木" And Range("BP13").Value = 0 Then Range("AS" & i).Borders(xlDiagonalUp).LineStyle = xlContinuous End If If Cells(i, "E").Value = "金" And Range("BP14").Value = 0 Then Range("AS" & i).Borders(xlDiagonalUp).LineStyle = xlContinuous End If If Cells(i, "E").Value = "土" And Range("BP15").Value = 0 Then Range("AS" & i).Borders(xlDiagonalUp).LineStyle = xlContinuous End If If Cells(i, "AY").Value = "祝日" And Range("BP16").Value = 0 Then Range("AS" & i).Borders(xlDiagonalUp).LineStyle = xlContinuous End If Next i ActiveSheet.Protect Password:="1234" End Sub

  • エクセル2010でマクロが動きません

    こんにちは。 マクロ超初心者です。 頑張ってエクセル2016でマクロ作成しましたが、エクセル2010で途中から動かず…。 何が悪いんでしょうか… ここから動きません…と書いたところから動きません(涙) Private Sub シート編集_Click() Application.ScreenUpdating = False Dim i Dim Sh1 As Worksheet Dim Sh2 As Worksheet Dim Sh4 As Worksheet Set Sh1 = Worksheets("あ") Set Sh2 = Worksheets("い") Set Sh4 = Worksheets("う") Dim dayCutoff As Date dayCutoff = Application.InputBox("年月日を入力してください", "お支払期限 年月日を入力", Format(Date, "yyyy/mm/dd")) Sh4.Range("D12").Value = DateSerial(Year(dayCutoff), Month(dayCutoff) + 2, 0) 'お支払期限 dayCutoff = Application.InputBox("年月日を入力してください", "請求書発行 日を入力", Format(Date, "yyyy/mm/dd")) Sh4.Range("AC3").Value = Format(Date, "yyyy/mm/dd") '発行日 Sh1.Cells.Clear With Sh1 'edit .Range("A2") = "番号" .Range("B2") = "会社名" .Range("C2") = "判定" .Range("D2") = "契約番号" .Range("E2") = "拠点" .Range("F2") = "税率" .Range("G2") = "月額(税抜)" .Range("H2") = "消費税" .Range("I2") = "月額(税込)" .Range("J2") = "今回" .Range("K2") = "全回" .Range("L2") = "店番" ここから動きません………… For i = 3 To Sh2.Cells(.Rows.Count, 1).End(xlUp).Row .Cells(i, 1) = Sh2.Cells(i, 2) .Cells(i, 2) = Sh2.Cells(i, 4) .Cells(i, 4) = Sh2.Cells(i, 3) .Cells(i, 5) = Sh2.Cells(i, 4) & "(" & Sh2.Cells(i, 6) & ")" .Cells(i, 6) = Sh2.Cells(i, 9) & "%課税" .Cells(i, 7) = Sh2.Cells(i, 8) .Cells(i, 8) = Sh2.Cells(i, 10) .Cells(i, 9) = Sh2.Cells(i, 11) .Cells(i, 10) = Sh2.Cells(i, 12) .Cells(i, 11) = Sh2.Cells(i, 7) .Cells(i, 12) = Sh2.Cells(i, 2) If Sh1.Cells(i, 10) > Sh1.Cells(i, 11) Then .Cells(i, 3) = "×" Else .Cells(i, 3) = "〇" End If If Sh1.Cells(i, 3) = "×" Then .Cells(i, 2) = "" End If Next i End With '空白行を削除 Dim j As Integer, myFlag As Boolean Dim c As Range With Worksheets("edit").Range("A2").CurrentRegion For j = .Rows.Count To 2 Step -1 myFlag = False For Each c In .Cells(j, 2) If c.Value <> "" Then myFlag = True Exit For End If Next If myFlag = False Then .Rows(j).Delete End If Next End With MsgBox "データの転記が終わりました" End Sub

  • マクロ初心者(;◔ิд◔ิ)オーバーフロー!!

    異なるシートで一致するデータがあった場合、 そのセルを選択して値貼り付けするというマクロを作りました。 作ったとはいえ、 教えてもらったマクロを試行錯誤して使えるようにアレンジしただけなので、 なにがなんだかよくわかっていません。 下記の記述でマクロを使用していましたが、 突然エラーになって使用できなくなりました。。。。 中身を見ると If Worksheets("master sheet").Cells(i, "BL").Value = Worksheets("請求書フォーム").Range("J1").Value Then この部分が黄色に塗りつぶされてるのですが、 どこをどう直したらいいのか全くわかりません。 ちなみに、ほかのファイルでも同じようなマクロを使用していますが、 そちらは問題なく使用できています。 なんとか教えていただけないでしょうか。 よろしくお願いします!!!! Sub こぴぺ() ' ' こぴぺ Macro Dim sheet1 As Worksheet Set sheet1 = Worksheets("請求書フォーム") sheet1.Activate Dim target As Range Dim i As Long Worksheets("請求書フォーム").Range("J1").Select For i = 1 To Worksheets("master sheet").Range("BL65536").End(xlUp).Row If Worksheets("master sheet").Cells(i, "BL").Value = Worksheets("請求書フォーム").Range("J1").Value Then If target Is Nothing Then Set target = Worksheets("master sheet").Range("BL" & i) Else Set target = Union(target, Worksheets("master sheet").Range("BL" & i)) End If End If Next i Set sheet1 = Worksheets("master sheet") sheet1.Activate If Not target Is Nothing Then target.Select Selection.Copy Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Application.CutCopyMode = False End Sub

専門家に質問してみよう