• ベストアンサー

EXCEL VBA で,プログラムが動かない.

EXCEL2000のVBAでプログラムを組みました.(下に記す) 数千行に及ぶ数字のデータがあるのですが,20行に1回だけ,いらないデータが3行出てきます.その3行を削除していくプログラムです.Rangeのところで行を選んで欲しいのに,p列とq列を選んでしまうようです.RangeをRowsに変えたらエラーが出ました.こういう場合はどのように書けばいいのでしょうか.誰か教えてください.お願いします. Sub 削除() '20行ごとに入っている3行を削除していく. Dim i As Integer Dim p As Integer Dim q As Integer p = 21           'pの初期値は21 For i = 1 To 500 q = p + 2 r = "p:q" Range(r).Select Selection.Delete shift:=xlUp p = p + 20 Next i End Sub

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

  • ベストアンサー
  • ja7awu
  • ベストアンサー率62% (292/464)
回答No.7

No.4 ですが、ちょっと追記です。 p = 21 'pの初期値は21 For i = 1 To 500   q = p + 2   Rows(p & ":" & q).Delete   p = p + 20 Next i この場合、21+20*500 行まで処理するつもりが、繰り返す毎に行番号が 繰り上がりますので、10021行以降の行も同様に削除されてしまいます。 と思ったのですが・・・ しかし、この内容から察すると、最後まで同じ行パターンでデータが、 並んでいるようなので(たぶん)、支障ないかと思います。 余計なことを書いたかな?

hiroyuki03
質問者

お礼

回答していただきありがとうございます. ご指摘のように書き直してみたら動いてくれました. Rows(p & ":" & q)のところの書き方は私の持っている初心者用の参考書には書いてなかったので助かりました. ありがとうございました.

その他の回答 (6)

  • papayuka
  • ベストアンサー率45% (1388/3066)
回答No.6

#1です。 500回ループなら Sub TEST() Dim i As Long For i = 21 To 10001 Step 20  Rows(i).Resize(3).Delete Next i End Sub にしないとダメだった、、訂正です。(^^; 話題になっている削除は下からについては、私的には削除したいデータと次の削除したいデータの間に20行必要なデータがある、 21~23行が無駄データ 24~43行の20行が必要データ 44~46行が無駄データ 47~66行の20行が必要データ 67~69行が無駄データ    ・    ・ こんな感じのデータを想定しています。 そうじゃなかったら、他の皆さんのご指摘通り見直しが必要でしょう。

hiroyuki03
質問者

お礼

回答していただきありがとうございます. データの配列はまさにお察しの通りです. 回答に載せていただいたプログラムは見た事のないやり方だったのですが,はしらせてみるとうまくいきました. 今回は別のやり方を使うことにしましたが,次の参考にしたいと思います. ありがとうございました.

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

直接の解答ではないのですが、ご参考になれば。 #4のご解答の後半のご指摘を、今まで数度小生は経験して、その時頭がぐるぐる回ってしまい・・。 それ以来は、別シートに結果を作る方法を出来るだけ考えています。 ロジックは 20行に達する(部分カウンタが20に達する)までは、読むと別シートへ移す。 その間に別シートは移されたら別シートの行を指すポインタを1つ下行へ移す。 部分カウンタを1アップ。 部分カウンタが20になったら あと3行は別シートに移さない。(読み飛ばし的) 部分カウンタを1に戻す。 全体のカウンタで500を押さえる。

hiroyuki03
質問者

お礼

回答していただきありがとうございます. いろんな人の回答を見て,いろんな考え方があるんだなと思いましたが,imogasiさんのものは特にそうでした. 今回は別のやり方を使いますが,これからの参考にしたいと思います. ありがとうございました.

  • ja7awu
  • ベストアンサー率62% (292/464)
回答No.4

'r = "p:q"   ↓ Rows(p & ":" & q).Select でいいと思いますが・・・ ですが、その前に ちょっと考えてみましょう。 行を削除するのですね。 上から、行を削除して行くと、1回3行を削除すると、その次から、 その下にあるデータの行番号は、変わってしまうんですよ。 この辺のことを考慮してみたらどうでしょうか。

noname#27115
noname#27115
回答No.3

上から削除していくと削除の度に行がずれてくるので For i = 500 To 1 にしないとダメだと思うのですが、、、 そうか、、前もって削除する行にフラグをたてて、 For i = 1 to 500 で、、1行ずつ消していってもいいかと思います。

hiroyuki03
質問者

お礼

回答していただきありがとうございます. 削除する度に行がずれていくことに関しては私の説明不足でしたが,必要な行と無駄な行が20行・3行・20行・3行というふうに並んでいるので,ずれることは気にしなくてもいいようになっています. 結局,いろんな方のアドバイスで問題は解決しました. ありがとうございました.

  • gatyan
  • ベストアンサー率41% (160/385)
回答No.2

selection.EntireColumn.Delete では駄目ですか?

hiroyuki03
質問者

お礼

回答していただきありがとうございます. わからなかったのはもう一つ上の行(selectの行)の書き方についてのところです. いろんな方の回答によって問題は解決しました. ありがとうございました.

  • papayuka
  • ベストアンサー率45% (1388/3066)
回答No.1

こうすればOKです。 r = p & ":" & q ↓これでも同様の結果になると思います。 Sub TEST() Dim i As Long For i = 21 To 500 Step 20  Rows(i).Resize(3).Delete Next i End Sub

関連するQ&A