『1行のレンジを求めたい』(広田)
例えば UsedRange の10行目のレンジを求めるにはどうすればいいですか?
UsedRange = "B2:Z25" だったとすると
10 行目
Range = "A10:Z10"
を求めたい
< 使用 Excel:Microsoft365、使用 OS:Windows11 >
Range(usedRange).rows(10) //Rangeobj
B2始まりなら10行目は11じゃない?
(ちくわ) 2026/06/08(月) 16:11:50
Dim rng As Range
Set rng = ActiveSheet.Range("B2:Z25")
Debug.Print rng.Rows(10).Address
Debug.Print Intersect(rng, ActiveSheet.Rows(10)).Address
いずれも A10:Z10 にはならない なぜA列が? (どっち?) 2026/06/08(月) 16:37:33
あ、ほんとですね A列始まりにしたいのか。 上のは忘れてください (ちくわ) 2026/06/08(月) 16:52:03
↓こういうこと?
Sub test()
Dim rng As Range
Set rng = Range(ActiveSheet.Range("A1"), ActiveSheet.UsedRange)
Debug.Print rng.Rows(10).Address
End Sub
(通行人) 2026/06/08(月) 17:02:24
質問者さん、 UsedRange が "B2:Z25" のとき、 「UsedRange の10行目のレンジ」とはどういう意味ですか? なぜA列が入るのですか? また、B11:Z11 ではないのですか?
また、どういうシチュエーションを想定しているのですか? つまり、なぜそうしたことが必要になっているのですか? 補足説明をしてもらえませんか?
説明どおり、 > Range = "A10:Z10" を求めたいとすれば、単にA1セルになんらかの仮のものを入れて、 UsedRangeをA1セル始まりにすれば済む話です。 そうすれば普通に指定できます。
(xyz) 2026/06/08(月) 17:39:33
みなさん 説明不足ですみません うまく説明できないかもしれませんが
セルのデータを2次元配列にいれて処理をします。 Dim vdat as Variant: vdat = UsedRange
10行目のデータを処理する場合 For ir = 1 to Ubound(vdat,1) For ic = 1 to Ubound(vdat,2) if vdat(ir,ic) <> "" then ... 処理... : Cells(ir, ic) = "結果" Next Next
UsedRange の 10行目だけの処理をしようとすると 以下のようになります。
ir = 10 For ic = 1 to Ubound(vdat,2) if vdat(ir,ic) <> "" then ... 処理... : Cells(ir, ic) = "結果" Next
vdat = UsedRange で処理をして ir + UsedRange.Row, ic + UsedRange.Column にして出力すると修正箇所が多いし、修正ミスがでそうなので UsedRange を "A1" からにすると、変更する箇所が少なく確実かと 思ったわけです。
(広田) 2026/06/09(火) 10:43:44
これでいけそうな気がします。
Dim vdat as Variant Dim ir as long, ic as long
ir = 10
vdat = Range(ActiveSheet.Range("A1"), ActiveSheet.UsedRange).rows(ir)
For ic = 1 to Ubound(vdat,2)
if vdat(1,ic) <> "" then ... 処理... : Cells(1, ic) = "結果"
Next
(広田) 2026/06/09(火) 11:02:43
質問に回答いただいたので返事をしておきます。 理解が進んだ気はします。 UsedRangeは移ろいやすい(想定したものから意識せずに変化することがある)ので、 個人的には、それに準拠した処理は余りしないです。
(1)使うとしても
Dim rng As Range
Set rng = ActiveSheet.UsedRange
として、以降はrngを使ったほうが、
逐一シートを指定しなくて済むのでよいと思います。
(2)
あとは、rngの相対参照指定すればよいでしょう。
rng.Cells(ir, ic) = "結果"
rng.Item(ir, ic) = "結果" でもよいと思います。
(xyz) 2026/06/09(火) 11:40:13
> セルのデータを2次元配列にいれて処理をします。
そもそも配列にいれて処理するのはどのような目的でしょうか。 高速化が目的なら、
Cells(1, ic) = "結果"
というように各セルに代入するならあまり意味がないです。 各セルへの読み込みと代入では圧倒的に後者の方が重い処理なので。
処理した結果をセルに戻すなら、配列に処理結果を書き込んで 一気にセル範囲に代入した方が高速です。
提示のコードを配列で一気に代入する方法に修正するなら下記のような感じでしょうか。
Dim rDat As Range, rRes As Range Dim vdat() As Variant, vRes() As Variant Dim ir As Long, ic As Long
ir = 10 Set rDat = ActiveSheet.UsedRange.Rows(ir) Set rRes = ActiveSheet.UsedRange.EntireColumn.Rows(1) vdat = rDat vRes = rRes
For ic = 1 To UBound(vdat, 2) If vdat(1, ic) <> "" Then vRes(1, ic) = "結果" Next
rRes.Value = vRes
ちなみに、UsedRangeの使用は避けた方がいいというのはxyzさんの意見に同意です。 その部分は要検討です。 (hatena) 2026/06/09(火) 12:32:17
# まごまごしていたら完全に重なってしまいました。
記載内容からすると 「UsedRange の10行目のレンジ」は B11:Z11 ですよね?
コードをもう少し書くと、こうです。
Sub test2()
Dim rng As Range
Dim v As Variant
Set rng = ActiveSheet.UsedRange
v = rng.Value
ir = 10
For ic = 1 To UBound(v, 2)
If v(ir, ic) <> "" Then
'' ... 計算処理...
rng.Cells(ir, ic) = 上記の計算結果
End If
Next
End Sub
なお、折角配列計算にしたのであれば、変数vを直接変更したうえで、 rng.Value = v と、ワークシートに一括して書き込むのが速度的には有利です。
(xyz) 2026/06/09(火) 12:45:36
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.