VBAを使用した列の削除方法について教えてください

このQ&Aのポイント
  • ワードからエクセルにデータを移す際、毎回同じ作業をするのが面倒です。セルの区切りや不要な行の削除ができれば効率的ですが、VBAのマクロで削除する方法を知りたいです。
  • ワードからコピーして貼り付けたデータには不要な行がありますが、その行数や位置が毎回異なります。空白の行だけでもマクロで削除したいですが、Ctrl+Gでは消せません。
  • A列のセルの1文字目がXまたはY以外の列を削除したいです。具体的なコードや効率的な方法を教えてください。
回答を見る
  • ベストアンサー

VBAを使用した列の削除

失礼します。 現在機械で計測したデータがワードに出力されているのですが、 それをエクセルに移してデータ処理を行っています。 ワードからコピーする作業や、セルの区切りを分ける作業は 毎回同じなので良いのですが、 不要な行が毎回異なる行数、位置に大量にあるのでマクロで削除できないかと思いつつも 初心者のため何がだめなのかまったく分かりません。 せめて空白の行だけでも先に消そうと思うのですが、 Ctrl+Gでは消せない状態です。 (おそらく貼り付けたときにワードの改行などが入っている可能性があります。) ワードからコピーして貼り付けた状態ではA列のみ埋められている状態です。 A列のセルの1文字目にX又はYのある列以外を削除したいのですが、 詳しい方教えてください。 また、ワードのコピー、セルの区切りをつけるやり方などで 効率よい方法をご存知の方いらっしゃいましたら併せて教えてください。 よろしくお願いします。 以下に作成したものを書きます。 ------------------------ ActiveWorkbook.Worksheets("Sheet1").Activate For i = 1 To 5000 If Cells(i, 1).Characters(1, 1).Text <> X Or Cells(i, 1).Characters(1, 1) <> Y Then Range(i & ":" & i).Delete End If Next i ------------------------- これを行うと”オブジェクトは、このプロパティまたはメソッドをサポートしていません” と表示されます。

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

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

遅いマクロ: sub macro1()  dim i  activeworkbook.worksheets("Sheet1").activate  for i = range("A65536").end(xlup).row to 1 step -1  if left(cells(i, "A"), 1) <> "X" and left(cells(i, "A"), 1) <> "Y" then   cells(i, "A").entirerow.delete shift:=xlshiftup  end if  next i end sub すこしましなマクロ: sub macro2()  activeworkbook.worksheets("Sheet1").activate  range("1:1").insert  range("A:A").autofilter field:=1, criteria1:="<>X*", operator:=xland, criteria2:="<>Y*"  rows.delete shift:=xlshiftup end sub 参考: >オブジェクトは、このプロパティまたはメソッドをサポートしていません 少なくとも,XだのYだのは"X"や"Y"としておかなければいけません。

to8mo7
質問者

お礼

回答頂きありがとうございます。 どちらも使えました!! コメントまで頂き本当に助かります。 ""をつけなければならないのはネットで調べていたときに 載っていたのに調べていくうちに忘れてしまっていました。 追加で質問させていただきたいんですが、 macro1では小文字のx,yは削除されたのですが、 macro2では小文字のx,yは削除されませんでした。 これはどこに差があるのでしょうか。 ""の位置と*の違いでしょうか。 また、遅いマクロと書かれていますが、 頂いたマクロはそんなに時間はかかりませんでしたが どんなマクロが時間がかかるんでしょうか。 今後勉強していく際に早いマクロを作るポイントなど あれば教えてください。 (もちろん自分1人でマクロを作れるレベルになることが 優先ですが)

