海外旅行から帰ってきたら、まず何を食べる?

はじめて質問させていただきます。
excel 2000のvbaで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,DD:DE").Select
のように非常に長い文字列で範囲を指定した場合、「Rangeメソッド失敗'_Global'オブジェクト」というようなメッセージが出ます。
最後のDD:DEをやめたり、連続する列をまとめるとエラーになりません。
どうも文字列に制限があるように思いますが、回避方法をご存知の方ご教示ください。

A 回答 (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)。
    • good
    • 0
この回答へのお礼

hotosysさん初めまして。
丁寧なご意見有難うございました。
hotosysさんの方法で試したところうまく行きました。>(^0^)<
有難うございました。

お礼日時:2008/08/03 11:04

回避するというよりも、別の方法になってしまいますが・・・



実際の作業が不明ですが、かなり大量の列のセット(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しています。
また,画面の更新もしていません。この状況で、かなり時間がかかっているので困っているわけです。

補足日時:2008/08/03 09:56
    • good
    • 0

>ある条件で、ペアになっている行を削除するのですが、削除するのに時間がかかるので、一辺にまとめて選択して、


行ではなく列ですよね。
ある条件で上記範囲が削除対象となるのなら、別段ペア(2列)毎に
引数を与えず、まとめても良いようにしか思えないですけど。。。

仮に、For Each ~ Nextでの範囲として引数が多くなっていると
言うのならわかりますが。

>rangeの指定で文字列数に制限があるのかどうかで
については、
>最後のDD:DEをやめたり、連続する列をまとめるとエラーになりません。
の段階で気づかれていると思います。
    • good
    • 0

例えば、


>B:C,D:E,F:G,H:I,J:K,L:M
なら
B:Mでもいいのでは?
2列ずつ指定しているのが不明ですが。何か理由があるのでしょうか?

この回答への補足

有難うございます。
この質問の背景をご説明いたします。

 ある条件で、ペアになっている行を削除するのですが、削除するのに時間がかかるので、一辺にまとめて選択して、削除しようというのが目的です。

 私の知りたいのは、rangeの指定で文字列数に制限があるのかどうかで、もしそうならば何か解決方法を考えなければならないと思っています。

 n-junさんのご質問のように、選択行に連続する部分があった場合、その連続部分をつなげることは確かに効果がありますが、連続部分がない場合解決することは出来ないと思います。

補足日時:2008/08/01 22:06
    • good
    • 0

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