• ベストアンサー

エクセルVBAでUsedRangeの範囲について

たとえば、新たにワークシートを挿入し、A1とC3のセルにのみ入力し、他のセルには一度も入力や書式設定をしなかった場合、 MsgBox ActiveSheet.UsedRange.Addressは、当然 $A$1:$C$3 を返しますね。 この場合、仮にD列から右に非表示の列があってもUsedRange.Addressは変わりません。 ところが、4行目以下に非表示行があった場合は何故か非表示行までの範囲がUsedRange.Addressに含まれてしまいます。 仮に上記の入力状態のままで、20行目とF列を非表示にすると、不思議なことに $A$1:$C$20 が返ってきます。 どうしてUsedRangeの取得では、行と列との非表示の場合の取り扱いが異なるのでしょうか? ( ̄∇ ̄; ?( ̄□ ̄; ? Σ( ̄0 ̄;)?

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

  • ベストアンサー
  • NNAQ
  • ベストアンサー率56% (104/184)
回答No.3

あまり細かい事を気にせずに、そういうもんだと考えてしまえば幸せになれるでしょう。 それだと回答にならないので、 行を非表示にしなくても、行高を変更しただけでUsedRangeの範囲に含まれるようです。列幅は関係ないようです。 それで、想像なのですが、 列や、UsedRangeの範囲、ズーム、ウインドウの分割等は、シートの情報で、 セルの値・書式、行の高さや表示・非表示等は、UsedRangeの情報になっている、 という事なのかも知れません。 ブックを保存する時や、エクセルの何か機能を使う時、それらの情報をエクセルに認識させて動作させているんじゃないでしょうかねぇ。

merlionXX
質問者

お礼

NNAQさま、「切り取り不可」につづきまたもやありがとうございます。 > 行高を変更しただけでUsedRangeの範囲に含まれるようです。列幅は関係ないようです。 これも新たな驚きです。知りませんでした。 (^0_0^)ナルホド まあ、こういうものだと覚えてわたしも幸せになります。 (≡^∇^≡) ありがとうございました。

その他の回答 (2)

  • ja7awu
  • ベストアンサー率62% (292/464)
回答No.2

> でも、ワークシートの使用範囲外の行がフィルターで非表示になる場合ってどんな場合でしょうか? それよりも、先にお聞きしたいのですが・・・ > A1とC3のセルにのみ入力 なのに > 20行目とF列を非表示にする 場合ってどんな場合でしょうか? 使用範囲外の行を・・・

merlionXX
質問者

お礼

a7awuさま、何度もありがとうございます。 いえ、別に特定のケースを想定しているわけではないのです。 UsedRangeの範囲について、当初自分では何かデータが入力されたセルを結ぶ矩形だと思っていました。 ところがまったく入力しなくとも色を変えたり、フォントを変更しただけでもUsedRangeの範囲が広がることに驚きました。 そして何をすればUsedRangeになるのかを実験していてこの現象に気づいただけです。 特に実用的な意味はないでしょうが気になったものですから。 使用範囲外の行を非表示にはいくらでも出来ますが、使用範囲外の行をフィルターで非表示には出来ませんよね?

  • ja7awu
  • ベストアンサー率62% (292/464)
回答No.1

フィルタの関係で、そういう 仕様 になったものと思いますよ。 フィルタ状態か否かで UsedRange の範囲が変わったら使いにくいと思いませんか? 列方向には、フィルタが掛からないから・・・ と推測しますが・・・

merlionXX
質問者

お礼

ご回答ありがとうございます。 フィルタの関係ですか。 でも、ワークシートの使用範囲外の行がフィルターで非表示になる場合ってどんな場合でしょうか?

関連するQ&A

  • VBA UsedRangeで選択範囲を取得したい

    セルに aaa bbb ccc と入力し、vbaで Sub Macro() MsgBox ActiveSheet.UsedRange End Sub を実行すると、 型が一致しません。(Error 13) と言うエラーになります。 "$A$1:$D$3"と言うような値を取得したいのですが、どのようなVBAにすればいいのでしょうか? ご回答よろしくお願いします。

  • Excel VBA UsedRange範囲ソート

    図のような中抜の一覧ができているとき、商品コードで空行を飛ばして並び替えをしたいのですが、下記だと空行まで(チョコからわたがしまで)しか対象になりません。 ---------------------------- Sub 並べ替え() With ActiveSheet.Sort .SortFields.Clear 'Key:=Range("A3")でソートする列とタイトル位置を指定 .SortFields.Add Key:=Range("A3"), SortOn:=xlSortOnValues, _ Order:=xlAscending '.「商品コード」("A3").でソート .SetRange Range("A3").CurrentRegion ' 先頭行をタイトル行と見なす .Header = xlYes .Apply End With End Sub ------------------------- 範囲をCurrentRegion ではなくUsedRangeに広げるには、どこをいじったらいいでしょうか。 求める結果としては「商品コード」の列が登り順に揃ってほしいのです。 データ処理としてはソートをかければいいだけですが、UsedRange(範囲内のセルを選択し、Ctrl+Shift+Endキーで選ばれる範囲)をみつけてソートをかける方法を知りたいのです。

  • UsedRange って、「空白セル」までも参照するのですか?

    Windows XP Home Edition Office XP Personal 2002 Excel 2002 1行~200行までのみに値があります。他は空白です。 UsedRange は、 何らかの編集が行われているセル範囲を選択するということですが、 確認のために、 3、 4 にして実行しますと、 3はColumns("G:H") を全部選択してしまいます。 書式を変更した「空白セル」までも、UsedRangeとなってしまうのでしょうか。 私は、3も "G1:H200" を選択すると思っていたのですが、 確認のしかたが間違っておりますでしょうか? よろしくお願い致します。   '1   With ActiveSheet.UsedRange.Columns("G:H")   '2   With ActiveSheet.Range("G1:H200")   '3    ActiveSheet.UsedRange.Columns("G:H").Select   '4    ActiveSheet.Range("G1:H200").Select

  • エクセルVBAでUsedRangeかつB列の指定方法について

    For Each c In ActiveSheet.UsedRange 略 Next この構文で、cが全てのUsedRangeではなく、B列かつUsedRange内とするためにはどう記述すればいいのでしょうか? よろしくお願いします。

  • UsedRangeの範囲の設定

    入力したデータの一番下にの行に"data_end"と入力するようにしたいと思っております。 今、UsedRangeを使用してその下の行に"data_end"と入力しようとすると以前に使用した行まで選ばれてしまい、空白の行ができてしまう状態になっています。また、CurrentRegionを使用すると空白行があると空白行以降を選んでもらえません。(データがトビトビにあるので空白行と認識されてしまう可能性があります。) しかも、データの入力されているセルは別のシートで計算式に参照されているのでいらない行を削除することはできません。 今入力されている状態の一番下の行を認識するにはどうしたらよいでしょうか? プログラムは以下のように入力してあります。 Sub test() Dim row_end As Integer Sheets("sheet1").Select ActiveSheet.UsedRange.Select row_end = Selection.Rows.Count Sheets("sheet1").Cells(row_end + 1, 1).Value = "data_end" End Sub ものすごく基本的な質問かもしれませんが、よろしくお願いしますっっっ。

  • エクセル VBAで入力

     エクセル初心者です。 条件付き書式で一つのセルに特定の文字列を入力した際に、そのセルと任意の法則性のある複数のセルに(入力内容は無関係でセルの行・列に法則性があります)特定の塗りつぶしを行いたいのですが、どのようにすればよいのでしょうか。 条件付き書式をすべて設定する(手打ち)するのが最も確実で間違いの内方法ではありますが、新規に行・列を挿入した場合、その行・列には条件付き書式が設定されていませんので、意図した作用を起こさなくなってしまいます。 上記ではよくわからないと思いますので、具体的な例を入れさせていただきます。 例)) 任意のセル(A13)に特定の文字列(OK)と入力する。 特定文字列に反応して、そのセルの列に(A12からE12、F12からH12)赤色の塗りつぶしを入れる。 上記は1セルに対して行われますが、VBAを使用してA12からA5000までを検索対象として持たせて、それぞれのセルの列に対して塗りつぶしを入れられるようにしたいと思っています。

  • エクセルのVBAで

    ある列(仮にA列とします)の最終行がA30であり A25までは空白だとします。 この時に、A30の値をA29~A25=データの入力されていないセルに入力(コピー)するにはVBAでどのように記述すればいいのでしょうか? 最終行から、上にその最終行の値をデータの入力されているセルに達するまで入力(コピー)したいのですが。 分りづらい表現で申し訳ありませんが、よろしくお願い致します。

  • UsedRange A1があれば、msgbox

    http://www.moug.net/tech/exvba/0050092.html をみて、 Sub UsedRangeSamp1() ActiveSheet.UsedRange.Select End Sub と言うコードを使ってるのですが、 この中に、A1があれば、msgboxでOKを表示させるにはどうすればいいですか? ifステートメントを使うんだと思いますが、それ以上がわかりません。 ご回答よろしくお願いします。

  • エクセルVBAで DirectPrecedentsプロパティ

    DirectPrecedentsプロパティが同一シート内しかトレースできないことを利用して、他シートを参照しているセルを判定できないかと思い、下記のマクロを書いてみました。 残念ながら他シートを参照しているセルでエラーになってしまいます。 どのよに修正すればよいでしょうか? なお、他シート参照の判定に"!"の存在を使わないのは、「名前定義」されたセルを参照している場合を想定しているためです。 Sub TEST01() With ActiveSheet On Error GoTo line For Each c In .UsedRange.SpecialCells(xlCellTypeFormulas, 23) On Error GoTo 0 c.Select If c.DirectPrecedents.Address = "" Then'ここでエラー MsgBox c.Address & "は他シート参照" Else MsgBox c.Address & "は" & c.DirectPrecedents.Address & "参照" End If Next End With line: MsgBox "数式がありません。" End Sub

  • エクセルVBAとワークシート関数が違う答え?

    エクセル2013です。 A1セルからA100セルにすべて1%と入力されています。 BIセルに =SUM(A:A) と数式が入っており、100%と表示されています。 A,B列のセルの書式はすべてパーセテージです。 101行以下には何も入っていません。 C1セルに =B1=1 と数式が入っており、TRUEが表示されています。 標準モジュールに Sub test01() MsgBox Range("B1").Value = 1 End Sub と書きました。 実行したところFalseが帰ってきました。 なぜ、TRUEにならないのでしょうか? なお、 Sub test02() MsgBox Val(Range("B1").Value) = 1 End Sub とすると、TRUEが帰ります。 でも、Val関数はStringを数値化するものですよね? B1セルはもともと数値なのでVal関数で答えが変わるのも不思議です。 どなたか、わかるように教えていただけないでしょうか?

専門家に質問してみよう