- ベストアンサー
Excel VBA 2000 Rangeの範囲指定でGlobalエラー
- Excel 2000のVBAで非常に長い文字列で範囲を指定すると、「Rangeメソッド失敗'_Global'オブジェクト」というエラーメッセージが表示される問題があります。
- DD:DEを省略したり、連続する列をまとめるとエラーが発生しなくなります。
- この問題に回避策はありますか?文字列の制限について教えてください。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
range("文字列")で「一度に指定できる複数範囲」は制限があるみたいです。 試した限りでは範囲の個数ではなく単純に"文字列"が255文字を超えるとダメみたいです。 ただ、複数に分けてunionでつなげるのは大丈夫のようです。 Union(Range("B:C,D:E,F:G,H:I,J:K,L:M,P:Q,T:U,V:W,Z:AA,AB:AC,AD:AE,AF:AG,AL:AM,AN:AO,AP:AQ,AR:AS,AT:AU,AV:AW,AX:AY,AZ:BA,BB:BC,BD:BE,BF:BG,BH:BI,BL:BM,BN:BO,BP:BQ,BR:BS,BT:BU,BV:BW,BX:BY,BZ:CA,CB:CC,CD:CE,CF:CG,CH:CI,CJ:CK,CL:CM,CN:CO,CP:CQ,CR:CS,CT:CU,CV:CW,DB:DC"), Range("DD:DE")).Select >ある条件で、ペアになっている行を削除するのですが、削除するのに時間がかかるので、一辺にまとめて選択して、削除しようというのが目的です。 と言うなら、下のようにチェックしながらunionでつなげるなら大丈夫のようです。 Sub sample() Dim col As Integer Dim rng As Range For col = 2 To チェックする最終列 Step 2 If 削除する列ペア Then If rng Is Nothing Then Set rng = Range(Columns(col), Columns(col + 1)) '何も無いrangeをunionするとエラーになるので Else Set rng = Union(rng, Range(Columns(col), Columns(col + 1))) End If End If Next rng.Select End Sub 当然の事だけど、Excel2007以外では列の最大は256(IV)。
その他の回答 (3)
- fujillin
- ベストアンサー率61% (1594/2576)
回避するというよりも、別の方法になってしまいますが・・・ 実際の作業が不明ですが、かなり大量の列のセット(2行ずつ)を削除したいということでしょうか? どのような基準で消去する列が決るのかわかりませんが、ご質問のようにvbaで列を固定で(直接)記載するとなると、その組合せ毎に実行文を記載しなくてはならないですよね?(組合せがいくつあるのかも不明ですが) 列をペアで消去するルーチン(といっても一行で済みますが)を、条件判断しながらループで回せばいいのではないでしょうか? <例>(iとi+1列を消去するとして) While ~~ ' ループの条件 '消去する列iを設定する条件判定(=文中のある条件) Cells(1, i).Resize(1, 2).EntireColumn.Delete '2行を消去 Wend (大きい方の列から削除していったほうが、列番号がずれないので計算が簡単なはずです。) もう一点。 実行速度を気になさっているようですが、列をSelectしてからDeleteするよりも、↑のように直接Deleteしたほうが速いはずです。 また、vba実行中は Application.ScreenUpdating = False としておいて、実行内容を画面表示に反映させないようにすれば、見かけの速度は格段と速くなります。 (最後に trueに戻すのを忘れずに。)
補足
fujillinさんアドバイス有難うございました。 私の方法はfujillinさんのアドバイスと似たような方法で、resizeはしていませんが、2列をselectしないで同時にdeleteしています。 また,画面の更新もしていません。この状況で、かなり時間がかかっているので困っているわけです。
- n-jun
- ベストアンサー率33% (959/2873)
>ある条件で、ペアになっている行を削除するのですが、削除するのに時間がかかるので、一辺にまとめて選択して、 行ではなく列ですよね。 ある条件で上記範囲が削除対象となるのなら、別段ペア(2列)毎に 引数を与えず、まとめても良いようにしか思えないですけど。。。 仮に、For Each ~ Nextでの範囲として引数が多くなっていると 言うのならわかりますが。 >rangeの指定で文字列数に制限があるのかどうかで については、 >最後のDD:DEをやめたり、連続する列をまとめるとエラーになりません。 の段階で気づかれていると思います。
- n-jun
- ベストアンサー率33% (959/2873)
例えば、 >B:C,D:E,F:G,H:I,J:K,L:M なら B:Mでもいいのでは? 2列ずつ指定しているのが不明ですが。何か理由があるのでしょうか?
補足
有難うございます。 この質問の背景をご説明いたします。 ある条件で、ペアになっている行を削除するのですが、削除するのに時間がかかるので、一辺にまとめて選択して、削除しようというのが目的です。 私の知りたいのは、rangeの指定で文字列数に制限があるのかどうかで、もしそうならば何か解決方法を考えなければならないと思っています。 n-junさんのご質問のように、選択行に連続する部分があった場合、その連続部分をつなげることは確かに効果がありますが、連続部分がない場合解決することは出来ないと思います。
お礼
hotosysさん初めまして。 丁寧なご意見有難うございました。 hotosysさんの方法で試したところうまく行きました。>(^0^)< 有難うございました。