• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:*マクロのVlookで、参照先が空欄のときは、元々入力されている値をそ)

マクロのVlookで、参照先が空欄のときは、元々入力されている値をそのまま表示する方法

このQ&Aのポイント
  • マクロを使用してVLOOKと同じ仕組みを作成し、参照先が空欄の場合に元々入力されている値を保持する方法について質問です。
  • 特定のシート(MASTER)のA列と、別のシート(Sheet1)のB列が一致した場合、Sheet1のC列に値を導入するマクロを作成しました。しかし、一致する値がない場合はC列が空欄になってしまいます。一致しない場合でも、C列に元々入力されている値を保持したいのですが、どのようにすればよいでしょうか。
  • 初心者ですが、Sheet1のB列とMASTERのA列が一致した場合はSheet1のC列に値を導入し、一致しない場合はC列を空欄にせずに元々入力されている値を保持したいです。その方法について教えてください。

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

  • ベストアンサー
  • mt2008
  • ベストアンサー率52% (885/1701)
回答No.3

On Error Resume Nextを使って、Vlookupの結果がエラーなら次に進むようにしては? Sub Sample()  On Error Resume Next  With Sheets("Sheet1")   For i = 2 To 70    .Range("C" & i) = Application.WorksheetFunction.VLookup(.Range("B" & i), Sheets("MASTER").Range("A2:B70"), 2, False)   Next i  End With  On Error GoTo 0 End Sub 本当はあまり「On Error Resume Next」を使いたくないんですけどね。

ami0607
質問者

補足

誠にありがとうございます。本当に助かりました。 ただ、変更がありまして、処理するSheet1の行数範囲を2 to 100 そして、検索する元データであるMASTERの行数範囲を1 to 400にしたいのです。 その場合、教えていただいたマクロはどこを変更したらよろしいでしょうか。 自分なりにやってみたのですがなぜかうまくいきませんでした。 (Range("A2:B70"),のところのA2をA1にしえ、B70をB400にしてみたのですがうまくいきませんでした。) 恐れ入りますが教えていただけませんか?

その他の回答 (3)

  • mt2008
  • ベストアンサー率52% (885/1701)
回答No.4

ANo.3です。 > ただ、変更がありまして、処理するSheet1の行数範囲を2 to 100 > そして、検索する元データであるMASTERの行数範囲を1 to 400にしたいのです。 試されたように、↓で行けるはずです。 For i = 2 To 70 ↓ For i = 2 To 100 .Range("C" & i) = Application.WorksheetFunction.VLookup(.Range("B" & i), Sheets("MASTER").Range("A2:B70"), 2, False) ↓ .Range("C" & i) = Application.WorksheetFunction.VLookup(.Range("B" & i), Sheets("MASTER").Range("A1:B400"), 2, False) どう上手く行かないのか補足してください。 数字を全角で入力……って事はないですよね?

ami0607
質問者

補足

ありがとうございます。 このマクロの全体は、下記のようになっております。 マクロ3の実行でで、マクロ1と2を一緒に起動させるようになっています。 マクロ1と2はそれぞれVlookupのような仕組みになっているのですが、 教えていただいたとおりにやると、 マクロ1がまず動いて、要点検という名前のシートからデータを引っ張ってきてSheet1に表示します。 (ここまではうまくいきました) そしてマクロ2で、MASTERという名前のシートからデータを引っ張ってきてSheet1のC列に表示します。 しかし、このとき元々C列に記入していた文字が消えてしまいました。 これはどのようにすれば解決できるでしょうか。 面倒な質問で恐縮ですが、もし何かわかればお願いいたします。 Sub Macro1() For n = 2 To 120 '処理するSheet1の行数範囲 a = Sheets("Sheet1").Cells(n, 3) 'aにC列の値を代入 For m = 2 To 70 '検索する元データの行数範囲 If Sheets("要点検").Cells(m, 3) = a Then '要点検のC列の値とSheet1のC列が一致した場合 v = Sheets("要点検").Cells(m, 4) 'vにD列の値を代入 Sheets("Sheet1").Cells(n, 6).Value = v 'Sheet1のB列に値を入力 Exit For '値が見つかったのでForを終了 End If Next Next End Sub Sub Macro2() For s = 2 To 120 '処理するSheet1の行数範囲 b = Sheets("Sheet1").Cells(s, 2) 'bにB列の値を代入 For u = 2 To 400 '検索する元データの行数範囲 If Sheets("MASTER").Cells(u, 1) = b Then 'MASTERのA列の値とSheet1のB列が一致した場合 w = Sheets("MASTER").Cells(u, 2) 'wにB列の値を代入 Sheets("Sheet1").Cells(s, 3).Value = w 'Sheet1のC列に値を入力 Exit For '値が見つかったのでForを終了 End If Next Next End Sub Sub Macro3() Call Macro1 Call Macro2 End Sub Sub Sample() On Error Resume Next With Sheets("Sheet1") For i = 2 To 120 .Range("C" & i) = Application.WorksheetFunction.VLookup(.Range("B" & i), Sheets("MASTER").Range("A1:B400"), 2, False) Next i End With On Error GoTo 0 End Sub

