• ベストアンサー

ExcelVBA データのコピー範囲について

あけましておめでとうございます。今年もよろしくお願いします。 Sub Test() Dim myTarget As Range, r As Range, f Set myTarget = Sheets("Sheet1"). _    Range("B2", Sheets("Sheet1").Range("B65536").End(xlUp)) For Each r In myTarget  Set f = Sheets("Sheet2").Columns(1). _    Find(r.Value, Sheets("Sheet2").Range("A1"), Lookat:=xlWhole)  If Not f Is Nothing Then    If r.Offset(0, 3).Value <> f.Offset(0, 3).Value Then      f.Resize(1, 4).Copy Destination:= _      Sheets("Sheet3").Range("A65536").End(xlUp).Offset(1, 0)    End If  End If Next r End Sub 前回の質問で教えていただいたコードなのですが、現時点では、B列のデータを元にして二つのSheetのデータを比較して別Sheetへコピーしているのですが、そのときに、B列以降の(たとえば、B列からX列まで)データはコピーできますが、A列もコピーしたい時はどうすればよいのかで、悩んでいます。どの様に変更すればよいのでしょうか?

  • yuk777
  • お礼率86% (183/212)

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

  • ベストアンサー
  • ki-aaa
  • ベストアンサー率49% (105/213)
回答No.5

例示されたコードでは、結果が出なかったので 一部変更しています。 Sub Test() Dim myTarget As Range, r As Range, f Set myTarget = Sheets("Sheet1"). _    Range("B2", Sheets("Sheet1").Range("B65536").End(xlUp)) For Each r In myTarget  Set f = Sheets("Sheet2").Columns(2). _    Find(r.Value, Sheets("Sheet2").Range("B2"), Lookat:=xlWhole) '変更前 Set f = Sheets("Sheet2").Columns(1). _ '変更前 Find(r.Value, Sheets("Sheet2").Range("A1"), Lookat:=xlWhole)  If Not f Is Nothing Then    If r.Offset(0, 2).Value <> f.Offset(0, 2).Value Then '変更前 If r.Offset(0, 3).Value <> f.Offset(0, 3).Value Then      f.Offset(0, -1).Resize(1, 4).Copy Destination:= _      Sheets("Sheet3").Range("A65536").End(xlUp).Offset(1, 0) '回答個所  f.Resize(1, 4).Copy    End If  End If Next r End Sub

yuk777
質問者

お礼

細かい質問に答えていただき感謝いたします。 データもウマク動き大変感動しています。 ありがとうございました。

その他の回答 (4)

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.4

元の質問は http://okweb.jp/kotaeru.php3?q=1130032 ですよね。 例データは私が一部補充。 元のソースのままで実行してみました。 (Sheet1)A1:D4 コード 商品 店名 納入日 0360 メロン D店 1月4日 0001 みかん A店 1月3日 0112 きんかん C店 1月4日 (Sheet2)A1:D4 コード 商品 店名 納入日 0001 みかん A店 1月3日 0360 メロン D店 1月2日 0112 きんかん D店 2月11日 (結果)Sheet3 0360 メロン D店 1月2日 0112 きんかん D店 2月11日 となり、A列(=コード)ももって来てますが。 私の勘違いなら済みません。

yuk777
質問者

お礼

なんだか、私の質問の仕方が悪いようなので、もう一度書きます。 (Sheet1)A1:D4 入力日 区画 コード 商品 店名 納入日 1/1   1   0360 メロン D店 1月4日 3/2   1   0001 みかん A店 1月3日 3/3   3   0112 きんかん C店 1月4日 (Sheet2)A1:D4 入力日 区画 コード 商品 店名 納入日 3/2   1   0001 みかん A店 1月3日 1/1   1   0360 メロン D店 1月2日 3/3   3   0112 きんかん D店 2月11日 (結果)Sheet3 1/1   1   0360 メロン D店 1月2日 3/3   3   0112 きんかん D店 2月11日 という状況に変わったので、C列のコードが一致する行の納入日を比較して結果を出したいのですが、現在の    If r.Offset(0, 3).Value <> f.Offset(0, 3).Value Then      f.Resize(1, 4).Copy Destination:= _      Sheets("Sheet3").Range("A65536").End(xlUp).Offset(1, 0)    End If のままだとC列より左側のデータがコピーされないので困っています。どのように書き直すのが良いのでしょうか?

  • happypoint
  • ベストアンサー率36% (521/1422)
