完全一致したら複数のセルを順に代入するマクロは?

このQ&Aのポイント
  • エクセルのSheet1のA列にある文字列と、Sheet2にあるA列にある文字列と完全一致したら、前者のセルの右右右隣セルから3番目までのセルに、後者のセルの右隣セルから3番目までの文字列を順に代入するマクロをお教えください。
  • 一致したセルの右隣のセルから順に代入するマクロは以下で解決済みです。以下のマクロを編集して実行したいのですが、どこをいじったらよいかわかりません。
  • なお、代入したいセルを右の任意のセルまで引き延ばしたい場合、以下のコード任意Loop Until Coln1 = 4の右辺の数字を変更すればよいことまではわかっています。どうぞ、よろしくお願い申し上げます。
回答を見る
  • ベストアンサー

完全一致したら複数のセルを順に代入するマクロは?

エクセルのSheet1のA列にある文字列と、Sheet2にあるA列にある文字列と完全一致したら、前者のセルの右右右隣セル(一致したセルから数えて4番目のセル)から3番目までのセルに、後者のセルの右隣セル(一致したセルから数えて2番目のセル)から3番目までの文字列を順に代入するマクロをお教えください。つまり代入開始セルをSheet1のD列にしたいのです。(実は任意の列からにしたのですが…)。単純にvlookup関数を使えばいいのですが、VBAで行いたいのです。 一致したセルの右隣のセルから順に代入するマクロは以下で解決済みです。以下のマクロを編集して実行したいのですが、どこをいじったらよいかわかりません。 なお、代入したいセルを右の任意のセルまで引き延ばしたい場合、以下のコード任意Loop Until Coln1 = 4の右辺の数字を変更すればよいことまではわかっています。どうぞ、よろしくお願い申し上げます。 ---------------- Sub 試験() Dim Row1 As Integer Dim Coln1 As Integer Dim Row2 As Integer Dim Coln2 As Integer Set WS1 = Worksheets("Sheet1") Set WS2 = Worksheets("Sheet2") Coln1 = 1 Coln2 = 1 For Row1 = 1 To WS1.Cells(Rows.Count, 1).End(xlUp).Row For Row2 = 1 To WS2.Cells(Rows.Count, 1).End(xlUp).Row If WS2.Cells(Row2, 1) = WS1.Cells(Row1, 1) Then Do Coln1 = Coln1 + 1 Coln2 = Coln2 + 1 WS1.Cells(Row1, Coln1) = WS2.Cells(Row2, Coln2) Loop Until Coln1 = 4 Coln1 = 1 Coln2 = 1 End If Next Row2 Next Row1 End Sub

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

  • ベストアンサー
  • mu2011
  • ベストアンサー率38% (1910/4994)
回答No.2

>Coln1 = 1  ⇒シート1の列番号だからD列開始とすると初期値は3(後で+1する) ループ処理は面倒なので検索対象が重複しない事が前提にFind関数を使用した一例です。 Offsetは0相対、Resizeは1相対となりますのでご注意ください。 Sub sample() 転送先 = "D" '転送先の列番号 転送元 = 1 '転送元の列番号(相対) サイズ = 2 '転送サイズ Set st1 = Worksheets("sheet1") Set st2 = Worksheets("sheet2") For i = 1 To st1.Cells(Rows.Count, 1).End(xlUp).Row Set pos = st2.Range("A:A").Find(st1.Cells(i, "A"), _ LookAt:=xlWhole, MatchCase:=True, MatchByte:=True) If Not pos Is Nothing Then st1.Cells(i, 転送先).Resize(1, サイズ).Value = _ pos.Offset(0, 転送元).Resize(1, サイズ).Value End If Next End Sub

paraseke
質問者

お礼

ご回答ありがとうございます。Find関数を使用するとシンプルですね。これでもうまくいきました。転送元のサイズを変更したい場合や、転送先の開始列を変更したい場合も、上3行の右辺を変えればよいだけなのでわかりやすいです。ありがとうございます。

