歳とったな〜〜と思ったことは?

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

A 回答 (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行以降の行も同様に削除されてしまいます。

と思ったのですが・・・

しかし、この内容から察すると、最後まで同じ行パターンでデータが、
並んでいるようなので(たぶん)、支障ないかと思います。
余計なことを書いたかな?
    • good
    • 0
この回答へのお礼

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

お礼日時:2003/10/07 14:59

#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行が無駄データ
   ・
   ・

こんな感じのデータを想定しています。
そうじゃなかったら、他の皆さんのご指摘通り見直しが必要でしょう。
    • good
    • 0
この回答へのお礼

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

お礼日時:2003/10/07 15:10

直接の解答ではないのですが、ご参考になれば。


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

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

お礼日時:2003/10/07 15:20

'r = "p:q"


  ↓
Rows(p & ":" & q).Select

でいいと思いますが・・・ ですが、その前に ちょっと考えてみましょう。

行を削除するのですね。

上から、行を削除して行くと、1回3行を削除すると、その次から、
その下にあるデータの行番号は、変わってしまうんですよ。

この辺のことを考慮してみたらどうでしょうか。
    • good
    • 0

上から削除していくと削除の度に行がずれてくるので


For i = 500 To 1
にしないとダメだと思うのですが、、、

そうか、、前もって削除する行にフラグをたてて、
For i = 1 to 500
で、、1行ずつ消していってもいいかと思います。
    • good
    • 0
この回答へのお礼

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

お礼日時:2003/10/07 16:22

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

    • good
    • 0
この回答へのお礼

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

お礼日時:2003/10/07 16:36

こうすれば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
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


おすすめ情報