• ベストアンサー

エクセル

前回質問させていただきました件の続になります。 大まかにうまく行きそうですが、一部 ¥0の部分が入っている行を削除したいのですが、うまくいきません。 データはA~Eに入力されていて、B列に数字が入っています。 B列が 0の場合その行を削除します。 If Worksheets("Sheet2").Cells(F, 2) = 0 Then '0の場合は行を削除する Cells(F, 1).EntireRow.Delete End If Fは行数をカウントするものです。 お手数ですが、よろしくお願いいたします。

  • a32
  • お礼率6% (7/109)

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

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

行の削除には、コツ(定石)があって、下の行からやって見てはどうでしょう。(Step -1) Sub test02() Dim sh1 As Object Set sh1 = Worksheets("Sheet3") d = sh1.Range("B65536").End(xlUp).Row For i = d To 1 Step -1 If sh1.Cells(i, "B") = 0 Then sh1.Rows(i).EntireRow.Delete End If Next i End Sub 多分#1でご指摘のような件が避けられます。

a32
質問者

お礼

具体的に書いていただきありがとうございます。 できました。

その他の回答 (2)

  • na_kirajp
  • ベストアンサー率43% (33/76)
回答No.3

#1です。 0で削除した場合に、削除行からしたの行数はー1されます。ただ、Fは次の値で処理をする為、削除行の直下の1行は判定されず0であっても削除されなくなっていると思います。 もっとスマートなやり方もあるかもしれませんが、 例えばこの形とか (iは単に何回処理を行うかだけの変数です) f = 1 For i = 1 To 処理する行数 If Worksheets("Sheet1").Cells(f, 2) = 0 Then '0の場合は行を削除する Cells(f, 1).EntireRow.Delete Else f = f + 1 End If Next i End Sub

  • na_kirajp
  • ベストアンサー率43% (33/76)
回答No.1

>Fは行数をカウントするものです。 0の行を削除したら、削除行以降は-1行されて上がってきますがFはその点考慮していますか?

a32
質問者

補足

下記のようになって降ります。 Sub BBBB() ' 'Sheet2の表の行数を調べる Sheets("Sheet2").Select E = Range("A65536").End(xlUp).Row For F = 1 To E If Worksheets("Sheet2").Cells(F, 2) = 0 Then '0の場合は行を削除する Cells(F, 2).EntireRow.Delete End If Next End Sub

