Excel VBAでのデータのセル上詰めコピーの方法

このQ&Aのポイント
  • Excel VBAでデータのセル上詰めコピーをする方法について教えてください。
  • データのあるシートから別のシートに空行を詰めてコピーするVBAの書き方について教えてください。
  • VBAのRangeとCellsの使い分けやエラー行のスキップ方法について教えてください。
回答を見る
  • ベストアンサー

Excek VBA 上へ詰めてコピー

VBAの勉強を始めたのですが、単純コピーはわかるようになったものの、空行の上詰めしながらのコピーでつまづいているので教えてください。 またセル範囲について、RangeとCellsの使い分けでもつまづいています。 画像の"Sheet1"のようなデータがあります。データの始まりはセル"A1"から始まっていますが、末尾(最終行)はデータのより様々で、最終行が決まっていません(n行)。 このデータを任意のシート(例では"Sheet2")の左上からコピーしたいのですが、その際に元の"Sheet1"のA列にエラー行が入ることがあります。エラー行は次の2種類です。 1. "error"など特定の文字(数字ではないもの)が入っている行 2. 空行(A列だけで判断) これらのデータ行は、行そのものをSheet2にはコピーせず、上へ詰めて正常行をペーストしていきたいのです。 Dim i As Integer For i の書き方 WorksheetsとCells(またはRange) エラー行のスキップの仕方 などがわかりません。 元(Sheet1)のデータは概ね体裁が決まっており、データの例外(エラー)は上の1. 2以外は考えずに、シンプルな書き方を望んでいますが、どのように記載したらよいでしょうか。

  • ketae
  • お礼率86% (295/343)

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

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

1行目は数字じゃないけどコピーしたいとかの例外もあるのはまぁ良しとして。 要するに「A列が数字(の生データを仮定)である」を拾ってコピーする、だけの事です。方策は山ほどあります。 sub macro1()  worksheets("Sheet1").select  rows(1).copy destination:=worksheets("Sheet2").range("A1")  on error resume next  range("A:A").specialcells(xlcelltypeconstants, xlnumbers).entirerow.copy _   destination:=worksheets("Sheet2").range("A2") end sub どーしても1行ずつ舐め回したいなら sub macro2()  dim h as range  worksheets("Sheet1").select  rows(1).copy worksheets("Sheet2").range("A1")  for each h in range("A2:A" & range("A65536").end(xlup).row)   if h <> "" and isnumeric(h) then    h.entirerow.copy destination:=worksheets("Sheet2").range("A65536").end(xlup).offset(1)   end if  next end sub 同じことを行番号で行うなら sub macro2r()  dim r as long  worksheets("Sheet1").select  rows(1).copy worksheets("Sheet2").range("A1")  for r = 2 to range("A65536").end(xlup).row   if cells(r, "A") <> "" and isnumeric(range("A" & r)) then    rows(r).copy destination:=worksheets("Sheet2").range("A65536").end(xlup).offset(1)   end if  next end sub

ketae
質問者

補足

ありがとうございます。 1行ずつ舐めるやり方を今後学ぶ必要がありそうです。 まずは教えていただいた記述を週末1つづつ勉強してみます。

その他の回答 (3)

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

>1行ずつ舐めるやり方を今後学ぶ必要がありそう どうしてそんな思い込みをしたのか、詳しい状況を添えて別途のご相談として投稿してみて下さい。

ketae
質問者

お礼

データは全体を操作するのと、列ごとに操作、提供データの行例(挿入場所も)を入れ替える、第三者からの提供データななどがある、などがあるのがわかっているので、いろいろ覚えていこうと思っています。

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

ANo.1です。 > A~C列の各行はたぶん数千から万に達するデータがあるので(n行)、行数が確定していない場合のVBAの練習を現在しているのでした。 提示したコードはあくまでサンプルです。 ご自身の環境に合わせて修正してください。 ちなみに行数が不定なら Range("A1:C13").の部分を、Range("A:C")にするだけです。 「複数シートに展開」ってのは条件も何も書かれていないので回答は控えさせていただきます。

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