回答No.2

------------------------ 関数だけで済ませる場合 ------------------------ =IF(ISNA(VLOOKUP(A2,MASTER!A2:C70,3)),MASTER!$G$1,VLOOKUP(A2,MASTER!A2:C70,3)) これをSheet1のC2に貼り付けて、後はオートフィル =IF(※1条件, ※2条件=TRUEの時の出力値, ※3条件=FALSEの時の出力値) ※1.VLOOKUP(A2,MASTER!A2:C70,3)の出力結果が[#N/A]という状態(取得結果が見つからない) ※2,MASTER!G1の値を出力する。固定値にしたいのであれば"固定値"とする。 ※3.VLOOKUP(A2,MASTER!A2:C70,3)で得られる結果を出力する。 ------------------------ VBA利用の場合 ------------------------ Dim l_xlsSheet1   As Worksheet Dim l_xlsSheetMst  As Worksheet Set l_xlsSheet1 = Worksheets("Sheet1") Set l_xlsSheetMst = Worksheets("MASTER") 'マスタのA1~A70のエリアを変数へセット Dim l_rngBox  As Range Set l_rngBox = l_xlsSheetMst.Range("A2:A70") Dim i  As Integer For i = 2 To 70   Dim l_rngカレント  As Range   'A列のiレコード目   Set l_rngカレント = l_xlsSheet1.Cells(i, 1)      Dim l_rng検索結果  As Range   'マスタのA1~A70に検索をかける(部分一致ではなく、完全一致を指定)   'その他の引数オプションは、マクロの記録などでご自分で調べてください。   Set l_rng検索結果 = l_rngBox.Find(l_rngカレント.Value, lookat:=XlLookAt.xlWhole)   If l_rng検索結果 Is Nothing Then     '見つからなかった時用の処理   Else     '見つかった時用の処理(C列からC列への値の転写)     l_rngカレント.Offset(, 2).Value = l_rng検索結果.Offset(, 2).Value   End If Next i

  • nn1102
  • ベストアンサー率80% (12/15)
回答No.1

こういう事であってますか? Public Sub Test()   Dim mstSheet As Worksheet   Set mstSheet = Sheets.Item("MASTER")      Dim sh1 As Worksheet   Set sh1 = Sheets.Item("Sheet1")      Dim rowIndex As Integer   For rowIndex = 2 To 70     ' Sheet1.B の値を取得     Dim sh1Cell As Range     Set sh1Cell = sh1.Cells.Item(rowIndex, 2)     Dim sh1Value As String     sh1Value = sh1Cell.Value2     Set sh1Cell = Nothing     ' MASTER.A の値を取得     Dim mstCell As Range     Set mstCell = mstSheet.Cells.Item(rowIndex, 1)     Dim mstValue As String     mstValue = mstCell.Value2     Set mstCell = Nothing          If sh1Value = mstValue Then       ' Sheet1.B = MASTER.A の時       ' Sheet1.C に MASTER.A の値を代入する       Dim targetCell As Range       Set targetCell = sh1.Cells.Item(rowIndex, 3)       targetCell.Value2 = mstValue       Set targetCell = Nothing     End If   Next rowIndex      Set mstSheet = Nothing   Set sh1 = Nothing End Sub