関連するQ&A

  • エクセルVBAについて

    前回質問させていただきました件の追加機能になります。以前質問させていただきましたマクロが下記のものです。 Sub TESTa() Dim A As Long Dim B As Long Dim C As Long Dim D As Long Dim E As Long Dim F As Long '表の行数を調べる A = Worksheets("sheet1").Range("C65536").End(xlUp).Row - 1 For C = 1 To A For B = 4 To 7 'Sheet1のデータをSheet2に複写する Worksheets("Sheet2").Cells(B - 3 + D, 15) = Worksheets("Sheet1").Cells(C + 1, 1) Worksheets("Sheet2").Cells(B - 3 + D, 6) = Worksheets("Sheet1").Cells(C + 1, B) Worksheets("Sheet2").Cells(B - 3 + D, 14) = Worksheets("Sheet1").Cells(C + 1, 3) Worksheets("Sheet2").Cells(B - 3 + D, 10) = Worksheets("Sheet1").Cells(1, B) Worksheets("Sheet2").Cells(B - 3 + D, 13) = Worksheets("Sheet1").Cells(C + 1, 2) Next D = C * 4 Next 'Sheet2の表の行数を調べる Sheets("Sheet2").Select E = Worksheets("sheet2").Range("F65536").End(xlUp).Row '0欄の確認 For F = E To 1 Step -1 If Worksheets("Sheet2").Cells(F, 6) = 0 Then '0の場合は行を削除する Cells(F, 1).EntireRow.Delete End If Next End Sub カウントするとデータ個数がSheet1で約120件になりSheet2においては、4倍になりますので約480件になります。 そこで Sheet1において12件ごとに、Sheet2,3,4...としたいのです。 Sh1 NO.1~12がSheet2 Sh1 NO.13~24がSheet3 ... 10枚のシートにしたいのですが、このマクロにどのような命令を加えればよろしいでしょうか? お手数ですがよろしくお願いいたします。

  • Excel VBAに詳しい人に質問です。

    以下のようなFor文を使用して、F列が空白の場合、その行を削除するマクロを組んでいます。 しかし、他のシートなどデータが肥大になってきて、削除速度がかなり落ちました。 どうにか速度をあげる方法はないでしょうか? ワークシートの7~300の行でF列が空白の行を削除できれば良いです。 F列にはVLOOKUP関数で、検索に引っかからなかった場合に空白になるようにしています。 詳しい方アドバイスよろしくお願いします。 For k = 300 To 7 Step -1 If Worksheets("一覧").Cells(k, "F") = "" Then Worksheets("一覧").Rows(k).Delete End If Next k

  • エクセルVBAについての質問です。

    エクセルVBAについての質問です。 A列のCという商品名が入った列を削除したい場合下記のようにすれば可能かと思いますが、C列のCという商品名が入った列を削除したい場合どのようにすればよいか教えて下さい。 VBAに関してまだ初心者ですがどうぞよろしくお願いします。 行 = 1 Do 行 = 行 + 1 If Cells(行, 1) = "" Then Exit Do End If '行の値がC以外の時は次の行に移る Do If Cells(行, 1) = "C" Then Rows(行 & ":" & 行).Select Selection.Delete Shift:=xlUp Else Exit Do 'ジャンプ先は内側のDo~Loopのすぐ下 End If Loop 'ジャンプ先はここ If Cells(行, 1) = "" Then Exit Do End If Loop End Sub

  • エクセルVBAについて質問です。

    現在、マクロで重複データを削除する処理しています。 一応動作はするのですが、すごく遅いです。 およそ私のPC(XPのQuadコア)で1行処理するのに約0.85秒かかっています。 データが1万行以上もあるようなときは、何時間もかかってしまいます。 エクセルのデータは、以下のように、 A列とB列に文字列が何行にも渡って入っているものです。 A列   B列 AAA BBB CCC DDD EEE FFF GGG BBB CCC HHH CCC DDD (以下同様) 上のようなシートで、A列とB列の両方について重複する行を削除したいと思っています。 上記例だと、一番最後の「CCC-DDD」の箇所を削除したいです。 そこで以下のようなマクロを組みました。 (1)はじめに重複をチェックする変数(A列・B列)を取得します。 (2)上から順にチェックを開始します。 (3)A列・B列双方が取得した変数と一緒なら重複カウンターに1を加える。 (1回目の出現では削除しない) (4)チェックを続け、重複カウンターが2以上になった行は削除する。 (5)上記を空白行まで繰り返す。 というような流れです。 (マクロ記述の途中部分からです) '重複する行を削除 counter3 = 1 Do search_word1 = Cells(counter3, 1).Value search_word2 = Cells(counter3, 2).Value counter4 = 1 double_counter = 0 Do If Cells(counter4, 1).Value = search_word1 And Cells(counter4, 2).Value = search_word2 Then double_counter = double_counter + 1 If double_counter > 1 Then '二度以上出現した場合から削除する Cells(counter4, 1).EntireRow.Delete counter4 = counter4 - 1 End If End If counter4 = counter4 + 1 Loop Until Cells(counter4, 1).Value = "" counter3 = counter3 + 1 Loop Until Cells(counter3, 1) = "" 初心者なのもので、冗長や不適切な箇所などあるかと思います。 より効率的、あるいは、より早くできる書き方がありましたら、 ぜひともお教え下さい・よろしくお願いします。

  • エクセルについて

    ある表より特定の文字が入力されている行を削除したいと考えております。過去を参照し下記のようなマクロを取り入れたいと思いました。 Sub macro1() Dim R As Range Do Set R = ActiveSheet.Range("F:F").Find(What:="削除したい文字列", LookAt:=xlPart) If R Is Nothing Then Exit Sub R.EntireRow.Delete Loop End Sub ここで質問です。F列に削除したい文字列がいくつかある場合上記をどのように改良すればよいでしょうか。ご教示の程よろしくお願い致します。

  • エクセルマクロで特定の条件を満たすセルの関数を消す

    A1~D10000の範囲で値が入力されています。 F1~F10000に、それぞれの行の値が必要なのかの判定を関数で表示させています。 F列に「×」と表示されている行のA~D列の値をクリアさせるマクロを 作成したいです。 ネットで調べた所、「行を削除」というテンプレはあったのですが、 それだとF列の関数も消してしまうので、それは避けたいです。 最悪、行の削除をした後に関数をF列にコピペするマクロを 追加すれば良いと思いますが、下記マクロまで作ったのですが、 うまく動いてくれません。 分かる方がいましたら、返信頂きたいです。 Dim i As Long For i = Range("A1").End(xlDown).Row To 2 Step -1 With Cells(i, "F") If _ .Value Like "×" Then .EntireRow.Delete End If End With Next i End Sub

  • エクセルVBAのEntireRow.Hiddenをスピードアップしたいのですが・・・。

    エクセル97です。 9行目から732行までの大きな表があります。一定の条件のとき、U列がaaaでなくV列もbbbではない行を非表示とするために下記のマクロを作ってみました。 一応思ったとおりには動くのですが行数が多いため、開始してから終了するまで5分以上かかってしまいます。このマクロのように9行目から732行まで順にやっていくのではなく、一度に非表示にするような方法はないでしょうか? Sub TEST() Sheets("TEST").Activate For i = 9 To 732 If Cells(i, "U") <> "aaa" And Cells(i, "V") <> "bbb" Then Cells(i, "V").EntireRow.Hidden = True Else Cells(i, "V").EntireRow.Hidden = False End If Next i End Sub よろしくお願いします。

  • 重複行を完全削除するエクセルのマクロ

    Sub sakujyo() Dim i, ii As Long For i = 1 To Range("a65336").End(xlUp).Row For ii = Range("a65336").End(xlUp).Row To i + 1 Step -1 If Cells(i, 2).Value = Cells(ii, 2).Value _ And Cells(i, 4).Value = Cells(ii, 4).Value _ And Cells(i, 5).Value = Cells(ii, 5).Value Then Dim iii As Byte iii = 1 Rows(ii).Delete Shift:=xlUp End If Next ii If iii = 1 Then Rows(i).Delete Shift:=xlUp iii = 0 Next i End Sub データーが下の表のように入っております。     A    B    C    E    F 1  1/26  a1234  fdsa  5000  C1 2  1/27  a4567  sdfa  4000  T2 3  1/28  a1234  dfsa  5000  C1 4  1/30  b4567  asdf  6600  A2 5  2/10  b4567  fsda  6600  A2 6  2/10  a1234  afds  5000  C1 B列、E列、F列が完全一致(重複1行目と3行目と6行目・4行目と5行目)で削除し結果的に2行目だけ残る方法がしたいのですが、このマクロですと少ないデータですとうまく動くのですが、『大量のデータを一気に削除出来ない』、『同じ重複が3つ以上のデータが多数ある場合データが削除されずに残ってしまう』エラーが出てしまいます。どうかお教えください。

  • excel2003 文字削除マクロの実行時間を短くしたい

    winxp he sp2, excel2003 1.やりたい事 マクロ実行前のデータを C列の該当する文字を削除し 実行後の様にしたいのです。 データが約3300個あり、下記マクロでは、約30秒掛かります。 これを、もっと短くするマクロを教えてください。 Sub aaa() Dim idx As Long For idx = Range("C65536").End(xlUp).Row To 1 Step -1 If Cells(idx, "C").Value = "日々公表銘柄" Then Cells(idx, "C").EntireRow.Delete If Cells(idx, "C").Value = "貸株注意喚起" Then Cells(idx, "C").EntireRow.Delete If Cells(idx, "C").Value = "整理ポスト" Then Cells(idx, "C").EntireRow.Delete If Cells(idx, "C").Value = "監理ポスト" Then Cells(idx, "C").EntireRow.Delete If Cells(idx, "C").Value = "建玉上限:3000万円" Then Cells(idx, "C").EntireRow.Delete If Cells(idx, "C").Value = "建玉上限:5000万円" Then Cells(idx, "C").EntireRow.Delete If Cells(idx, "C").Value = "建玉上限:5億円" Then Cells(idx, "C").EntireRow.Delete If Cells(idx, "C").Value = "建玉上限:10億円" Then Cells(idx, "C").EntireRow.Delete Next idx End Sub データ3300個。列がずれて見にくいのですが。 A列:株コード 4桁固定 B列:株銘柄名 C列:摘要 マクロ実行前  A列 B列 C列 ------------------------------------------------ 1301 極洋          建玉上限:5000万円 1305 ダイワ投信-トピックス 建玉上限:5億円 1306 TOPIX連動型投信  建玉上限:10億円 1309 上海株式指数投信    建玉上限:5000万円 1313 KODEX200    新規買停止 1313 KODEX200    新規売停止 1313 KODEX200    一般信用新規買停止 1313 KODEX200    用掛目規制:0% 1314 S&P日本新興株100 建玉上限:3000万円 1319 日経300投信     新規買停止 1319 日経300投信     新規売停止 マクロ実行後 A列 B列 C列 ------------------------------------------------ 1301 極洋           1305 ダイワ投信-トピックス  1306 TOPIX連動型投信   1309 上海株式指数投信     1313 KODEX200    新規買停止 1313 KODEX200    新規売停止 1313 KODEX200    一般信用新規買停止 1313 KODEX200    用掛目規制:0% 1314 S&P日本新興株100  1319 日経300投信     新規買停止 1319 日経300投信     新規売停止 よろしくお願いします。

  • 以前、マクロで設計したのですが、(手伝ってもらって) 少し修正が必要に

    以前、マクロで設計したのですが、(手伝ってもらって) 少し修正が必要になりました。 今は、O列が0より大きいとその行を削除しますが、O行とQ行が同じ場合は削除しないように追加したいのです。どのようにすればいいでしょうか? 以上、よろしくお願いします。 For 行 = 2 To 65355 'nextまで行という変数を2から65355まで変化させて繰り返します。 If Cells(行, 15) > "0" Then '0より大きいかどうかの判断をします。15はO列のこと。 Rows("" & 行 & ":" & 行 & "").Select 'その行を選択します。 Selection.Delete Shift:=xlUp 'その行を削除します。 行 = 行 - 1 '行を削除すると行数が減るのでそれに対応します。 End If Next

専門家に質問してみよう