- ベストアンサー
VBAエクセル列の並び替え
- VBAエクセルで列の並び替えを行う際にエラーが出る問題について教えてください。
- マクロを使用して、ABC以外の文字が入っている列を削除する処理を組んだのですが、範囲を設定するとエラーが出ます。
- なぜこのエラーが発生するのか、解決方法を教えてください。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
できるだけご質問のマクロを生かしてみると。 sub macro1() dim c as long dim x as variant for c = range("IV1").end(xltoleft).column to 1 step -1 x = cells(c, 1) if x <> "A" and x <> "B" and x <> "C" then cells(c, 1).delete shift:=xlshifttoleft end if next c end sub
その他の回答 (5)
- mu2011
- ベストアンサー率38% (1910/4994)
>エラーが出てしまいました。なぜでしょうか? ⇒Dim rg As Rangeはオブジェクト、rg = Cells(i, 1)はValueなのでデータ型不一致 その他、気になる点です。 (1)データ構成によって削除できない行があります(削除時、変数iは加算?) (2)Loop Until (i & "1") = ""では無限ループです (3)Ifの判定条件に<>とAndの組み合わせは判り辛い (4)DeleteメソッドはRowsオブジェクトの方がすっきりします 因みに変数定義ですが、プロでないのならば省略する方が楽です。 但し、データの型は十分理解して下さい。
お礼
データ型省略できるんですね、、。 そんな事も知りませんでした。 (3)番が気になるので調べようと思いました。 ありがとうございました。
- imogasi
- ベストアンサー率27% (4737/17069)
エクセルで行を削除したら、例えば第3行目を削除したら、本来第4行目のデータが第3行目に上がってくる。すると 行番号のCells(i,”A”)のiのデータが思っていたものと違うものになる。i+1すると上がってきた行は判別対象からもれるだろう。 こんなことはVBAでDELETEをやると、直ぐ経験することだ。 だから行削除したい場合は最下の行から上の行に向かって処理するのが常套的手法と思う。 質問者が経験不足なだけ。 参考 最下行は Sub test01() d = Range("A65536").End(xlUp).Row MsgBox d End Sub 下からの処理は For i=2 to d step -1など。
お礼
行の削除が実は少し考えなければならない処理だと知りませんでした。 最終行から削除を進めなければならないんですね。 参考になりました。
あ、一つ忘れてた。 初心者のうちはプロパティは明示するように。 rgじゃなくてrg.Value <> "A"とすること。
- kokorone
- ベストアンサー率38% (417/1093)
なぜでしょうね。 これから、エラーが出るたびに、人に聴くのですか? エラーの内容について、調べてみましたか? http://excelvba.pc-users.net/fol2/2_5.html で。セルの削除について勉強しなおしてください。 Loop Until の条件もおかしいですね。
お礼
今回質問した時に前回よりも時間をかけずに質問をしたのが、見抜かれてしまった!?と思いました。 教えて頂いたHP参考にします。ありがとうございます。
「範囲を設定」ってなに? rg = Cells(i, 1) のことなら、set。
- 参考URL:
- https://www.google.com/search?q=vba+%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E5%9E%8B
お礼
夜遅く、回答ありがとうございました。 自分が何の知識も無い事を再認識しましたので、教えて頂いたHP含めもう一度勉強します。 本を買ってみましたが、どの本が知識を増やせるのかわかりませんね、、。 私が買った本は、逆引き辞典600ですが、個人のエクセルマクロのHPはそれ以上ためになります。
お礼
行も列も勘違いし、更に題名もいまいちな質問に回答して頂きありがとうございます。 解決しました。 回答を書いて頂き感謝しております。 元々ループで行う必要は無かったんですね。 自分が考えていたよりも、なんだか大変そうですが、知識を増やす為にも、削除後の列の並び替えを行いたいのですがなんとか構文考えてみます。ありがとうございました。 ちなみに私が削除したかったのは、行でした、、、。