Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


8856 / 13644 ツリー ←次へ | 前へ→

【30635】初歩的な事かもしれないですが・・・ tbtk 05/11/1(火) 17:39 質問[未読]
【30637】Re:初歩的な事かもしれないですが・・・ Jaka 05/11/1(火) 17:54 回答[未読]
【30638】Re:初歩的な事かもしれないですが・・・ とまと 05/11/1(火) 18:03 回答[未読]
【30640】Re:初歩的な事かもしれないですが・・・ tbtk 05/11/1(火) 18:16 質問[未読]
【30654】Re:初歩的な事かもしれないですが・・・ とまと 05/11/1(火) 22:09 発言[未読]
【30666】Re:初歩的な事かもしれないですが・・・ tbtk 05/11/2(水) 9:48 お礼[未読]
【30695】Re:初歩的な事かもしれないですが・・・ gako 05/11/3(木) 9:18 質問[未読]
【30698】Re:初歩的な事かもしれないですが・・・ とまと 05/11/3(木) 11:40 回答[未読]
【30639】Re:初歩的な事かもしれないですが・・・ tbtk 05/11/1(火) 18:10 お礼[未読]

【30635】初歩的な事かもしれないですが・・・
質問  tbtk  - 05/11/1(火) 17:39 -

引用なし
パスワード
     A   B   C  D    E

1 品番 収容数 箱数 発注数 発注番号

2 A  10   0  0   

3 B  20   2  40

4 C  5   5  25

5 D  10   0  0

6 E  5   0  0

7 F  5   1  5
上記のようなシートがありまして
発注数0の品番は消去したいとおもってマクロを作成したのですが
[作成したマクロ]
Dim A As Integer
  Dim B As Integer
  Dim C As Integer
  
  B = Range("D65536").End(xlUp).Row
  For A = 2 To B
  If Cells(A, 4) = 0 Then
    Rows(A).Select
    Selection.ClearContents
  Else
  End If
  Next A
  For C = 2 To B
  If Cells(C,1) = "" Then
    Rows(C).Select
    Selection.Delete
  Else
  End If
  Next C
上記のコードだと消去したかったのに消去しきれない部分がでてしまいます。
理由もなんとなくわかるのですが、どう改善したら良いのかよくわかりません。
どなたかヒントでも頂けると有難いです。
よろしくお願いします。

【30637】Re:初歩的な事かもしれないですが・・・
回答  Jaka  - 05/11/1(火) 17:54 -

引用なし
パスワード
   こんにちは。
行を削除する時は、下からやってください。
でないと行がつめられても、その分はカウントしません。
間違っているかもしれませんがこんな感じで...。

  For i = C To 2 step -1
  If Cells(i,1) = "" Then
    Rows(i).Select
    Selection.Delete
  Else
  End If
  Next i

【30638】Re:初歩的な事かもしれないですが・・・
回答  とまと  - 05/11/1(火) 18:03 -

引用なし
パスワード
   おじゃまします。ループは1回でできます。
select は使わないほうが良いみたいです。

Sub test()

  Dim A As Integer
  Dim B As Integer
 
  B = Range("D65536").End(xlUp).Row
  For A = B To 2 Step -1
    If Cells(A, 4) = 0 Then
      Rows(A).ClearContents
    End If
    If Cells(A, 1) = "" Then
      Rows(A).Delete
    End If
  Next A
 
End Sub

【30639】Re:初歩的な事かもしれないですが・・・
お礼  tbtk  - 05/11/1(火) 18:10 -

引用なし
パスワード
   すいません、ありがとうございました。
大変助かりました。
また、なにかあったらよろしくお願いします。

【30640】Re:初歩的な事かもしれないですが・・・
質問  tbtk  - 05/11/1(火) 18:16 -

引用なし
パスワード
   とまと さん
返信ありがとうございます。
>select は使わないほうが良いみたいです。
      ↑
すみません、これには何か理由があるのかと思うのですが
何故なのか分からないのですが・・・よろしければ教えて頂いても
よろしいでしょうか?
selectを使用すると処理で何か問題が起きたりするのでしょうか?

【30654】Re:初歩的な事かもしれないですが・・・
発言  とまと  - 05/11/1(火) 22:09 -

引用なし
パスワード
   こんばんは。

ほとんどの文はSelectを使わないで書くことができます。
私も昔は使いまくってたんだけど(^^;;
ほとんどの文はそのシート、そのブックをSelect
するのが目的ではなくてその後になにか処理
があるからSelectしているわけです。
だからそのまま目的の処理を書いたほうが
はしょれていいということと、
あとは実行速度ですね。selectをたくさんつかうと
おそくなります。Activateもほとんどいらいない
みたいですよ。だからまず自身のコードをみて
まだselect,Activateなどがあったら改良の余地
ありとみてみるといいかもしれません。
こんなのでいいです?(^^

【30666】Re:初歩的な事かもしれないですが・・・
お礼  tbtk  - 05/11/2(水) 9:48 -

引用なし
パスワード
   ありがとうございました。
私が作成しているマクロにはselectが一杯なんですが・・・
頑張って、改良してみます。
丁寧な説明、本当にありがとうございました。

【30695】Re:初歩的な事かもしれないですが・・・
質問  gako  - 05/11/3(木) 9:18 -

引用なし
パスワード
   ▼とまと さん:

お邪魔します。ちょっと教えていただきたいのですが。
貴殿のコードはよく理解できました。
他の方法でと思い作成したのですが、D列に続いて「0」が
くると(例えばD6、D7がともに0のような場合)小生の
作成したコードでは2回マクロを動かさないと削除できない
のですが、どこが問題かご指摘いただけませんでしょうか。

 Dim R As Range
 Dim MyR As Range
 Set MyR = Range("D2", Range("D65536").End(xlUp))
For Each R In MyR
 If R = 0 Then
  Rows(R.Row).Delete
 End If
Next

宜しくお願いいたします。

【30698】Re:初歩的な事かもしれないですが・・・
回答  とまと  - 05/11/3(木) 11:40 -

引用なし
パスワード
   ▼gako さん:


ある列をFor eachを使って判断させていくと
上から順番に見ていきます。削除するときに
行全体が上方向にシフトするので削除できない
行が発生します。

ですので行削除は最下行からSTEPで-1
などして下からループさせるのが基本です。


あと新規質問の場合は別スレを立てるようにしてください。
一度解決してしまうと見ない可能性がありますので
新規質問に質問スレッドのリンクを貼るかそのまま
コピペするとよいと思います。
名指しもよくないですよ。他の方にアドバイス
していただけなくなります。


こんなのでよろしいですか(^^

8856 / 13644 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free