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

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

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

*マクロのVlookで、参照先が空欄のときは、元々入力されている値をそのまま表示するにはどうしたらよいのでしょうか* 質問です。下記のようなマクロをつくりました。仕組みはVLOOKと同じですが、 このようなコードを使用してVLOOKと同じ仕組みになるようにしました。 ちなみに、このマクロでは、MASTERという名前のシートを参照して、Sheet1という名前のシートに必要な文字を引っ張ってきます。 正確に言いますと、MASTERのA列と、Sheet1のB列が一致した場合、Sheet1のC列に値を導入する形になっています。 ところでこのとき、もしMASTERとSheet1に、一致したものがないと、Sheet1のC列には空欄が表示されてしまいます。一致する値がないときは、もともとC列に記入しておいた値を保持する、という設定にしたい場合、どのようにすればよいのでしょうか。 Sheet1のB列とMASTERのA列が一致すれば、Sheet1のC列に引っ張ってきた値を導入するが、一致しなければSheet1のC列にもともと記入してある文字を消さずにそのままにしたいのです。 初心者ですが、どなたか宜しくお願い致します。 Sub Macro1() For s = 2 To 70 '処理するSheet1の行数範囲 b = Sheets("Sheet1").Cells(s, 2) 'bにB列の値を代入 For u = 2 To 70 '検索する元データの行数範囲 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

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

  • ベストアンサー
  • 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

