Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 10全般 : Excel 2013)
findnextで、空欄以外の列を複数指定し、それぞれ変数を割り当てる方法について
投稿日時: 20/07/31 14:05:19
投稿者: OkabeS

findnextで、空欄以外の列を複数指定し、それぞれ変数を割り当てる方法について
ご教授いただけますでしょうか?
do whileだと最後に発見された列を返すようですが、
各々に割り当てる方法が分かりません。。
よろしくお願いいたします。
 
Dim rng As Range, tempRng As Range, searchRng As Range
Set searchRng = Range("A2:Z2")
Set rng = searchRng.Find("*")
Set tempRng = rng
Do While Not rng Is Nothing
Set rng = searchRng.FindNext(rng)
If rng.Address = tempRng.Address Then
Exit Do
End If
loop
 
■例
-----------------------------------------
   A  B  C  D  E  〜
1 あ     う    さ
2 か     い    し
3            す
4
 
→以下のように変数指定したい
findnextの結果より
first=columns(1)
second=columns(4)
third = columns(〜)

回答
投稿日時: 20/07/31 14:59:06
投稿者: sk

引用:
findnextで、空欄以外の列を複数指定し、それぞれ変数を割り当てる

引用:
findnextの結果より
first=columns(1)
second=columns(4)
third = columns(〜)

・1 つの行において「空白ではないセルの数」が何個になるか
 どの列のセルが空白ではないのかは、特に決まっていない。
 (その都度、それぞれの行によって異なる)
 
・(各変数の型が不明ですが)first, second, third といった変数も
 実際に何個必要になるかは分からない。
 ( 4 個以上のセルの値、または参照を取得する場合もある)
 
といった前提で話をされているのか、そうではないのか、
どちらなのでしょうか。

投稿日時: 20/07/31 15:34:22
投稿者: OkabeS

SK様
 
お返事ありがとうございます。
ご指摘頂いた前提の通りです。
>>
・1 つの行において「空白ではないセルの数」が何個になるか、
 どの列のセルが空白ではないのかは、特に決まっていない。
 (その都度、それぞれの行によって異なる)
  
・(各変数の型が不明ですが)first, second, third といった変数も
 実際に何個必要になるかは分からない。
 ( 4 個以上のセルの値、または参照を取得する場合もある)
  

回答
投稿日時: 20/07/31 15:42:29
投稿者: Suzu

多分ですが、最初にヒットすると考えている A2 が、最後にヒットするのが気に入らない という事ですよね?
 
つまづいたら、HELP を確認するようにしましょう。
 
Range.Find メソッド (Excel)
https://docs.microsoft.com/ja-jp/office/vba/api/excel.range.find?f1url=https%3A%2F%2Fmsdn.microsoft.com%2Fquery%2Fdev11.query%3FappId%3DDev11IDEF1%26l%3Dja-JP%26k%3Dk(vbaxl10.chm144128)%3Bk(TargetFrameworkMoniker-Office.Version%3Dv15)%26rd%3Dtrue
 

引用:
After    省略可能    バリアント型
このセルの後から検索を開始します。
 (中略)
この引数を指定しない場合は、範囲の左上端のセルの後から検索が開始されます。

 
After に、検索対象の最終セルを渡せば良いです。
 
Set rng = searchRng.Find("*", After:=searchRng.Cells(searchRng.Cells.Count))
 
 
でも
解説にこうも書いてあります。
 
引用:
LookIn、LookAt、SearchOrder、および MatchByte の設定は、このメソッドを使用するたびに保存されます。 次にこのメソッドを呼び出すときにこれらの引数の値を指定しない場合、保存された値が使用されます。 これらの引数を設定すると、[検索] ダイアログ ボックスの設定が変更され、また、[検索] ダイアログ ボックスで設定を変更すると、引数を省略した場合に使用される保存された値が変更されます。 問題を回避するには、このメソッドを使用するたびに、これらの引数を明示的に設定します

 
他の引数も明示的に指定しましょうね。

回答
投稿日時: 20/07/31 16:00:01
投稿者: sk

引用:
ご指摘頂いた前提の通りです。

・動的配列を使用する。
 
・1 つ以上の「空白ではないセル」を 1 つのセル範囲としてまとめる。
 
今のところ考えられるのは以上のいずれか。
 
(後者の場合)
------------------------------------------------------------
 
Dim rng As Range, tempRng As Range, searchRng As Range
Dim strFirstAddress As String
 
Set searchRng = Range("A2:Z2")
 
With searchRng
    Set rng = .Find("*", .Item(.Count))
End With
 
If Not rng Is Nothing Then
    strFirstAddress = rng.Address
    Set tempRng = rng
    Do
        Set tempRng = Union(tempRng, rng)
        Set rng = searchRng.FindNext(rng)
    Loop While (Not rng Is Nothing) And (strFirstAddress <> rng.Address)
End If
 
If Not tempRng Is Nothing Then
    For Each rng In tempRng
        Debug.Print rng.Address(False, False) & ": " & rng.Value
    Next
Else
    Debug.Print searchRng.Address(False, False) & "は全て空白セルです"
End If
 
Set rng = Nothing
Set tempRng = Nothing
Set searchRng = Nothing
 
------------------------------------------------------------

投稿日時: 20/08/01 02:00:38
投稿者: OkabeS

Suzu様
お返事ありがとうございます。
質問が悪くすみませんが、特定列を対象にするのではなく、
Findされた複数列を全て変数にしたい。という趣旨でした。
 
SK様
ご回答ありがとうございました。
変数の部分は、教えて頂いたUnionを使用し、以下のように変数にすることで
それぞれFindされた列でのみ反応するようになりました。
 
ありがとうございました。
 
Debug.Print rng.Address(False, False) & ": " & rng.Value

eachcol = rng.Column
Cells(7, eachcol) = "8888"