[[20170707165521]] 『.End(xlDown).End(xlDown)の省略』(さき) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『.End(xlDown).End(xlDown)の省略』(さき)

VBAのこの記述なんですが、2回つづけてのEnd(xlDown)を
一つにまとめたいのですが、適当な記述はあるのでしょうか?

< 使用 Excel:Excel2007、使用 OS:Windows7 >


二つ目のブランクセルを指定したいということですか?
(カリーニン) 2017/07/07(金) 17:41

途中の空欄数が不定の場合を考慮し、最下行からxlUpでデータのある最下行を得る、という方法が良く使われます。この手が使えませんかね?
    MsgBox Cells(Rows.Count, "A").End(xlUp).Row
(???) 2017/07/07(金) 17:45

 >2回つづけてのEnd(xlDown)を 
一つにまとめたいのですが、

 MsgBox Range("a1").End(xlDown).End(xlDown).Address

 こんな感じでできますが、何を求めているのでしょう?
(seiya) 2017/07/07(金) 18:11

 >二つ目のブランクセルを指定したいということですか?

 間違ってました。たとえば、↓のような場合、A1から2回End(XlDown)を行うと、
 A5になりますね。

 	A
 1	1
 2	1
 3	1
 4	
 5	1
 6	1
 7	1
 8	1
 9	
 10	1
 11	1

 seiyaさんがおっしゃるように、何を求めているかによっては
 >2回つづけてのEnd(xlDown)
 というの自体が実は間違っていた、という可能性もありますね。
(カリーニン) 2017/07/07(金) 20:26

 考えた末ああなって、かっこうよく書こうとした結果だと推測。
 A1:A11と範囲固定しちゃってるけど。
 こんな感じなのかな?

 Dim Rng As Range, N番目の範囲 As Long
 N番目の範囲 = 2
 Set Rng = Range("A1:A11").SpecialCells(xlCellTypeConstants, 23)
 With Rng.Areas(N番目の範囲)
     MsgBox N番目の範囲 & "個目の範囲の" & vbLf & _
            "先頭は、" & .Cells(1).Address(0, 0) & vbLf & _
            "最後は、" & .Cells(.Cells.Count).Address(0, 0)
 End With
 Set Rng = Nothing

(BJ) 2017/07/07(金) 22:38


回答ありがとうございます。
seiyaさんの言う通りでEnd(xldown)2回分の位置を指定したいのですが、
MsgBox Cells(Rows.Count, "A").End(xlUp).Rowみたいに最終行指定ではなく
単純に指定の位置からctr+下、ctr+下をしたいだけで、

End(xldown)End(xldown)の記述自体をイメージとしては

End(xldown*2)みたいに一つにまとめる記述方法はありますかという事でです。
説明不足ですみません。

(さき) 2017/07/08(土) 11:20


もう回答は出尽くしていると思います。
(カリーニン) 2017/07/08(土) 11:25

 seiyaさんの

 >MsgBox Range("a1").End(xlDown).End(xlDown).Address

 で何か問題がありますか?
 それとも、
 >End(xldown*2)みたいに一つにまとめる記述方法はありますかという事でです。 
 という記述があるはずだ、ということですか?
 どこかのHPで見かけたのでしょうか?
 あったとしても、自作Functionか何かだったと思います。
(カリーニン) 2017/07/08(土) 11:28

 >End(xldown*2)みたいに一つにまとめる記述方法はありますかという事でです。 

 ありません。

 追記: 12:36
  MsgBox Range("a1").End(xlDown).End(xlDown)
 にしても、きちんと処理をしてやらないと使い物にならないので私は使用しませんね。
(seiya) 2017/07/08(土) 11:43

 まとめる記述方法は知らないですが、どういった場面で使用されるのか興味あります。
 下記のような場合、それぞれ1行目からCtrl+↓↓とすると、すべて4行目で止まると思いますが
 意味合いがまったく違うような気がします。

    |[A]|[B]|[C]
 [1]|  1|  1|   
 [2]|  1|   |   
 [3]|   |  1|  1
 [4]|  2|  2|  2

 参考までに、現在想定されている使いどころを教えてもらえませんか?
(稲葉) 2017/07/08(土) 13:19

 >.End(xlDown).End(xlDown)

 なんか外国の方では、結構いるみたいですね
 なんて書いているのか読めないけど。

https://search.yahoo.co.jp/search?p=%22.End%28xlDown%29.End%28xlDown%29%22&aq=-1&oq=&ai=ehVfaV2rQjGXmslw01nHMA&ts=5812&ei=UTF-8&fr=top_ga1_sa&mfb=427_56a&x=wrt

 日本でそう回答している方も1人いたし。
 私は、そういう風にかきたくないですね。

(BJ) 2017/07/09(日) 00:10


 少し駄文を。

 もしそういう使いかたがニーズにマッチしているなら、
 普通に二回繰り返せばよい、というのが私の意見です。

 (1)
 >End(xldown*2)みたいに一つにまとめる記述方法はありますかという事でです。 
 回答がありましたように、それはありません。

 Endは何かというと、RangeオブジェクトのRangeを返すプロパティです。
 ユーザーがその挙動を変更させること(xlDown*2などという引数の追加) はできません。
  
 また、End2(xlDown)のような発想で、そうした機能を持つプロパティを
 既存のRangeオブジェクトに追加することも、仕様上できません。

 (2)
 どうしても、二回繰り返す書き方が、何度も何度も色々な箇所に出てきて、
 どうしても自身の美学として許せない、ということなら、
 ユーザー定義関数を作ればよいでしょう。
 以下、例示。

 Sub test1() ' 普通はこう書く
     Debug.Print Range("A1").End(xlDown).End(xlDown).Address
 End Sub

 Sub test2() ' 二回繰り返すのは恥だという美学派
     Debug.Print end2(Range("A1")).Address
 End Sub

 ' ユーザー定義関数
 Function end2(r As Range) As Range
     Set end2 = r.End(xlDown).End(xlDown)
 End Function

 ただ、貴兄の厳格な美学を少し緩めたほうが、幸せになれるだろうと思われます。

 # 力を入れるようなテーマではなかったねえ。

(γ) 2017/07/09(日) 10:01


 需要あるのかわからんけど。

 Sub aaaa()
    MsgBox EndxlDownDown(Sheets("Sheet1").Range("A1"), 3).Address
 End Sub

 Function EndxlDownDown(Rng As Range, 回数 As Long) As Range
   For i = 1 To 回数
       Set Rng = Rng.End(xlDown)
   Next
   Set EndxlDownDown = Rng
 End Function

(BJ) 2017/07/09(日) 13:09


回答ありがとうございます。
やはりそのような記述はないのですね。

問題は無いのですが、単純に私が.End(xlDown).End(xlDown)の記述に違和感を感じ、省略して記述できないのかなー?と思って質問した次第です。
わざわざユーザー定義関数を使うのものでもないですし、おとなしく列挙しようと思います。
(さき) 2017/07/09(日) 17:18


 結局使い道は教えていただけないのですね
(稲葉) 2017/07/09(日) 19:45

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.