paraseke
質問者

補足

すみません。このFind関数を基にしたマクロにさらに、ブック間の転送をするにはどうしたらよいでしょうか。本当にしたいことは実はブック間なのです。ブックAのシート1に、ブックBにあるシート2のデータを同様に転送したいのです。よろしくお願い申し上げます。

その他の回答 (4)

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

要するにB,C,D列のデータを,D,E,F列に転送できれば良いんですね。 アナタの説明はとても判りにくいです。「目に見える姿」を具体的に示してください。 作成例:book1,book2の両方を開いた状態から,book2.xlsのシート2のBCD列の値を,book1.xlsのシート1のDEF列に転送する sub macro1r1()  dim r as long  r = workbooks("Book1.xls").worksheets("Sheet1").range("A65536").end(xlup).row  with workbooks("Book1.xls").worksheets("Sheet1").range("D1:F" & r)   .formula = "=VLOOKUP(A1,'[Book2.xls]Sheet2'!A:D,COLUMN(B2),FALSE)"   .value = .value   on error resume next   .specialcells(xlcelltypeconstants, xlerrors).clearcontents  end with end sub

paraseke
質問者

お礼

早々の回答をありがとうございます。拡張子をとって実行しました。そしたらBook2を選べました。ただ、転送がうまくいきませんでした。すみません。

  • KURUMITO
  • ベストアンサー率42% (1835/4283)
回答No.4

示されたマクロの変更でしたら Coln1=1をColn1=3に変更(2か所) Loop Until Coln1=4をLoop Unti Coln1=6に変更(1か所)すればよいでしょう。

paraseke
質問者

お礼

ありがとうございます。これでうまくいきました。大変助かります。

  • mu2011
  • ベストアンサー率38% (1910/4994)
回答No.3

NO2です。 初期値の列番号の他にループ条件も変更が必要です。  Loop Until Coln1 = 4 ⇒ Loop Until Coln1 = 3 + 3

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

ところでご質問に書かれている「4番目から3番目のセルに」というのは,書き間違いじゃなくてワザワザそういう意図で書いてるんですね? 非常に判りにくいですけど。アナタが正しく書いているという前提で回答します。 今のマクロのシート1のA列×シート2のA列(×無駄に4回)の総当たりも必ずしも悪いことばかりじゃありませんが,やっぱりあまりに非効率なので,ざっとこんな具合にします。 sub macro1()  dim r as long  r = worksheets("Sheet1").range("A65536").end(xlup).row ’検索  worksheets("Sheet1").range("D1:D" & r).formula = "=VLOOKUP(A1,Sheet2!A:C,2,FALSE)"  worksheets("Sheet1").range("C1:C" & r).formula = "=VLOOKUP(A1,Sheet2!A:C,3,FALSE)" ’処理  with worksheets("Sheet1").range("C1:D" & r)  .value = .value  on error resume next  .specialcells(xlcelltypeconstants, xlerrors).clearcontents  end with end sub

paraseke
質問者

補足

早々のご回答ありがとうございます。私の質問文があいまいですみません。Sheet1のA列から数えて「4番目から3番目のセルに」というのは、左に戻るのではなくて、「4番目から右に順に3番目のセルに」という意味です。つまりSheet1のD列からF列に代入したいのです。 この場合、いただいたコードのどこを変更したらよいでしょうか?改めてご教授いただけませんか。よろしくお願い申し上げます。

