Excel VBA 2000 Rangeの範囲指定でGlobalエラー

このQ&Aのポイント
  • Excel 2000のVBAで非常に長い文字列で範囲を指定すると、「Rangeメソッド失敗'_Global'オブジェクト」というエラーメッセージが表示される問題があります。
  • DD:DEを省略したり、連続する列をまとめるとエラーが発生しなくなります。
  • この問題に回避策はありますか?文字列の制限について教えてください。
回答を見る
  • ベストアンサー

excel vba 2000 rangeの範囲指定でGlobalエラー

はじめて質問させていただきます。 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をやめたり、連続する列をまとめるとエラーになりません。 どうも文字列に制限があるように思いますが、回避方法をご存知の方ご教示ください。

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

  • ベストアンサー
  • hotosys
  • ベストアンサー率67% (97/143)
回答No.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)。

03usigaeru
質問者

お礼

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

その他の回答 (3)

  • fujillin
  • ベストアンサー率61% (1594/2576)
回答No.3

回避するというよりも、別の方法になってしまいますが・・・ 実際の作業が不明ですが、かなり大量の列のセット(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に戻すのを忘れずに。)

03usigaeru
質問者

補足

fujillinさんアドバイス有難うございました。 私の方法はfujillinさんのアドバイスと似たような方法で、resizeはしていませんが、2列をselectしないで同時にdeleteしています。 また,画面の更新もしていません。この状況で、かなり時間がかかっているので困っているわけです。

  • n-jun
  • ベストアンサー率33% (959/2873)
回答No.2

>ある条件で、ペアになっている行を削除するのですが、削除するのに時間がかかるので、一辺にまとめて選択して、 行ではなく列ですよね。 ある条件で上記範囲が削除対象となるのなら、別段ペア(2列)毎に 引数を与えず、まとめても良いようにしか思えないですけど。。。 仮に、For Each ~ Nextでの範囲として引数が多くなっていると 言うのならわかりますが。 >rangeの指定で文字列数に制限があるのかどうかで については、 >最後のDD:DEをやめたり、連続する列をまとめるとエラーになりません。 の段階で気づかれていると思います。

  • n-jun
  • ベストアンサー率33% (959/2873)
回答No.1

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

03usigaeru
質問者

補足

有難うございます。 この質問の背景をご説明いたします。  ある条件で、ペアになっている行を削除するのですが、削除するのに時間がかかるので、一辺にまとめて選択して、削除しようというのが目的です。  私の知りたいのは、rangeの指定で文字列数に制限があるのかどうかで、もしそうならば何か解決方法を考えなければならないと思っています。  n-junさんのご質問のように、選択行に連続する部分があった場合、その連続部分をつなげることは確かに効果がありますが、連続部分がない場合解決することは出来ないと思います。

