- ベストアンサー
マクロのVlookで、参照先が空欄のときは、元々入力されている値をそのまま表示する方法
- マクロを使用してVLOOKと同じ仕組みを作成し、参照先が空欄の場合に元々入力されている値を保持する方法について質問です。
- 特定のシート(MASTER)のA列と、別のシート(Sheet1)のB列が一致した場合、Sheet1のC列に値を導入するマクロを作成しました。しかし、一致する値がない場合はC列が空欄になってしまいます。一致しない場合でも、C列に元々入力されている値を保持したいのですが、どのようにすればよいでしょうか。
- 初心者ですが、Sheet1のB列とMASTERのA列が一致した場合はSheet1のC列に値を導入し、一致しない場合はC列を空欄にせずに元々入力されている値を保持したいです。その方法について教えてください。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
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」を使いたくないんですけどね。
その他の回答 (3)
- mt2008
- ベストアンサー率52% (885/1701)
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) どう上手く行かないのか補足してください。 数字を全角で入力……って事はないですよね?
補足
ありがとうございます。 このマクロの全体は、下記のようになっております。 マクロ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
- 1050 円(@1050YEN)
- ベストアンサー率69% (477/687)
------------------------ 関数だけで済ませる場合 ------------------------ =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)
こういう事であってますか? 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
補足
誠にありがとうございます。本当に助かりました。 ただ、変更がありまして、処理するSheet1の行数範囲を2 to 100 そして、検索する元データであるMASTERの行数範囲を1 to 400にしたいのです。 その場合、教えていただいたマクロはどこを変更したらよろしいでしょうか。 自分なりにやってみたのですがなぜかうまくいきませんでした。 (Range("A2:B70"),のところのA2をA1にしえ、B70をB400にしてみたのですがうまくいきませんでした。) 恐れ入りますが教えていただけませんか?