Excelは文字は数値より大きいと判断しますのでそれを利用してフィルターオプションで抽出しましょう。 添付の図の例では検索条件にE1:E2セルを使っています。 E1に検索条件の項目名「コード」。E2に不等号+コードの最大値より大きい数値、今回は「<999999」と入れました。 後は、以下のコードで2番目のシートに検索条件に合致した行だけ抽出されます。 Sub Sample()   Range("A1:C13").AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=Range( "E1:E2"), CopyToRange:=Worksheets(2).Range("A1"), Unique:=False End Sub

ketae
質問者

お礼

ありがとうございます。 A~C列の各行はたぶん数千から万に達するデータがあるので(n行)、行数が確定していない場合のVBAの練習を現在しているのでした。 この質問は今後複数シートに展開されますので、今後ともよろしくお願いします。

関連するQ&A

  • VBAの操作

    ↓の事を行いていのでうまくいきません。 アドバイスをお願いできませんか? 変更前(Sheet1); (A列) (B列) 1 ABC010 Data_010 2 ABC020 (同上) 'B1-B2は結合セル 3 ABC030 Data_020 4 ABC040 (同上) 'B3-B4は結合セル . . 変更後(Sheet2); (A列) (B列) 1 ABC010 "OK" 2 ABC020 "OK" 3 Data_010 "Comp" '追加行 4 ABC030 "OK" 5 ABC040 "OK" 6 Data_020 "Comp" '追加行 . . Sheet1(B列)に値があれば、 Sheet2(A列)に結合セルの単位で値をコピーする。 Sheet2(B列)には"OK"コメント その都度、必ず最後に行追加して結合セルの値、"Comp"コメントをコピーする. 現象は毎行、追加行が挿入されてしまいます。 Sub testVBA() Dim i Worksheets("Sheet1").Range("A:B").Copy With Worksheets("Sheet2") .Range("A1").PasteSpecial For i = 1 To 1000 If .Cells(i, 2) <> "" Then .Cells(i + 1, 1) = .Cells(i, 2) .Cells(i + 1, 2) = "Comp"   .Cells(i, 2) = "OK" End If Next i End With End Sub

  • 【VBA】Ifで他シートから検索しコピーする

    Excel vbaについて教えてください。 自分で作成したコードが、うまく動かず悩んでいます。 ●作りたいもの Sheet3のA列にある数字を検索値とし、 Sheet1のA列を検索し、合致する行のB列~最終列までコピーし、 Sheet3のB列から貼付する。 ※Sheet1にある列数(項目数)は不定です ●作成したマクロ Sub test() Dim sh1 As WorkSheet Dim sh2 As WorkSheet Set sh1 = Worksheets("Sheet1") Set sh2 = Worksheets("Sheet3") d = sh2.Range("A1").End(xlDown).Row 'Sheet3検索値のA列のデータの最終行 g = sh1.Range("B1").End(xlToRight).Column 'Sheet1の最終列 k = 2 For i = 2 To d    'Sheet3最終行まで If sh1.Cells( i & "A") = sh2.Cells( 1,"A") Then '条件)Sheet1とSheet3のA列が合致 For j = 2 To g                      'Sheet1の最終列まで sh2.Cells( k , j ) = sh1.Cells( i , j ) 'Sheet1のB行から最終列をコピーしSheet3へ貼付 Next j End If Next End Sub いろいろ直していたのですが、Set sh2 = Worksheets("Sheet3")で「インデックスが有効範囲にありません」(同じブック内に同名シートがあるのに?)とエラーが出たり、 また、B行から最終列までコピーする際の範囲指定についてもよくわからず、 もっと他に良い方法が無いものかとお手上げ状態です。 どうぞ宜しくお願いいたします。

  • Excel 任意の列の特定の行のみ値の取得

    書籍とサイトで教えていただいた説明などを見ながら、ExcelのVBAでセル内のデータの操作について勉強中ですが、タイトルのようなことをやる場合のオブジェクト式の選び方がわかりません。 よろしくお願いします。 例えば図のようなデータが入った"Sheet1"があり、行数、列数は様々なのですが、やりたいことは ・A列にエラーコード(ここでは"9999"または特定文字列)、空行、0が入っている行(ピンク色がついたセルのある行)は無視する。 ・任意の列がコピー元(ここでは「A列=コード」「B列=商品名」「E列=価格」で、上記に該当しないセルが対象 ・そのセルの値のみ取得し、"Sheet2"のA~C列に上から順に(上詰めで)「値」のみをはりつけたい Dim i As Long Worksheets("Sheet1").Select Rows(1).Copy Worksheets("Sheet2").Range("A1") For i = 2 To Range("A65536").End(xlUp).Row If Cells(i, "A") = 9999 And IsNumeric(Range("A" & i)) Then この記述ではこのデータ操作ではエラーを変えすのですが、 根本的な「任意の列の特定の行のみの値の取得(と他シートへの複写)」の概念がわかっていません。 正しく動作する記述において、なぜそのオブジェクト式を採用するのかも含めて教えていただければと思います。 よろしくお願いします。

  • VBA - セル解除

    コピーA列結合セルを解除して、解除した行にすべてに「OK」と入れたいのですがうまくいきません。 アドバイスをお願い致します。 Dim i, Addr Worksheets("Sheet1").Range("A:A").Copy With Worksheets("Sheet2") .Range("A1").PasteSpecial . . If .Cells(i, 1).MergeCells Then Addr = .Cells(i, 1).MergeArea.Address .Cells(i, 1).UnMerge .Cells(i, 1)(Addr) = "OK" '←ここがダメです。 End If . .

  • VBA 新データ行のみ元のデータシートにコピーする

    OSは、XP Excelは、2003 を使用しています。 シート1には元のデータ、シート2には追加データと元データが混じってあります。 元データシートに、追加データシートから追加データ行のみをコピペしたく、 マクロを組んでいます。 下記、 C列の売上番号を見比べて、C列のみ追記するまでは出来たのですが、 1行にデータはA列~X列まであるので、そのデータも一緒にコピペするには どの様にすれば良いのか教えて下さい。 よろしくお願いします。 ****************** Sub 追加データ追記マクロ() Dim motows As Worksheet '元データシート名を格納 Dim tsuikaws As Worksheet '追加データシート名を格納 Dim tsuikamax As Long '追加データの最終行 Dim motomax As Long '元データの最終行 Dim tsuikaNum As Range '追加売上番号 Dim motoNum As Variant '元売上番号 Dim i As Long     '書き込み行 Set motows = Worksheets(1).Name '元シート名を格納 Set tsuikaws = Worksheets(2).Name    '追加シート名を格納 tsuikamax = tsuikaws.Cells(Rows.Count, 1).End(xlUp).Row  '追加データの最終行を格納 motomax = motows.Cells(Rows.Count, 1).End(xlUp).Row '元データの最終行を格納 i = motomax + 1       '書き込み行は元データ最終行+1 For Each tsuikaNum In tsuikaws.Range("C1:C" & tsuikamax)        '追加データ売上番号格納 Set motoNum = motows.Range("C:C").Find(tsuikaNum, lookat:=xlWhole) '元データ売上番号格納 If motoNum Is Nothing Then '元データになかったら With motows .Cells(i, 3) = tsuikaNum i = i + 1 End With End If Next tsuikaNum End Sub

  • EXCEL VBA オートフィルタの値コピー2

    たびたびすいませんよろしくお願いします。 EXCEL VBA オートフィルタの値コピーの追加質問です http://okwave.jp/qa4803815.html?ans_count_asc=20 オートフィルタ後、1日当たり行は10~15行あります、そのうちH列からM列まで、ある1行にデータがありますそのデータをH列から順番にSheet1のM20とM28までコピーしたいのです、ただ日によってその列は空欄の時やM列だけの時もありますもあります。さらにN列からP列まで同じようにデータがある時(H列からM列と行が違うときがあり)、上にある行からSheet1のM20とM28に上詰めでコピーしたいのです。 もっと簡単にいいますとH列からP列まである値を上の行からさらにH列から順番に上詰めでSheet1のM20とM28にコピーしたいのです。 なにとぞよろしくお願いします。 Sub データコピー() Range("AB17") = Format(Sheet3.Range("A3").Value, "yy") Range("AE17") = Format(Sheet3.Range("A3").Value, "mm") Range("AH17") = Format(Sheet3.Range("A3").Value, "dd") Range("AK17") = Format(Sheet3.Range("A3").Value, "aaa") Range("D22") = Sheet4.Range("D3").Value Range("D25") = Sheet4.Range("E3").Value Range("H22") = Sheet4.Range("F3").Value Range("D22") = Sheet4.Range("G3").Value Range("L22") = Sheet4.Range("K3").Value Range("Q22") = Sheet4.Range("L3").Value Range("U22") = Sheet4.Range("M3").Value .   .   . End Sub

  • VBAで検索してコピー

    エクセル2003を使っています。 下記のような構文で、あるデータを検索しています。 検索まではできましたが、その検索したデータが入力されている行を選択して別のシートにコピーしたいです。 Dim ws1 As Worksheet, ws2 As Worksheet, ws3 As Worksheet Dim rng As Range Set ws1 = Sheets("CSV") '検索先のシート Set ws2 = Sheets("0群加工") '検索データのシート Set ws3 = Sheets("完了") '貼付先シート Set ws4 = Sheets("過程") With ws1.Columns("A") '完全一致でシートの頭から検索(A列) i = 2 Do Until ws2.Cells(i, "E").Value = "" 'ws2のデータがなくなるまで Set rng = .Find(What:=ws2.Cells(i, "E").Value, LookAt:=xlPart, After:=.Cells(.Cells.Count)) '検索 上記は0群加工シートに入力されているデータを、CSVシートに入力されているデータを検索しています。 (ここのデータというのは時間が入力されています。つまり、0群シートに入力されている時間と同じ時間を、CSVシートで検索しています) CSVシートに同じデータがあれば、そのデータがあるセルが属する行をコピーして、違うシートに貼り付けたいです。 よろしくお願いします。

  • 複数ファイルの特定のセルをコピーして1つにまとめる

    1つのフォルダ内の複数のファイル(Sheet1のみ)から、 特定のセルをコピーして、1つのファイルにまとめたいと 思っています。 変数  wkb 複数のファイル  myb 自分のファイル (1) wkb.Sheets("Sheet1").Range("A1:D5").Copy myb.Sheets("統合").Cells(i, "A").PasteSpecial Paste:=xlPasteValues このように書いた場合、うまくいくのですが (2) wkb.Sheets("Sheet1").Range(Cells(1, 1), Cells(5, 5)).Copy myb.Sheets("統合").Cells(i, "A").PasteSpecial Paste:=xlPasteValues このように書くと、1004でエラーとなります。 本来は、Sheet1の1行目から5行目までの中で、値がある行まで コピーしたいので、(つまり1~3行目のときもあれば、1行目だけの ときもある。)(2)の方法で実行したいのです。 なんとかいい方法はないでしょうか?

  • VBAでコピー&ペーストをループ化する方法

    お忙しいところ申し訳ありません、ご教授の程お願い致します。 ワークシート(1)とワークシート(2)の間で特定のセル列をコピー&ペーストしたくそれを列のデータが無くなるまで(空白まで)処理したいのですが、 単一セルの処理は Worksheets("ワークシート(1)").Range("BJ2") = Worksheets("ワークシート(2)").Range("E2") で値の貼り付けが実行され成功したのですがそれをループ化したい構文に当てはめると空白まで自動的に処理してくれるような動作をしません。 検索してしらべてみたのですが、 Sub test() Dim i As Integer i = 1 Do Until cells(i, 2) = "" cells(i, 2) = Worksheets("ワークシート(1)").cells(2, 62) = Worksheets("ワークシート(2)").cells(2, 5).End(xlDown) i = i + 1 Loop End Sub で、試してみましたが動作しなかったです。 お忙しいところ申し訳ありませんが、宜しく御願い申し上げます。

  • Excel VBA 値取得について

    お世話になります。 どなたかお力をお貸しください。 Excel2003 VBAでプログラムを組んでおり、エクセルのシートをデータベース代わりに利用しています。 複数のブック散乱している10万個近くのテキストボックスの値を、 「A」というブックの「シート1」のセルに格納して行きたいと思っております。 値の格納方法としては、「A」ブックの「シート1」の セルA1からA2、A3…A列最終行(6万強)まで縦の並びにデータを格納していきます。 ただし、「シート1」に格納したい値は10万個近くあるので、 A列だけでは足りなくなります。 A列の最終行まで値を格納し終えたら、自動的にB列に移動して、 セルB1からB2、B3…B列最終行(6万強)という遷移させていきたいのです。 A列のみに格納していくのであれば、理解できるのですが、 自動遷移がわかりません。 For i = 0 To 最終行(6万強) シート1.Range("A" & i) = 参照元 Next i よろしくお願いします。

専門家に質問してみよう