関連するQ&A

  • *二つのマクロを両方実行させたいです*(初心者)

    *二つのマクロを両方実行させたいです*(初心者) VLOOKUPのように、二つのSHEETで、それぞれ値が一致するものがあればもうひとつのSHEETのほうに値を自動的に表示させる、という仕組みをマクロで作ってみました。 (尚、今回はその中身の質問ではありません) 下記の二つの式は、それぞれは機能する、ということは確認済みなので、中身には問題ないはずなのですが、 これら二つを同じエクセルファイルに、Macro1,Macro2と設定して、実行しても、Macro2のほうしか実行されません。 1のほうは、実行を押しても作動しません。 尚、Macro2を消去すると、1のほうは正常に実行されます。 このMacro1と2は、一つにまとめても問題ありません。 (何にせよどちらも実行されればどんな形でも構いません) 初心者のため、説明が下手ですが、どなたか教えていただけないでしょうか。 どうすれば、下記の1と2を両方実行することができるのでしょうか。 下記が、私の作った式(Macro1と2です) Sub Macro1() For s = 2 To 70 '処理するSheet1の行数範囲 b = Sheets("Sheet1").Cells(s, 2) 'bにB列の値を代入 For u = 2 To 70 '検索する元データの行数範囲 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 Macro2() For s = 2 To 70 '処理するSheet1の行数範囲 b = Sheets("Sheet1").Cells(s, 2) 'bにB列の値を代入 For u = 2 To 70 '検索する元データの行数範囲 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

  • エクセルのマクロで、セルの値を参照してジャンプ

    エクセルのマクロで、セルの値を参照して、 別シートにジャンプして貼り付けたいと思っています。 <Sheet1>  |  A  B  C ------------------------------------ 1|  A1  あ  100 2|  B5  い  50 3|  C7  う  80 4|  D3  え  20 5|  E9  お  40 <Sheet2>  |  A  B  C  D  E ------------------------------------ 1|  あ 2|  100 3|         え 4|         20 5|    い 6|    50 7|       う 8|       80 9|            お 10|            40 といったイメージです。(お分かり頂けますか?) Sheets1!B1:C1を選択し、A1のセルの値を参照して、Sheets2!A1にジャンプして、 行列入れ替えて貼り付ける、といったマクロを組みたいのですが、 セルの値を参照する部分が分かりません。 実際はSheets2の様なシートは複数あり、1つのリストから複数の形式を変えた表を 作りたいと思っています。 Sheets2以降のシートに見出し行を加え、VLOOK関数を組み込んだ表を作っておき、 結果を貼り付けて見出し行を削除する、といったマクロは組めるのですが、 セルを参照してジャンプして貼り付けてくれると便利だと思い質問させて頂きました。 どなたかお知恵を拝借できましたら嬉しいです。 宜しくお願い致しますm(_ _)m

  • VLOOKUP関数と同じことをVBAでおこなうには

     初めまして、当方VBAの素人です。よろしくお願いします。  同じような質問で、このようなVBAを見つけました。 Sub Macro1() For n = 2 To 5 '処理するSheet2の行数範囲 a = Sheets("Sheet2").Cells(n, 1) 'aにA列の値を代入 For m = 2 To 5 '検索するSheet1の行数範囲 If Sheets("Sheet1").Cells(m, 1) = a Then 'Sheet2のA列の値とSheet1のA列が一致した場合 v = Sheets("Sheet1").Cells(m, 2) 'vにB列の値を代入 Sheets("Sheet2").Cells(n, 2).Value = v 'Sheet2のB列に値を入力 Exit For '値が見つかったのでForを終了 End If Next Next End Sub このVBAではSheet2での検索、入力が列になるのですが、列でなく、行でできないでしょうか。できればSheet1のB列の値をSheet2の1行で検索、Sheet2の2行に入力されるだけではなく、Sheet1のC列の値をSheet3の1行で検索、Sheet3の2行に入力されるようにしたいと思います。  解る方、よろしくお願いします。

  • 照合した結果によって決めた値を転記するマクロ

    シート1には A~F列まで値があり、行数は都度相違し約15,000行くらい。 データは2行目から開始です。 シート2には A~AE列まで値があり、行数は都度相違し約5,000~25,000行 あり同じくデータは2行目からです。 シート1の行ごとに A列,B列,C列の順で連結した値と シート2の行ごとに F列,G列,B列の順で連結した値を 照合させます。 その値が (1)シート1にもシート2にもある場合は   シート2のAF列に1と転記 (2)シート1には無いがシート2にはある場合は   シート2のAF列に2と転記 (3)シート1には有るがシート2には無い場合は   シート2のAF列に3と記入 シート2のデータのある行まで 作業を繰り返すマクロの記述を教えてください。 VLOOKUPを使用したマクロを作成しましたが 判定1,2,3の転記がうまく出来ないのと VLOOKUPが重すぎて処理が遅すぎるので 速く処理が出来るとうれしいです。 例 シート1 A2=XXXX B2=1234 C2=5678 シ-ト2 B2=1234 F2=XXXX G2=5678 シート1の値=XXXX12345678 シート2の値=XXXX12345678 照合する ↓(一致なので) シート2のセルAF2に1と転記

  • 空欄セルに順番に値を入力したいのですが

    すみません、誰か教えて頂けませんでしょうか? A列に値がありB列に所どころ空欄セルがあります。そのB列の空欄セル の上からA列の値を上から順番に値を入れたいのですがうまくいきません。 何か良い方法を教えて頂けませんでしょうか?     A    B 1    23    5 2    21 3    26    8 4    3 5    6    7 6    0 7    0 8 9 10 このような値を下記の様にしたいと思っています。     A    B 1   23    5 2    21    23 3    26    8 4    3    21 5    6    7 6    0    26 7    0    3 8        6 9 10 下記の様に記述はしたのですが、全然的外れでした。 For m = 1 To 10 For n = 1 To 10 If .Cells(n, "A").Value <> 0 And .Cells(m, "B").Value = "" Then .Cells(m, "B").Value = .Cells(n, "A").Value End If Next n Next m

  • ExcelマクロでVLOOKを実行したい

    ExcelマクロでVLOOKを実行したい 同一シートにある「全体」の表から必要な項目をVLookで抜き出したくて 下記のマクロを作成しました。 「Sheet1」のA列(A2以下)には検索値(数字6ケタ)を入れています。 A2の検索値でヒットした値はB2・C2に入りましたが、A3以下の検索値は スルーされてしまいます。どこを直したら良いのか、ご教授ください。 よろしくお願いします。 ----------------------------------------------------------------------- Sub 検索して値を取得する() Dim 範囲 As Range Dim 検索値, i As Long Dim 出荷日 As Date Dim 商品名 As String Set 範囲 = Worksheets("全体").Range("E7:HG1000") Set 検索値 = Worksheets("Sheet1").Cells(i + 2, 1) If 検索値.Value <> "" Then 商品名 = Application.WorksheetFunction.VLookup(検索値, 範囲, 2, False) 出荷日 = Application.WorksheetFunction.VLookup(検索値, 範囲, 160, False) Cells(i + 2, 2).Value = 商品名 Cells(i + 2, 3).Value = 出荷日 i = i + 1 End If End Sub

  • 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

  • マクロで最終行を空欄にしたいのですが、出来なくて困ってます

    VBA初心者です。 仕事で、見積書を作成する際に多い時には2~3枚にわたる時で、マクロが既に組んであるのですが、最終行は空欄のはずが、2ページ目のデータが上がってきています。 どうすれば、最終行を空欄に出来るのでしょうか? このマクロが、延々と続いています。 Dim a As Integer Dim c As Integer Dim count As Integer b = 1 c = 1 count = 1 '明細1の処理 a = 1 If Sheet2.Cells(a + 3, 2) = "" Then GoTo 20 Sheet13.Cells(b + 22, 1) = count Sheet13.Cells(b + 22, 2) = Sheet2.Cells(a + 3, 3) Sheet13.Cells(b + 22, 12) = Sheet1.Cells(c + 14, 5) Sheet13.Cells(b + 22, 13) = Sheet1.Cells(c + 14, 6) Sheet13.Cells(b + 22, 17) = Sheet1.Cells(c + 14, 10) If b = 26 Then JUMP1 If b = 74 Then JUMP1 b = b + 1 c = c + 1 count = count + 1 For a = 2 To 8 If Sheet2.Cells(a + 3, 2) = "" Then GoTo 10 Sheet13.Cells(b + 22, 2) = Sheet2.Cells(a + 3, 3) If b = 26 Then JUMP1 If b = 74 Then JUMP1 b = b + 1 Next a 10 If b = 26 Then JUMP1 If b = 74 Then JUMP1 b = b + 1 初心者の為、宜しくお願い致します。

  • マクロで検索行・データが入力されている部分を変更したい

    下記4行目に入力されている行は常に変わる為、このままでは検索にかなりの時間が掛かってしまいます。出来ることならデータ入力の最終の行で検索終了したいのですがどうかご教授お願いいたします。 1 Sub Macro1() 2 For a = 1 To 3000 3 snum = Sheets(2).Cells(a, 11) 4 For b = 1 To 200 'ここはSheet1でデータが入力されてる行数 5 If snum = Sheets(1).Cells(b, 1) Then 6 Sheets(2).Cells(a, 12).Value = Sheets(1).Cells(b, 2) 7 Sheets(2).Cells(a, 13).Value = Sheets(1).Cells(b, 3) 8 Sheets(2).Cells(a, 14).Value = Sheets(1).Cells(b, 4) 9 Exit For 10 End If 11 Next 12 Next 13 End Sub

  • VBAでelseに対応するifがありませんとエラー

    VBA初心者です 入力した数値(0から5)により、呼んでくる列を変えたいマクロを組んでいます if then elseif end ifで条件式を作ったのですが、 「elseに対応するifがありません」とエラーが出て進みません elseifが悪いのかと思い、条件を1つに絞ると上手く動きます(この際はendifは不要) ネット検索や参考書を見てますが、分かりません どなたか間違いを指摘して頂けませんか? Sub inputboxA() Dim nDat As String nDat = inputbox("何ヶ月目ですか?") If IsNumeric(nDat) = False Then MsgBox ("0から5までの値を入力して下さい") Exit Sub End If If nDat = 0 Then mm = 16 '0なら16列からデータを呼んでくる ElseIf nDat = 1 Then mm = 20 'ここでエラーが出る  1なら20列目からデータを呼んでくる ElseIf nDat = 2 Then mm = 24 '2なら24列目からデータを呼んでくる ElseIf nDat = 3 Then mm = 28 '3なら28列目からデータを呼んでくる ElseIf nDat = 4 Then mm = 32 '4なら32列目からデータを呼んでくる ElseIf nDat = 5 Then mm = 36 '5なら36列目からデータを呼んでくる End If 'データを呼んでくる For r = 4 To 2000 '処理するSheet1の行数範囲 b = Sheets(1).Cells(r, 1) 'bにA列の値を代入 For t = 6 To 2000 '検索するSheet3の行数範囲 If Sheets(3).Cells(t, 7) = b Then 'Sheet1のA列の値とSheet3のA列が一致した場合 y = Sheets(3).Cells(t, mm) 'yにB列の値を代入 Sheets(1).Cells(r, 6).Value = y 'Sheet1のB列に値を入力 Exit For '値が見つかったのでForを終了 End If Next Next End Sub