関連するQ&A

  • VBAのプログラムでうまく動かなくて困っています。

    VBA初心者です。 エクセルのVBAのプログラムでうまく動かなくて困っています。教えていただける方がいらしたら、ぜひ教えて下さい!よろしくお願いします。エクセルの内容は以下のとおりです。 (内容) セル    E H J L N P R・・・ 8行目100 200 50 40 30 80 9行目130 350 10 50 60 120 110 ・ ・ (1)列Hの値が列Eの値より大きい場合その下に行を追加します。 (2)セルJ+セルL+セルN+・・をしてセルEの値を超えたセル以降の値を追加した行のセルJ列から順にコピペする処理です。 上のセルの1行目の内容でいいますと、 (1)列Hの値「200」が列Eの値「100」より大きいのでその下に行追加 (2)セルJ、L、N「50」+「40」+「30」でセルEの値「100」より大きいので、追加した行のセルJ列にセルN、Pの値をコピペするです。 以下が私が書いたプログラムです。 Sub test() Dim x As Integer Dim s As Integer Dim t As Integer x = Range("B8").End(xlDown).Row r = Range("J8").End(xlToRight).Column '8行目から最終行までループ For i = x To 9 Step -1 If Cells(i, 5) < Cells(i, 8) Then ☆【For r = y To 11 Step -2 Cells(s, t).Value = Cells(i, r) + Cells(i, r + 2) If Cells(i, 5).Value < Cells(s, t).Value            Then Exit For Next】 Rows(i + 1).Insert Shift:=xlDown '超えたセルをコピーして、1行下の"J列以降"に代入 ★ x = x + 1 End If Next i End Sub 上記プログラムで★の部分がうまく書けません。☆の部分も間違っているような気がします。よろしくお願いします。

  • エクセル、比較、コピー、貼り付けのマクロ

    エクセルについて 同じシート内にあるB列2行目から66行目までとI列2行目から333行目までの セルを比較し、 B列2行目とI列2行目がおわったらB列2行目とI列3行目を比較という流れになる。 I列の比較が333行目まで終わったら、B列3行目とI列2行目を比較し、終わったらB列3行目とI列3行目を比較していきます。 同じ数値のセルがあったら (1)A列~E列(行は値が一致した行)をコピー (2)H列~L列(行は値が一致した行)をコピーし、 (1)はM列に貼り付け (2)はR列に貼り付け VBAのコードは以下の様になります Sub t() x = 2 y = 2 g = 1 n = 1 Do Do If Cells(x, 2) = Cells(y, 9) Then Range(Cells(x, 1), Cells(x, 5)).Copy Destination:=Cells(g, 13) Range(Cells(y, 8), Cells(y, 12)).Copy Destination:=Cells(n, 18) y = y + 1 g = g + 1 n = n + 1 Else y = y + 1 End If Loop While y < 334 Loop While x < 67 End Sub これを実行すると実行エラー1004 アプリケーション定義又はオブジェクト定義の エラーになります。誰か回答をお願いします。

  • エクセルVBAで、文字列の検索方法について

    先日、こちらで教えていただいたVBAがあります。 E列のセルの文字列の末尾が「計」のものを検索し、その行に色をつけるものです。 Sub iroiro() Dim x, y x = 1 Do If Right(Cells(x, 5), 1) = "計" Then For i = 2 To 5 Cells(x, i).Interior.ColorIndex = 3 Next End If x = x + 1 Loop Until Right(Cells(x, 5), 1) = "" End Sub これはばっちりで、助かっているのですが、今度は末尾ではなく、文字列中に「営業」という文字があるのを検索し、色をつけたいのです。 If Right(Cells(x, 5), 1) = "計" Thenを どう変えればいいのでしょうか?

  • 列を削除して行きたい。

    すみません、誰か教えて頂けませんか。 1行目にタイトルが書いてあり、その下が空欄だと 列を削除しようと考えて下記の様に記述しましたが、 2列目しか削除されません。 何か、記述がおかしいのか、他にやり方があるのか 教えて頂けませんでしょうか。 宜しくお願いします。 Co = Cells(1, Columns.Count).End(xlToLeft).Column For ii = 2 To Co If Cells(1, ii).End(xlUp).Row = 1 Then Cells(1, ii).EntireColumn.Delete End If Next ii

  • VBAで削除を早くしたいのですが…

    Excel2007のVBAです。キー記録を眺めながら四苦八苦しております。 数千行あるデータで、A列が"d"以外の行を削除したいのですが PCスペックが低いせいか、時間がかかってしまいます。 簡単に効率化することは可能でしょうか? よろしくお願いします。 ※1行目はタイトル列、全体行数は可変です。 Sub A05_A列がd以外は削除する() Application.ScreenUpdating = False Dim sh2 As Worksheet Set sh2 = Worksheets("削list") For i = Cells(Rows.Count, "C").End(xlUp).Row To 2 Step -1 If sh2.Cells(i, "A").Value <> "d" Then Rows(i).Delete End If Next Application.ScreenUpdating = True End Sub

  • VBA配列 印のついた列番号を格納して利用したい

    Excel VBAで下記処理を作成しました。配列を使えば処理が高速化できるのでは?と思い調べたのですが、配列を使ったことが無く、挫折しましたのでどなたかご教示いただけませんでしょうか。 <対象データ>(添付画像の黄色いセルが処理対象) ・処理対象の行は「区分」列に「0」が入っている ・処理対象の列は、1行目に「●」が入っている <作成した処理> ・ループ(1):データ開始行(画像では3行目)から順に見ていく  ・IF:「区分」列が「0」なら下記に進む(0以外なら次の行へ)   ・ループ(2):列を左から順に見ていく    ・IF:その列の1行目が「●」なら処理を行う For i = 3 To 10000 If Cells(i , 1) = 0 And Cells(i , 1) <> "" Then その行に対する処理の下準備のコード(記載省略) For j = 2 To 500 If Cells(1 , j) = "●" Then Cells(i , j)に対する処理(記載省略) End If Next j End If Next i <問題点> データ量が数千行×数百列と相応にあるため、処理実行に数秒かかります。今後、処理をより複雑にしたいため、高速化できないかと考えています。 <質問> 対象行について毎回、ループ(2)で各列の1行目を調べて●だったら処理する、としているのが非効率かも知れないと思いました。 1行目に●が入っている列番号を調べるのは1度で良いので、それを配列に格納して、ループ(2)の部分で使うことはできますでしょうか? ご存じの方、ご教示いただけますと幸いです。よろしくお願いいたします。

  • 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でコメントのコピー

    こんにちは。現在VBAでデータ集計をしている者です。 作業内容に沿った説明をしていると長くなりそうなので単刀直入に伺います。 たとえば、A列のいくつかの行のセルにコメントが挿入されていたとします。 そのコメントをコピーして、ひとつ隣のB列のセルにコメント"内容"をペーストしたいと考えているのですが、うまくいきません。 何か良い方法はないでしょうか。 その逆(B列のセルのデータをその隣のA列にコメントとしてコピー)なら以下のソースでできるのですが…。 Sub Comment_Copy() Dim C_str As String Dim i As Integer For i = 1 To 100 If ActiveSheet.Cells(i, 2).Value <> "" Then C_str = ActiveSheet.Cells(i, 2).Value ActiveSheet.Cells(i, 1).AddComment (C_str) End If Next i End Sub

  • 同一値が連続している列の削除

    エクセルで以下のようにA列にデータがあります。 sss qqq sss sss sss qqq fff ttt ttt sss sss 連続して同じデータが入っている列は最初の行だけのこしそれ以外は削除し以下のように表示したいと思っています。 sss qqq sss qqq fff ttt sss あるサイトで連続データある場合は最初の行の値を表示して残りの同じ値のデータは背景色と同じにして見えないようにするマクロがありました、が私のやりたい事は不要な行を削除したいのです、 どなたかお知恵をお貸し下さい。 以下参照 ############################## Macro 同じ値が連続している時二番目以降のデータを見えなくする方法 (Excel97,Excel2000,Excel2002) CSV ファイルや他のデータベースなどから、Excel のデータを作った場合 (データベース形式) 、 分類や区分などが連続して表示され、ごちゃごちゃと見にくいときがあります。 以下のマクロは、上の行と同じデータが入力されていた場合、下の行のデータを見えなくします。 削除するのではなく、背景色と同色にしますので、数式バーには元のデータが表示されます。 以下のコードを標準モジュールに貼り付けて、 該当するワークシートで、このマクロを実行してください。 対象は 「A列」 です。 Sub SetFontColor() '同じ値が連続している時二番目以降のデータを見えなくする。 '(Fontの色を背景色と同一にする) A列のデータが無くなるまでループ '2003/10/05 pPoy Dim i As Integer Dim myColor As Integer Dim myC As String myC = "A" 'A列指定 With ActiveSheet i = 2 ' 2行目から開始 Do While .Cells(i, myC).Value <> "" If .Cells(i - 1, myC).Value = .Cells(i, myC).Value Then myColor = .Cells(i, myC).Interior.ColorIndex If myColor = xlColorIndexNone Then '背景色無 .Cells(i, myC).Font.ColorIndex = 2 '白 Else '背景色 .Cells(i, myC).Font.ColorIndex = myColor End If End If i = i + 1 Loop End With End Sub ≪注意≫ この作業は 「A列」 が対象です。 必要に応じて列名を変更してください。 間に空白のセルがあると、そこで終了します。 実行後ワークシートは、無条件で上書きされます。 この作業は元に戻せません。 必ず最初に保存してから実行してください。 データを消去する方法は、こちら です。 ################################

  • エクセルマクロ 条件分岐 条件に合わない列は削除

    マクロ初心者です。 添付のようなデータが30000万行位ありますが、 1)セルAの値が16またはRFの場合はその行のデータをすべて残します 2)セルAの値が上記以外の場合はその行をすべて削除したいのですが 私なりに調べて次のようなマクロを記録しました。 Sub macro1() Dim i As Integer For i = 1 To 30000 If Cells(i, 1).Value = "16" Or Cells(i, 1).Value = "RF" Then Cells(i, 1) = Cells(i, 1) Else Rows(i).Delete End If Next i End Sub 1)の部分は何とか動いてくれているみたいですが 2)の条件に合わない行の削除の記録がぜんぜんだめみたいで途方に暮れています。 わかる方がいらっしゃいましたら是非ご教授願います。

専門家に質問してみよう