[[20260608154015]] 『1行のレンジを求めたい』(広田) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) |

| 全文検索 | 過去ログ ]

 

『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.