回答No.3

まちがっちゃった。 Set myTarget = Sheets("Sheet1"). _    Range("E2", Sheets("Sheet1").Range("B65536").End(xlUp)) だね。

  • happypoint
  • ベストアンサー率36% (521/1422)
回答No.2

Set myTarget = Sheets("Sheet1"). _    Range("B2", Sheets("Sheet1").Range("B65536").End(xlUp)) が Set myTarget = Sheets("Sheet1"). _    Range("A2", Sheets("Sheet1").Range("B65536").End(xlUp)) になるんでないの? アドバイスだけど、 こういう質問のときは、前回の質問の番号を出した方がいいよ。

  • happypoint
  • ベストアンサー率36% (521/1422)
回答No.1

f.Resize(1, 4).Copy Destination:= _ を f.Resize(0, 4).Copy Destination:= _ でどうですか? 誰に教えてもらったコードなの? 綺麗なコードだね。

yuk777
質問者

補足

ありがとうございます。 すみません、もしE列を比べて、A-D列もコピーの場合はどうなるんでしょう??

関連するQ&A

  • なぜかデータがコピーされない(ExcelVBA)

    お願いします。 Sheets("sheet6").Range("A1:IV65536").ClearContents Xn1 = Sheets("sheet3").Range("B65536").End(xlUp).Row Sheets("sheet6").Range("A1:B" & (Xn1 - 2)).Value = Sheets("sheet3").Range("B3:C" & Xn1).Value このコードでシート6に何もコピーされないのはなぜでしょうか。 シート3のB,C列には数値が並んでいます。 Xn1はカウントされています。(xn=1631)

  • ExcelVBAで画像の様に動作を変更したいです

    先日、こちらにて 教えていただいたマクロでのデータ突合方法を基にマクロを作成中なのですが、 画像の様に動作させるにはどう修正すればよいでしょうか (目標) 画像のSheet1 と Sheet2の商品コードを上から順に突合し、 Sheet3に合致したA品番をコピー Sheet4に合致したB品番をコピー Sheet5に合致しなかったA品番をコピー Sheet6に合致しなかったB品番をコピー ※なお、A品番B品番ともに同じ値の品番がいくつか存在することがある。 この場合は、ループ中既に合致したデータは対象から外す。 判別方法は品番の一つ横のセルに”〇”を表記。(フラグを立てる) 「A品番=B品番」のとき「Offset(0, 1)が”〇”」ならば合致しない  --------------------------------------------------- (手順) (1)Sheet1 あり Sheet2 ありの場合 →一致したSheet1とSheet2のOffset(0, 1)に”〇” →一致したSheet1の行全体の値をSheet3にコピー →一致したSheet2の行全体の値をSheet4にコピー (2)Sheet1 あり Sheet2 なしの場合 →該当するSheet1の行全体の値をSheet5にコピー (3)Sheet1 なし Sheet2 ありの場合 →該当するSheet2の行全体の値をSheet6にコピー --------------------------------------------------- (現在のコード) Sub Test() Dim c As Range, FRange As Range Dim Sh1 As Worksheet, Sh2 As Worksheet Set Sh1 = Worksheets("Sheet1") Set Sh2 = Worksheets("Sheet2") For Each c In Sh1.Range(Sh1.Cells(3, "A"), Sh1.Cells(Rows.Count, "A").End(xlUp)) Set FRange = Sh2.Range(Sh2.Cells(3, "A"), Sh2.Cells(Rows.Count, "A").End(xlUp)). _ Find(c.Value, LookAt:=xlWhole, After:=Sh2.Cells(Rows.Count, "A").End(xlUp)) If Not FRange Is Nothing Then If c.Value = FRange.Value And FRange.Offset(1, 0).Value <> "◯" Then c.Offset(0, 1).Value = "◯" '↓(1).xlsmSheet2に Sheets("Sheet3").Cells(Rows.Count, "A").End(xlUp).Offset(1, 0).Value = c.Value FRange.Offset(0, 1).Value = "◯" End If Else '↓(1).xlsmのSheet3に Sheets("Sheet5").Cells(Rows.Count, "A").End(xlUp).Offset(1, 0).Value = c.Value End If Next For Each c In Sh2.Range(Sh2.Cells(3, "A"), Sh2.Cells(Rows.Count, "A").End(xlUp)) If c.Offset(0, 1).Value = "◯" Then '↓(2).xlsmのSheet2に Sheets("Sheet4").Cells(Rows.Count, "A").End(xlUp).Offset(1, 0).Value = c.Value Else '↓(2).xlsmのSheet3に Sheets("Sheet6").Cells(Rows.Count, "A").End(xlUp).Offset(1, 0).Value = c.Value End If Next End Sub ご指導頂ければ幸いです。

  • VBA空白を除いてコピーが出来ません。ご指導お願いします。

    値のコピー&ペースト(空白を除いてコピー)したいと思っております。 シート1 の A35、D35、I35 をコピー。 シート2 の A2 に貼り付け。 これは、大丈夫です。 シート1 の M2 : O23 をコピー。 シート2 の E2 に貼り付け。 今回の場合ですと、M2 : O13 までに値が入ってます。 ですので、M14 : O23 までが、空白になって記入となってしまいます。 *毎回、値が入る量が違います。 一回のコピーですと、これでもいいのですが、 値を変更して、コピーを続けてしますので、M14 : O23 までが、空白になってM24からのコピーになってしまいます。 空白を除いて、貼り付けしたいのですが、 どうすればいいのかわかりません。 お分かりになる方、ご指導よろしくお願いします。 VBAは以下になっております。 Sub Macro1() ' Application.ScreenUpdating = False Sheets("Sheet1").Range("A35,D35,I35").Copy If Sheets("Sheet2").Range("A2").Value = "" Then Sheets("Sheet2").Range("A2").PasteSpecial Paste:=xlPasteValues Else Sheets("Sheet2").Range("A" & Rows.Count).End(xlUp).Offset(1).PasteSpecial Paste:=xlPasteValues End If Sheets("Sheet1").Range("M2:O23").Copy If Sheets("Sheet2").Range("E2").Value = "" Then Sheets("Sheet2").Range("E2").PasteSpecial Paste:=xlPasteValues Else Sheets("Sheet2").Range("E" & Rows.Count).End(xlUp).Offset(1).PasteSpecial Paste:=xlPasteValues End If Application.CutCopyMode = False Application.ScreenUpdating = True End Sub よろしくお願いします。

  • 【エクセルVBA】データの振り分けについて。

    エクセルVBAでのデータの振り分けについて教えて下さい。 シート(1)のA列には他のファイルから抽出したデータがあります。 各行のデータの中に、H20年度が含まれている場合はシート(2)のA列に移動させ、H21年度が含まれている場合にはシート(2)のC列に移動させたいと思っています。 以前に sheets(1).Range("H40").Value Like "*○○*" Then sheets(2).Range("H40").Value = 0 sheets(1).Range("G" & myRow).End(xlUp).Offset(1, 0).Value = _ sheets(2).Range("H40").Value こういうものを使ったことがある為これを応用するといいのかなとも思ったのですが、わからなくなってしまい質問させていただきました。 勉強不足ですいません。 教えて頂けないでしょうか。よろしくおねがいします。

  • セル範囲指定方法

    VBAにて下記作成中ですが、行き詰ってしまいました。 どなたか、ご教授願います。 Sub 転記ボックス1_Click() Sheets("S").Select Range("N13").Select If ActiveCell.Value <> "" Then Selection.Copy Sheets("H").Select Range("K65536").End(xlUp).Offset(0, 1).Select --->シートH、K列最終行の右隣からL列最終行の範囲を指定 上記指定範囲内全てに、シートS・N13の値を貼付 ElseIf ActiveCell.Value = "" Then Sheets("H").Select Range("K65536").End(xlUp).Offset(0, 1).Select --->シートH、K列最終行の右隣からL列最終行の範囲を指定 上記指定範囲内全てに、”シートS・N13”と入力 End If End Sub --->部分の書き方がわかりません。 よろしくお願いします。

  • ExcelのVBAでコピーのやり方

    シート1のAL列の3行目以降の中から0以外の 値が入っているAJ列~AN列の行を全てコピーして、 シート2のB列~F列に貼り付けたいです。 シート2のB列~F列の7行目から下にコピーした値を入れていきたく、 値が入っていたらその次の行に貼り付けたいです。 例えば、7行目~15行目まで値が入っていたら、16行目から貼り付けるようにしたいです。↓のように書いてみたのですが、 コピーしている状態になるだけで、シート2の方へ貼り付けができない状態です。 また、オブジェクトが必要ですと表示が出ます。 どこをどうなおしたらいいでしょうか。 文章がわかりにくく申し訳ありません。 回答よろしくお願いいたします。 sub 値をコピー() Dim rTargetRange As Range, ii As Long Set rTargetRange = Nothing For ii = 4 To Cells(Rows.CountLarge, "AL").End(xlUp).Row If (Cells(ii, "AL").Value <> 0) Then If (rTargetRange Is Nothing) Then Set rTargetRange = Cells(ii, "AJ").Resize(, 5) Else Set rTargetRange = Application.Union(rTargetRange, Cells(ii, "AJ").Resize(, 5)) End If End If Next With Worksheets("sheet2") With .Cells(.Rows.CountLarge, "B").End(xlUp) If (.Row = 1 And .Value = "") Then rTargetRange.Copy .Offset(0) Else rTargetRange.Copy .Offset(1) End If End With End With End Sub また、↓のような違ったコードも試しましたが、 うまくいきませんでした。 N=Sheet2.Cells(Rows.CountLarge, "AL").End(xlUp).Row+1 SHEET1.SELECT For ii = 4 To Cells(Rows.CountLarge, "AL").End(xlUp).Row If Cells(ii, "AL").Valu e <> 0 Then RANGE("AJ" & ii & ":AN" & ii).COPY SHEET2.RANGE("B" & N) N=N+1 END IF NEXT

  • ExcelVBA コピー範囲を変数にしたい

    いつもお世話になっております。 またVBAでお知恵をください。 SHEET1のある範囲(フラグがたっている)をSHEET2にコピーしたいのですが フラグが存在しない場合もあるために悩んでいます。 途中まで自分でやってみたのですがエラーになりました。 Dim AA As Range For Each AA In Range("F4:AL4") ←ここの範囲にフラグがあります AA.Select With ActiveCell If .Value = "1A" Then Selection.Offset(7, 0).Select Range(Selection, Selection.End(xlDown)).Select Selection.copy Sheets("SHEET2").Select Range("F15").Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Sheets("sheet1").Select End With Next AA フラグ列を探し、1Aがあったらその7つ下のセルからラストのセルまでの 値をSHEET2のF15にコピーしたいのです。 フラグは1A、1B、2A、2Bと変化し、 貼り付け場所はそれに応じて1A→F15、1B→G15、2A→I15 となります。(貼り付け先は固定) ただし、フラグが存在しない場合もあり、その場合はSKIPです。 (1BがなければG15には何も貼り付けない) フラグは10Bまで合計20個あるため、できれば変数にしたいのですが どのように記述すればいいのかわかりません。 貼り付け先はF、G、I、J、L、M、O、P、と変化します。 (AとBでセットで間に1列あきます。が、Aだけの場合もある) これも変数にすればよいのでしょうが、15行目、というのを 記述する方法と、存在しない場合に詰めてしまわないようにする 方法がわかりません。。。。 お知恵を貸してください。 よろしくお願いいたします。

  • エクセルVBA の変数を使うべきでしょうか?

    はじめまして。エクセル初心者です。 書籍やサイトで勉強させてもらっていますが、VBAがなかなか難しくてすぐに壁にぶつかってしまいます。少々困ってしまい、詳しい方のアドバイスを頂ければと質問を投稿させていただきました。 どうか宜しくお願い致します。質問ですが、 以下のようなコードで、sheet5のB列の任意のセルをダブルクリックした場合、sheet5のBCD列の同じ行のセル値がsheet1の指定した列に入力されるという処理を作りました。 これで一応目的の動作はするのですが、数が増えると「コンパイルエラー・プロシージャが大きすぎます」というメッセージがでてしまいます。列や行には規則性があるので、もしかしたら変数というものを使ってコードを書き直せばいいのかなと思いネットで調べてみたのですが、今のところさっぱり理解できません。 申し訳ありませんが、分かりやすくご教授いただけないでしょうか。バージョンは2003を使っています。 また、下のコードですと、sheet5のBCDいずれかのセルに空白があった場合、sheet1の列に入力されるときに入力される行がずれてしまいます。今は空白を何かで埋めて対処しているのですが、この問題の解決策も教えて頂けると助かります。どうか宜しくお願い致します。 Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Excel.Range, cancel As Boolean) If Target.Address = "$B$2" Then Worksheets("sheet1").Range("B" & Rows.Count).End(xlUp).Offset(1).Value = Target.Value Worksheets("sheet1").Range("H" & Rows.Count).End(xlUp).Offset(1).Value = Worksheets("sheet5").Range("B2") Worksheets("sheet1").Range("K" & Rows.Count).End(xlUp).Offset(1).Value = Worksheets("sheet5").Range("C2") Worksheets("sheet1").Range("M" & Rows.Count).End(xlUp).Offset(1).Value = Worksheets("sheet5").Range("D2") Worksheets("sheet1").Activate cancel = True End If If Target.Address = "$B$3" Then Worksheets("sheet1").Range("B" & Rows.Count).End(xlUp).Offset(1).Value = Target.Value Worksheets("sheet1").Range("H" & Rows.Count).End(xlUp).Offset(1).Value = Worksheets("sheet5").Range("B3") Worksheets("sheet1").Range("K" & Rows.Count).End(xlUp).Offset(1).Value = Worksheets("sheet5").Range("C3") Worksheets("sheet1").Range("M" & Rows.Count).End(xlUp).Offset(1).Value = Worksheets("sheet5").Range("D3") Worksheets("sheet1").Activate cancel = True End If If Target.Address = "$B$4" Then Worksheets("sheet1").Range("B" & Rows.Count).End(xlUp).Offset(1).Value = Target.Value Worksheets("sheet1").Range("H" & Rows.Count).End(xlUp).Offset(1).Value = Worksheets("sheet5").Range("B4") Worksheets("sheet1").Range("K" & Rows.Count).End(xlUp).Offset(1).Value = Worksheets("sheet5").Range("C4") Worksheets("sheet1").Range("M" & Rows.Count).End(xlUp).Offset(1).Value = Worksheets("sheet5").Range("D4") Worksheets("sheet1").Activate cancel = True End If   ・     ・   ・     ・   ・     ・ End Sub

  • VBAでセルのコピーをすると、エラーになる

    =IF(COUNTIF('5月'!B4:I13,E13)=0,"",COUNTIF('5月'!I:I,E13))というセルを コピーして、別のシートのセルに貼り付けたのですが、値が「0」の場合「””」が セルに張り付いてしまい、その後の計算ができません。 「””」を本当の空欄にするにはどうしたらいいのでしょうか? Sub 転記() Dim sh1 As Worksheet Dim sh2 As Worksheet Dim SN As String SN = Month(Now()) Set sh1 = Sheets(SN) Set sh2 = Sheets("差出票") sh1.Range("A35").End(xlUp).Offset(1) = sh2.Range("B9") sh1.Range("A35").End(xlUp).Offset(0, 1) = sh2.Range("F13") sh1.Range("A35").End(xlUp).Offset(0, 2) = sh2.Range("F14") sh1.Range("A35").End(xlUp).Offset(0, 3) = sh2.Range("F15") sh1.Range("A35").End(xlUp).Offset(0, 4) = sh2.Range("F16") sh1.Range("A35").End(xlUp).Offset(0, 5) = sh2.Range("F17") sh1.Range("A35").End(xlUp).Offset(0, 6) = sh2.Range("F18") sh1.Range("A35").End(xlUp).Offset(0, 7) = sh2.Range("F19") End Sub

  • 実行時エラーの原因がつかめない(ExcelVBA)

    下記コードで実行時エラーの原因がつかめません。どなたか助けて ください。Sheet5のA,B列のデータを Sheet6 のA,B列に 一定の範囲で逆順にコピーする操作です。 Dim Dn As Integer, Zn As Integer Dn = Sheets("sheet1").Range("E37").Value / 8 + 0.5 Zn = Round(Dn) ‘ Sheets("Sheet6").Range("A1:A65536").ClearContents Xn2 = Sheets("Sheet3").Range("D65536").End(xlUp).Row - 5  Xn1 = Sheets("Sheet5").Range("A65536").End(xlUp).Row I = 0 Do Ix = I + 1 Iz = Xn1 - I Sheets("Sheet6").Range("A" & Ix & " : B" & Ix).Value _ Sheets("Sheet5").Range("A" & Iz & " : B" & Iz).Value I = I + 1 Loop Until I = Xn2 * Zn + 1

専門家に質問してみよう