関連するQ&A

  • 完全一致したら複数のセル代入するマクロは?

    エクセルのSheet1のa列にある文字列と、Sheet2にあるa列にある文字列と完全一致したら、前者のセルの右隣から3番目までのセルに、後者のセルの右隣から3番目までの文字列を順に代入するマクロをお教えください。単純にvlookup関数を使えばいいのですが、VBAで行いたいのです。複数のセルに順に代入するのに苦慮しています。よろしくお願い申し上げます。

  • 完全一致したら代入するマクロを教えてください

    エクセルのSheet1のa列にある文字列と、Sheet2にあるa列にある文字列と完全一致したら、前者のセルの右隣に後者のセルの右隣の文字列を代入するマクロをお教えください。単純にvlookup関数を使えばいいのですが、VBAで行いたいのです。よろしくお願い申し上げます。

  • Excel 2007 マクロ 別シートの情報を反映する方法

    Excel 2007 マクロ 別シートの情報を反映する方法 Sheet1とSheet2があります。 Sheet1のD列とSheet2のM列で同じ値があれば、 Sheet1のE列の値をSheet2のN列に反映するマクロを 作成しました。 下記が正しいと思っていたのですが、エラーメッセージは出ずに 値が反映されません。 マクロに問題点があればご指摘ください。 よろしくお願いいたします。 Sub Rist() Dim i, j As Long Dim ws1, ws2 As Worksheet Set ws1 = Worksheets("Sheet1") Set ws2 = Worksheets("Sheet2") For i = 2 To ws1.Cells(Rows.Count, "D").End(xlUp).Row For j = 2 To ws2.Cells(Rows.Count, "M").End(xlUp).Row If ws2.Cells(j, "M") = ws1.Cells(i, "D") Then ws2.Cells(j, "N") = ws1.Cells(i, "E") End If Next j Next i End Sub

  • エクセルマクロで教えてください

    Sub smp05_14_01() Dim 対象セル As Range Dim ws1 As Worksheet Dim ws2 As Worksheet Dim ws3 As Worksheet Dim 行 As Long, 列 As Long Dim i As Long Set ws1 = Worksheets("顧客") Set ws2 = Worksheets("売上") Set ws3 = Worksheets("顧客未登録") 行 = ws1.Range("A1").End(xlDown).Row - 1 列 = ws1.Range("A1").End(xlToRight).Column Set 対象セル = ws1.Cells(1, 列 + 2).Resize(2, 行) For i = 1 To 行 対象セル(1, i).Value = "顧客NO" 対象セル(2, i).Value = "<>" & ws1.Cells(i + 1, 1) Next ws2.Range("A1").CurrentRegion.AdvancedFilter _ Action:=xlFilterCopy, _ CriteriaRange:=対象セル, _ CopyToRange:=ws3.Range("A1") 対象セル.Clear End Sub 上記のマクロは売上のシートに登録されている以外の顧客NOを顧客シートを参照して顧客未登録シートにコピーするのもですが添付したファイルの数だと上手くいくのですが、エクセルのヨコのセルの最大値の258を越えると上手くいきません。上記の処理で1000レコードを越えても売上シートに登録されている以外の顧客NOを参照して顧客未登録シートにコピーするマクロを教えてください。

  • エクセル マクロ:部分一致検索

    教えてください。 sheet1のA列に時間データがあります。A列は書式設定でhh:mm:ss.00にしています。 sheet2のA1に時間を表示しており書式設定でhh:mm:ssにしています。 sheet2のA1と部分一致する時間を、sheet1のA列から検索するマクロを作成しています。 (複数ある場合は初めに該当するセルの行を表示) sheet2に下記のコードを入力しており、実行すると「オブジェクト変数またはwithブロック変数がされていません」と表示され困っています。 ご教授のほどよろしくお願い致します。 Sub 検索() Dim Jikan As Date Dim Row1 As Integer Jikan = Sheets("sheet2").Cells(1, 1).Value Row1 = Sheets("sheet1").Range("A:A"). _ Find(What:=Jikan, LookAt:=xlPart).Row MsgBox Row1 End Sub

  • EXCEL2007のマクロで2つのBOOKを比較

    EXCEL2007のマクロでABook,BBookと2つのBookのセルを比較して、数値が違うセルがある場合、BBookの方に新しいsheetを作成して、このsheetのA列に数値が違うセルの番地を、新しいsheetのA1、A2・・・と埋めていくマクロは作成する事は出来るでしょうか?因みに新しいsheetを作成するマクロまでは、出来ました。しかし、新しいsheetのA1、A2と書き込んでいくと、クリップボードの値がA1、A2、・・・入ってしまいます。 Dim ws1 As Object Dim ws2 As Object Dim ws3 As Object Dim co As Integer, ro As Integer, e As Integer Set ws1 = Workbooks(bookname1).Worksheets("明細") Set ws2 = Workbooks(bookname2).Worksheets("明細") Set ws3 = Workbooks(bookname2).Worksheets("エラーセル") If ws1.Cells(y, x).Value = ws2.Cells(y, x).Value Then Else ws3.Cells(e).Select ActiveCell.FormulaR1C1 = "A,e+1" End If マクロの骨格はこんな感じですけど、後は、Forループで回せば良いと考えております。 ActiveCell.FormulaR1C1 = "A,e+1"の部分が良く分かりません。 どの様にすれば、新たに作成したsheetのA1に数値が違うセルの番地例えばE5と入れる事が出来るのでしょうか、それもE5一つだけではなく沢山あります。G7とか・・・ どなたか、ご教授願います。宜しくお願い申し上げます。

  • Excel マクロ 重複チェックについて

    Excel マクロ 重複チェックについて Sheet3のA列とB列に製品番号が入っています。 A列とB列を比較して、A列と同じ番号がB列に2個以上ある場合のみ C列にフラグ「1]を入れたいです。 Sub RetsuCheck() Dim i As Long Dim ws1 As Worksheet Set ws1 = Worksheets("Sheet3") '「Sheet3」シートでA列とB列の重複をチェック。 For i = 2 To ws1.Cells(Rows.Count, 1).End(xlUp).Row If ws1.Cells(i, "A") = ws1.Cells(i, "B") Then ws1.Cells(i, "C") = 1 End If Next i End Sub 1個の場合には上記マクロで解決するのですが、 2個以上の場合にどうようなマクロを記載すればよいのか アドバイスを頂けませんでしょうか。 よろしくお願いいたします。

  • 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

  • エクセル:マクロの手直し

    お世話になります。 以前ここで教えてもらったマクロのシート名のつけ方をすこし手直ししたいのでアドバイスください。 以下のマクロは、1シート目を決まった行数分に分割し各シートに振り分けるものです。今のマクロではシート名は分割1、分割2…分割10…などなりますが、Worksheets(1) のシート名+3桁の連番(001,002…010…)などとしたい。 Worksheets(1) のシート名が「総務課」の場合、総務課001,総務課002…総務課010…となるのが理想です。 このようにするためにはマクロをどのように修正すればよいか教えてください。 Sub シート分割()  Dim WS1 As Worksheet  Dim WS2 As Worksheet  Dim i As Integer  Dim Bunkatsu As Integer  Set WS1 = Worksheets(1) 'コピー元のデータシート  Set WS2 = WS1  Bunkatsu = 1  Application.ScreenUpdating = False  For i = 7 To WS1.Cells(Rows.Count, 1).End(xlUp).Row Step 25   Set WS2 = Worksheets.Add(After:=WS2)   WS2.Name = "分割" & Bunkatsu   WS1.Rows("1:6").Copy WS2.Cells(1, 1)   WS1.Rows(i & ":" & i + 24).Copy WS2.Cells(7, 1)   Bunkatsu = Bunkatsu + 1  Next  Application.ScreenUpdating = True End Sub

  • マクロで塗りつぶしセルのカウント

    マクロ初心者です。アドバイスをお願いします。以下のマクロですとB列の100行目までの塗りつぶしのセルのカウントは出来るのですが、シート上の全てをカウントしたいのです。1TO 100の100の部分をどう変更したら良いのか教えてください。 Sub セルの色数1() Dim I As Integer Dim Count As Integer Count = 0 For I = 1 To 100 If Cells(I, 2).Interior.ColorIndex <> xlNone Then Count = Count + 1 Next I Range("C1").Value = Count End Sub

専門家に質問してみよう