関連するQ&A

  • excel関数教えてください

    横1行で、以下のような条件でデータが入っています。 AV・AZ・BD・BH・BL・BP 空白または文字列 AW・BA・BE・BI・BM・BQ 空白または文字列または数値 AX・BB・BF・BJ・BN・BR 空白または0~4の整数値 AY・BC・BG・BK・BO 空白または数値 BS 数式 基本的に最初の列が空白の場合は、4列セットで空白が続きますが、 BS列のみ全ての行に数式が入っています。 これで、BT・BUに、 ・AX・BB・BF・BJ・BN・BRが4の場合のAY・BC・BG・BK・BO・BSの平均 ・AX・BB・BF・BJ・BN・BRが0~3の場合のAY・BC・BG・BK・BO・BSの平均 を出したいです。 =SUMPRODUCT((MOD(COLUMN(AY10:BS10),4)=3)*(AX10:BR10<=3)*(AY10:BS10))/SUMPRODUCT((MOD(COLUMN(AY10:BS10),4)=3)*(AX10:BR10<=3)) こんな関数を入れてみましたが、 空白の場合もカウントしてしまうので0~3の場合の平均がおかしくなったり、 AW・BA・BE・BI・BM・BQに文字列が入った場合にエラーが出たりします。 解決する関数を教えてください。 よろしくお願いいたします。

  • 1列おき2列選択

     指定範囲(I9:CW40)の中で1列おきに2列選択したいのですが 、当然ですがマクロで記録はできても実行できませんし2行1列には関数式が入っているのでこれを除いて他の範囲(I71:CW99)に同じように1列おきに2列に「形式として貼り付け」ー「値」としたいのですが、お教え願えませんでしようか? Sheets("メイン").Select Range( _ "J9:K40,M9:N40,P9:Q40,S9:T40,V9:W40,Y9:Z40,AB9:AC40,AE9:AF40,AH9:AI40,AK9:AL40,AN9:AO40,AQ9:AR40,AT9:AU40,AW9:AX40,AZ9:BA40,BF9:BG40,BI9:BJ40,BL9:BM40,BO9:BP40,BR9:BS40,BU9:BV40,BX9:BY40,CA9:CB40,CD9:CE40,CG9:CH40,CJ9:CK40,CM9:CN40,CP9:CQ40,CS9:CT40,CV9:CW40" _ ).Select Range("CV9").Activate Selection.Copy End Sub

  • 次のマクロコードがわかりません

    Q~U、W~AA、AC~AG、AK~AO、AQ~AU、AW~BA 、BE~BI BK~BO、BQ~BU の各列にそれぞれ下記のように(一例)データが入っています  Q  R S T U   W X Y Z AA ・・・ BQ BR BS BT BU いか 3 7 1 5   たこ 3 5 2 10              えび 5 2 5 10 ここで仮にいかと同じ行にあるWで”1”と入力したら丁度同じ行の左のQ~Uの5つのデータをコピーできるようにしたいです。おなじようにえびが記入してある行のBQで” 1”と入力すればBQ~BUにえび~10までのデータがコピーされます。まとめると、各W、AC、AK、AQ、AW、BE列の任意のセルで” 1”と入力すれば左隣の5つのセルをコピーする感じです。

  • Excel のVBAに付いて教えて下さい。

    前回、質問しました内容が関連してくるんですが 参考に下記のURLを ご覧になって下さい。 http://okwave.jp/qa/q7472816.html 前回の内容ですと、指定した列を月で指定してComboboxで選択していました。 その指定した列に特定の文字数を入力すると言う動作を作成しました。 特定の文字数を入力すると言う内容ですが、現時点では指定した列に上から下に 順序に入力して行くように作成してます。 そのコードが”Set myRng = Range(rng).End(xlUp).Offset(1)”です。 今回は、Comboboxで指定した列の2つ隣の列に日付が入力されています。 2つ隣と言うのは、左に向かって2つ隣です。 例えばC列を指定したとすればA列を表します。 実際に行いたいことは、指定した列の日付の入った行を検索し、指定した日付の所に 文字数を入力したいと考えています。 Userformを使って入力しているんですが、Combobox1が月の列を選択していますので、 新たにCombobox2を作りCombobox2で指定した日付(行)を選択し入力できる様に作成 したいのですが・・・今、使っているコードを基にCommandbox2を追加して作成できますでしょうか? 現在のコードは下記です。 Private Sub UserForm_Initialize() Dim i As Long For i = 1 To 12 Me.ComboBox1.AddItem i & "月" Next End Sub Private Sub CommandButton1_Click() Dim myRng As Range Dim rng As String Select Case ComboBox1.Value Case "1月": rng = "az76" Case "2月": rng = "be76" Case "3月": rng = "bj76" Case "4月": rng = "ak41" Case "5月": rng = "ap41" Case "6月": rng = "au41" Case "7月": rng = "az41" Case "8月": rng = "be41" Case "9月": rng = "bj41" Case "10月": rng = "ak76" Case "11月": rng = "ap76" Case "12月": rng = "au76" Case Else: Exit Sub End Select Set myRng = Range(rng).End(xlUp).Offset(1) myRng.Value = TextBox1.Value End Sub

  • エクセルVBA:選択・貼付け(繰り返し?)

    3種類の数式を、条件により選択しながら、不特定の回数(行数)に貼り付けたいのですが、どのようなコードが考えられますでしょうか?よろしくお願いします。 ○Sheet1  数式保存セル 数式(1):AZ8 数式(2):BA8 数式(3):BB8  数式選択条件 D列の値が (1)であれば数式(1)を、(2)であれば数式(2)を、(3)であれば数式(3)を  数式適用範囲 I8 ~ AW107  ※3種類の数式はそれぞれ、I8 で作成し、保存セルにコピーして用意したもの  例 / D8 が(1)であれば、AZ8 をコピーして、I8 ~ AW8 に計算結果のみ貼付けたい(数式のみ→値のみ)      D9 が(1)であれば、AZ8 をコピーして、I9 ~ AW9 に   〃      D10 が(3)であれば、BB8 をコピーして、I10 ~ AW10 に  〃      D11 が(2)であれば、BA8 をコピーして、I11 ~ AW11 に  〃      ・・・  ※何行使用するかは毎回変わる   ※他シートを用意したくない  ※ AY列は空いている(行数をカウントし変数とする、IF関数を用い条件に応じて数式保存セル位置を文字列で表示し変数とする、などを組合わせてできないかと思いましたが、思い浮かびませんでした。)

  • エクセルVBAの実行時エラー

    先日からこちらでいろいろ教えていただき、以下を行うマクロを書きました。 R列とY列の2行目以下(行数は不定、ただしA列の行数に一致します。)の各セルにかなり長文の文字列があります。 短いので50文字程度、長いのは1000文字を超えます。 この各セルを、Range("AG1:CG1,CN1:DF1") の検索語句リストに記載の文字列で検索をかけます。 同一セル内に同じ検索文字列が複数ある場合もありますし、どの検索文字列も存在しないセルもあります。 ヒットしたら、該当の検索対象セルと該当の検索語句がある検索語句リストのセルを薄黄色に着色します。 その際、該当の検索対象セルと同一行、かつ該当の検索語句がある検索語句リストのセルと同一列のセルに+1をして出現数をカウントします。 ヒットしたら、該当の検索対象セル内の検索語句を着色し、太字にします。 着色は検索語句リストのRange("CN1")より右の語句でヒットした場合は青、そうでなければ赤です。. 私にはかなり複雑でしたが、なんとか完成しました。 エクセル2003でためしたところちゃんと動いてくれました。 ところが、同じデータをエクセル2000でためしたところ、最初の何回かはうまくいったのですが、その後 「実行時エラー’-2147417848 (80010108)': 'Font' メソッドは失敗しました: 'Characters' オブジェクト というエラーが出るようになりました。(エラーにならない場合もあります。) 同じデータで試しているのにエラーが出たときに検索しているセルは一定ではありませんし、検索語句もまちまちです。 しかも、一旦エラーが発生すると、エクセルのセルが選択できなくなります。(スクロールはできます。) おまけにファイルの終了はできますが、エクセル自体が終了できなくなり、タスクマネージャでエクセル終了させなくてはなりません。 何がいけないのでしょうか? Sub Try111012() Dim tgtC As Range, myWrd As Range, rng As Range, myC As Range Dim r As Long, pos As Long Dim t As Single t = Timer r = Cells(Rows.Count, "A").End(xlUp).Row '最終行取得 Set tgtC = Range("(R:R,Y:Y) 2:" & r) '検索対象範囲 With tgtC .Font.ColorIndex = xlAutomatic .Font.FontStyle = "標準" .Interior.ColorIndex = xlNone End With Range("(AG:DF) 2:" & r).ClearContents 'カウントクリア Application.ScreenUpdating = False Application.Calculation = xlCalculationManual Set myWrd = Range("AG1:CG1,CN1:DF1") '検索語句リスト For Each myC In tgtC '各検索対象セル flg = Not (flg) Application.StatusBar = myC.Address(0, 0) & " を検索中"  '検索セル表示 With myC For Each rng In myWrd '各検索語句 pos = InStr(1, .Value, rng.Value) '発見位置 If pos > 0 Then 'ヒットしたら .Interior.ColorIndex = 36 '対象セルを薄黄色に rng.Interior.ColorIndex = 36 '検索語句セルを薄黄色に End If Do While pos > 0 '同じ語句が発見されてるかぎり With .Characters(pos, Len(rng.Value)).Font  'ここでエラー!! .Bold = True '検索語句を太字 .ColorIndex = IIf(rng.Column >= Range("CN1").Column, 5, 3) '着色(赤と青) End With Cells(.Row, rng.Column).Value = Cells(.Row, rng.Column).Value + 1 '語句カウント pos = InStr(pos + 1, .Value, rng.Value) 'セル内検索位置移動 Loop '繰り返し Next rng '次の検索語句へ End With Next myC '次の検索対象セルへ Range("(CH:CH) 2:" & r).Formula = "=SUM(AG2:CG2)" Range("(CM:CM) 2:" & r).Formula = "=SUM(CN2:DF2)" Range("(CJ:CJ) 2:" & r).Formula = "=AND(CH2>0,CM2>0)" Application.Calculation = xlCalculationAutomatic Application.ScreenUpdating = True Debug.Print Timer - t MsgBox "キーワードを検索して着色しました。" & _ vbNewLine & "出現数も調べました。" Application.StatusBar = "" End Sub

  • エクセルマクロ

    横7列、縦64行が1枚の台紙(A4サイズに収まる)が横方向に20枚並んでいます。 その20枚の台紙のうち入力した分の台紙(何枚目)までを、 『印刷範囲の設定』というマクロを組みたいと思っています。 ただし台紙自体に元から文字などが入力されているので、 単純に最終入力ページと設定できません。 そこで「20枚それぞれのある特定のセル」に文字が入力がされた場合にそのセルを含む ページまでを印刷範囲として指定できないでしょうか? 特定セルの場所は 1枚目「C4」、2枚目「J4」、3枚目「Q4」、4枚目「X4」、5枚目「AE4」、6枚目「AL4」、7枚目「AS4」、 8枚目「AZ4」、9枚目「BG4」、10枚目「BN4」、11枚目「BU4」、12枚目「CB4」、13枚目「CI4」、 14枚目「CP4」、15枚目「CW4」、16枚目「DD4」、17枚目「DK4」、18枚目「DR4」、19枚目「DY4」、 20枚目「EF4」 となっており、1枚単位で考えると3列目・4行目の位置です。 ちなみに4行目には上記セル以外に元から文字が存在します。

  • ExcelのVBAなんですが・・・教えて下さい。

    Userformを使って自分で作成しましたカレンダー(予定表)に文字数を入力しようとしています。 Userformには、Comboboxを使って指定の月を選択し、 予定表の月の列に文字数を入力したいと考えています。 自分なりに考えて作成してみたんですが・・・どうしても上手くいきません。 お手数をおかけしますが、教えて頂けますか? 下記のコードを作成しましたが、どこをどの様にしたら、きちんとした動作ができますでしょうか? Private Sub UserForm_Initialize() With ComboBox1 .AddItem "1月" .AddItem "2月" .AddItem "3月" .AddItem "4月" .AddItem "5月" .AddItem "6月" .AddItem "7月" .AddItem "8月" .AddItem "9月" .AddItem "10月" .AddItem "11月" .AddItem "12月" End With End Sub Private Sub CommandButton1_Click() Dim s As Long Dim rng Select Case ComboBox1.Value Case "1月": rng = "az46" Case "2月": rng = "be46" Case "3月": rng = "bj46" Case "4月": rng = "ak11" Case "5月": rng = "ap11" Case "6月": rng = "au11" Case "7月": rng = "az11" Case "8月": rng = "be11" Case "9月": rng = "bj11" Case "10月": rng = "ak46" Case "11月": rng = "ap11" Case "12月": rng = "au11" Case Else: Exit Sub End Select s = Range(rng, Rows.Count).End(xlDown).Row Range(rng & s + 1).Value = TextBox1.Value End Sub 初心者の為、すいませんが宜しくお願いします。

  • 縦横の票で中の数値を人いたいのでご教授お願いします

    エクセル2007です。de200位まで使っています。その内の as3からcg17まで枡目で作って数値や文字列が入っています。 表がずれているのですが縦as4に1が入ってas17に14が入れてあり、 この数字を元にしてat5からcg17までの升目のデータを拾いたい のですが、1から17までの数値はax23からcd23までのセルに 入っています。az135に入るデータはbe16で下記式で拾ってます。 =IF(OR(AZ$23="",COUNTIF($AS$4:$CG$4,AZ$23)=0),"",VLOOKUP(AZ$23,$AS$4:$CL$61,42,FALSE)) ax23には12が入って、これを元に拾っています。 この時be5に入っている文字列をaz130で拾う式をご教授して いただきたいです。どうぞよろしくお願いします。

  • ExcelのVBAについて(再掲)

    ExcelのVBAについて(再掲) 以下のシートは作成中(勉強中)のものです。いずれは私的に実用しようと思っています。。 さて、質問ですが、「シート1のA3に入力、手動でシート2に移動自動で転記し、手動でシート1に移動し、また入力する」という単純動作を目的に作成しています。問題点は沢山ありますが、例えば『シート1の時間列が何かの変更で書き換えられてしまう』、『沢山書いていくと分かりますが、途中で行削除を行うと、時間列に削除行分の時間記録が下向きに書き込まれる』などです。他にもあると思っていますが、(1)この問題はなぜ発生するのか?(2)修正案としてはどの様な例があるか? 等をお聞きしたいです。細々と問題はあると思っていますので、その様な問題点もお聞きしたいです。 よろしくお願いします! '///Sheet1/// Private Sub Worksheet_Change(ByVal Target As Excel.Range) Dim time7 As Range For Each time7 In Target If time7.Column = 1 Then time7.Offset(0, 4).Value = Format(Now, "Short Time") & vbCrLf & _ Format(Now, "yyyy/mm/dd hh:nn:ss AM/PM") Application.EnableEvents = False Application.EnableEvents = True End If Next time7 Dim ws1 As Worksheet Dim ws2 As Worksheet Set ws1 = Worksheets("Sheet1") Set ws2 = Worksheets("Sheet2") ws2.Range("A3:H3").Value = ws1.Range("A3:H3 ").Value End Sub Private Sub Worksheet_Activate() Application.Goto ActiveSheet.Range("A3"), True Selection.EntireRow.Insert , CopyOrigin:=xlFormatFromLeftOrAbove Sheets("Sheet1").Range("H3").Select ActiveCell.FormulaR1C1 = "5" Sheets("Sheet1").Range("E3").Select Selection.ClearContents Dim str_Left As String 'セルE4に文字列、セルH4に数字を予め入れておくこと。 str_Left = Left(Cells(4, 5), Cells(4, 8)) MsgBox str_Left & vbCrLf & " " & "OKボタンを押してください!" Sheets("Sheet1").Range("A3").Select End Sub ' ///Sheet2/// Private Sub Worksheet_Activate() Application.Goto ActiveSheet.Range("A3"), True Selection.EntireRow.Insert , CopyOrigin:=xlFormatFromLeftOrAbove Sheets("Sheet2").Range("A3").Select End Sub