[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『A1を含めたUsedRange』(マリオ)
UsedRangeが、D5:H10だったときに、 A1セルとUsedRangeを含めた領域(A1:H10)は、 マクロで、どのように表現するのでしょうか? ど忘れしました。ご教授願います。
< 使用 Excel:Excel2003、使用 OS:Windows10 >
Range("A1",ActiveSheet.UsedRange) とか。(私は、もっぱら、この書き方)
シート指定なら Sheets("hoge").Range("A1",Sheets("hoge").UsedRange)
(β) 2017/01/31(火) 08:15
>βさん http://www.niji.or.jp/home/toru/notes/8.html こちらのサイトに最終行、最終列の求め方があります。コレ↓ ******************************************************************************* <S6> 書式付きセルを除外する (UsedRange) With ActiveSheet.UsedRange MaxRow = .Find("*", , xlFormulas, , xlByRows, xlPrevious).Row MaxCol = .Find("*", , xlFormulas, , xlByColumns, xlPrevious).Column End With *******************************************************************************
開始行、開始列を求めるためには、 ★ActiveSheet.Range("A1", ActiveSheet.UsedRange) の記述の仕方が分からないと、と思いまして。 ActiveSheet.Range("A1", UsedRange)では、ないのですね。 ありがとうございます。
(マリオ) 2017/01/31(火) 08:34
Sub test2() Dim sh As Worksheet Set sh = ThisWorkbook.Sheets("Data") MsgBox "test1 - " & sh.Range("A1", sh.UsedRange).Address MsgBox "test2 - " & sh.Range(sh.Range("A1"), sh.UsedRange).Address MsgBox "test3 - " & sh.Range(sh.Cells(1.1), sh.UsedRange).Address End Sub (マリオ) 2017/01/31(火) 08:50
もちろん セルに 罫線 がつけられていたり 数式で "" になっているところも、UsedRange に含まれますから そういったシートを相手にするなら、ケースバイケースで、適切な把握コードにしなければいけないのは 明白ですね。
また目的にもよるでしょうね。 値はないけど罫線で表領域が確保されている。その最終セルまでを把握しなければいけない場合もあるでしょう。 そうだった場合は、マリオさんがアップされた値があるセルのみを相手にすると、不具合がでますね。
(β) 2017/01/31(火) 08:52
追加で、ご存じだとは思いますが MsgBox "test3 - " & sh.Range(sh.Cells(1.1), sh.UsedRange).Address
これは以下でもいいですよ。
Sub こんな書き方も() Dim sh As Worksheet Set sh = ThisWorkbook.Sheets("Data") MsgBox Range(sh.Cells(1.1), sh.UsedRange).Address(External:=True) End Sub
(β) 2017/01/31(火) 08:57
Findの「"*"」(第1引数) 空でないなんらかの値が入っていればマッチしますだから、 空白に見えても、「スペース文字」が入っている。 また、βさんがおっしゃるように 空白に見えても、「数式で =""」が入っている。 は気を付けないといけませんね。
セルのアドレスを取得する(Addressプロパティ)のことですかね。 https://www.moug.net/tech/exvba/0050094.html
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ '下記コード、A1セルに値が入っている場合だけ、正しく表示されない 'ので、*******で囲まれている部分を追加しました。
Option Explicit
Dim myRng As Range
On Error Resume Next ' ■■■■■ Dim MaxRow As Integer, MaxCol As Integer, MinRow As Integer, MinCol As Integer With ActiveSheet.UsedRange MaxRow = .Find("*", , xlFormulas, , xlByRows, xlPrevious).Row MaxCol = .Find("*", , xlFormulas, , xlByColumns, xlPrevious).Column End With With ActiveSheet.Range("A1", ActiveSheet.UsedRange) MinRow = .Find("*", , xlFormulas, , xlByRows, xlNext).Row MinCol = .Find("*", , xlFormulas, , xlByColumns, xlNext).Column End With '**************************************** If ActiveSheet.Range("A1") <> "" Then MinRow = 1: MinCol = 1 End If '**************************************** With ActiveSheet Set myRng = .Range(.Cells(MinRow, MinCol), .Cells(MaxRow, MaxCol)) End With On Error GoTo 0 '■■■■■■■■ (マリオ) 2017/01/31(火) 09:14
>値はないけど罫線で表領域が確保されている。その最終セルまでを把握しなければいけない場合もあるでしょう。 そうか〜、そんなことまで考えてませんでした。
(マリオ) 2017/01/31(火) 09:17
>>セルのアドレスを取得する(Addressプロパティ)のことですかね。
いえいえ、違います。
sh.Range(なんたら) ではなく Range(なんたら) でもいいですよ というつもりです。
この場合、Application.Range(なんたら) あるいは Excel.Range(なんたら) と解釈されて その詳細は ( ) 内の なんたら に依存しますよ と VBAが扱ってくれます。
じゃぁ、すべて その書き方が楽じゃないかということですけど、
Range("A1",別シート.なんとか) この場合、A1 はないてもわらっても、(標準モジュールの場合)アクティブシートになっちゃいますから 1004エラーで叱られますね。 なので、こういった場合は 別シート.Range("A1",別シート.なんとか) と記述せざるを得ないわけです。
(β) 2017/01/31(火) 09:21
>'下記コード、A1セルに値が入っている場合だけ、正しく表示されないので
Sub test()
Dim myRng As Range Dim rngBottom As Range Dim rngRight As Range Dim rngTop As Range Dim rngLeft As Range
With ActiveSheet Set myRng = .Range(.Range("A1"), .UsedRange) End With
With myRng Set rngBottom = .Find("*", .Cells(1), xlValues, , xlByRows, xlPrevious) Set rngRight = .Find("*", .Cells(1), xlValues, , xlByColumns, xlPrevious) Set rngTop = .Find("*", .Cells(.Count), xlValues, , xlByRows, xlNext) Set rngLeft = .Find("*", .Cells(.Count), xlValues, , xlByColumns, xlNext) End With
If Not rngBottom Is Nothing Then With Application Set myRng = .Range(.Range(rngTop, rngLeft), .Range(rngBottom, rngRight)) End With myRng.Select MsgBox myRng.Address(False, False) Else MsgBox "エラー" End If End Sub
Afterの位置を適正に指定すればA1に何かあっても特に問題が無いと思います。
(検索範囲内の最後のセルとか)
あと、On Error 〜 を安易に使わないようにしましょう。
ましてや、コード全体にエラーを無視するように書くなんてもってのほか。
同じセル範囲を検索しているのだから、
1個見つかれば、他がNothingになることはない。
逆に1個Nothingなら全部Nothingになる。
それでエラー処理を出来ると思います。
あと、
Rangeプロパティの引数は
Range(左上の単体セル,右下の単体セル)
出なくても左下、右上でも、範囲で指定しても大丈夫っぽいので、
参考になれば。。。
(まっつわん) 2017/01/31(火) 12:58
>まっつわん さん (まっつわん) 2017/01/31(火) 12:58のコードは、 ずばり、自分がやりたかったことです。
>Afterの位置を適正に指定すればA1に何かあっても特に問題が無いと思います。 Findの第2引数で、検索開始セルを指定できるってことなんですね。 「.Cells(1)」で、myRngセル範囲の左上、 「.Cells(.Count)」で、myRngセル範囲の右下 ↑こういうことでしょうか?
さらに、第3引数で、「xlValues」としておけば、 数式の「=""」で空白に見えるセルも拾いませんね。 スペースが入っていて、空白に見えるセルは拾っちゃいますけどね。 これは、Forループ使って、If LEN(Tirm(c.Value)))<>0 Thenで 処理するしかないのかな〜。ニーズがないか。
If Not rngBottom Is Nothing Then ↑これなら、On Error 〜いらないか。なるほど。 シートが、まっさらな時に、エラー1004って出るけど何やろ、程度で(笑)
(マリオ) 2017/01/31(火) 14:00
> 「.Cells(1)」で、myRngセル範囲の左上、 > 「.Cells(.Count)」で、myRngセル範囲の右下 > ↑こういうことでしょうか?
そういうことです。
実験マクロ
Sub test2()
Dim Rng As Range Dim i As Long
Set Rng = Range("C3:G6")
For i = 1 To Rng.Count Rng.Cells(i).Select MsgBox Rng.Cells(i).Address(0, 0) Next End Sub
セル範囲はセルの集合とみなします。
集合の各要素には内部的に番号が振られます。
実験の結果、横優先で番号が振られていることが解ります。
つまり、左上が1番で右下がセル範囲のセルの個数と同じ番号になります。
WorkSheets
WorkBooks
等も同じことです。
つまり一番右のワークシートは、
Worksheets(worksheets.Count)
と表せます。
>スペースが入っていて、空白に見えるセルは拾っちゃいますけどね。
そういうセルが存在してはならないなら、置換機能でスペース文字をなくしちゃえばいいでしょう。
その辺は臨機応変に^^
>シートが、まっさらな時に、エラー1004って出るけど何やろ、程度で(笑)
こういう事象は確認できませんが、
むしろ、
エラー1004
って出て欲しいです。
On Error Resume Next
として、エラーが出ないようになってると、
不具合に気づかなかったり、デバッグで迷子になったりします。
この辺は癖が出ちゃうので普段から気を付けた方がいいと思います。
(まっつわん) 2017/01/31(火) 15:27
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.