Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


12879 / 13644 ツリー ←次へ | 前へ→

【8139】For Each の順番を逆にしたい あまのじゃく 03/10/1(水) 22:31 質問
【8140】Re:For Each の順番を逆にしたい INA 03/10/1(水) 23:11 回答
【8142】Re:For Each の順番を逆にしたい ichinose 03/10/1(水) 23:39 回答
【8143】Re:For Each の順番を逆にしたい Kein 03/10/1(水) 23:46 回答
【8180】Re:For Each の順番を逆にしたい りん 03/10/2(木) 19:04 回答
【8182】Re:For Each の順番を逆にしたい ichinose 03/10/2(木) 19:46 発言

【8139】For Each の順番を逆にしたい
質問  あまのじゃく  - 03/10/1(水) 22:31 -

引用なし
パスワード
   こんばんは、
実は、訳あってForEachの実行順序を逆にしたいと
考えています。

例えば、

For Each cc In Range("A1:A20")

Next cc

の場合、A1,A2,A3...A20の順番に処理されますが、
A20,A19,...A1の順番にする方法はないのでしょうか。
この例では、セルなので、場合によってはアドレスを
直接操作すれば何とかなりますが、一般的なオブジェクト
を対象として、ForEach文の順序を逆順にする方法を
お伺いしたいと思います。

【8140】Re:For Each の順番を逆にしたい
回答  INA  - 03/10/1(水) 23:11 -

引用なし
パスワード
   直接の解答は分かりませんが、目的を明示すれば、
代替案を回答してもらえるかもしれませんよ。
いかがでしょうか?

【8142】Re:For Each の順番を逆にしたい
回答  ichinose  - 03/10/1(水) 23:39 -

引用なし
パスワード
   ▼あまのじゃく さん:
こんばんは。

>実は、訳あってForEachの実行順序を逆にしたいと
>考えています。
>
>例えば、
>
>For Each cc In Range("A1:A20")
>
>Next cc
>
>の場合、A1,A2,A3...A20の順番に処理されますが、
>A20,A19,...A1の順番にする方法はないのでしょうか。
>この例では、セルなので、場合によってはアドレスを
>直接操作すれば何とかなりますが、一般的なオブジェクト
>を対象として、ForEach文の順序を逆順にする方法を
>お伺いしたいと思います。
ForEach文では順序の特定ができないので、再登録という方法です。
'======================================================
Sub test()
  Dim newrng As Collection
  Set newrng = get_Revcollet(Range("a1:a20"), Range("a1:a20").count)
  For Each aa In newrng
    MsgBox aa.Address
    Next
End Sub
'==================================================================
Function get_Revcollet(objs As Object, count As Long) As Collection
  Dim obj As Object
  idx = count
  Set get_Revcollet = New Collection
  For Each obj In objs
    If idx = count Then
     get_Revcollet.Add Item:=obj, key:=Str(idx)
     jdx = idx
    Else
     get_Revcollet.Add Item:=obj, key:=Str(idx), before:=Str(jdx)
     jdx = jdx - 1
     End If
    idx = idx - 1
    Next
End Function

コレクションの総数がわからないと使えませんが・・・。

【8143】Re:For Each の順番を逆にしたい
回答  Kein  - 03/10/1(水) 23:46 -

引用なし
パスワード
   >一般的なオブジェクト
シートなどを指しているのでしょーか ? それなら一度、末尾から逆順ループして
シート名を配列に入れないと、無理ではないでしょーか ?
セル範囲なら、例えばA1:A10の値を逆順で、ということで

Sub RevAry()
  Dim Ary1 As Variant, Ary2 As Variant, Ar As Variant
  Dim ArSt As String
 
  Ary1 = WorksheetFunction _
  .Transpose(Range("A1:A10").Value)
  ArSt = StrReverse(Join(Ary1, ","))
  Ary2 = Split(ArSt, ",")
  For Each Ar In Ary2
   Debug.Print Ar
  Next
  Erase Ary1, Ary2
End Sub

というコードで出来ますが、Excel2000以降のみ可能です。

【8180】Re:For Each の順番を逆にしたい
回答  りん E-MAIL  - 03/10/2(木) 19:04 -

引用なし
パスワード
   あまのじゃく さん、こんばんわ。

>実は、訳あってForEachの実行順序を逆にしたいと
>考えています。

>A20,A19,...A1の順番にする方法はないのでしょうか。

Sub test()
  Dim II%, NN%
  With Range("A1:B20")
   For II% = .Count To 1 Step -1
     NN% = NN% + 1 '検証用カウンタ
     Set cc = .Cells(II%)
     cc.Value = NN%
   Next
  End With
  Set cc = Nothing
End Sub

Rangeの場合は、Range(範囲).Cells(インデックス値)
Worksheetの場合は、Worksheets(インデックス値) 
Workbookの場合は、Workbooks(インデックス値) 

のように、大概のオブジェクトはオブジェクトコレクションからインデックスで取得できます。

【8182】Re:For Each の順番を逆にしたい
発言  ichinose  - 03/10/2(木) 19:46 -

引用なし
パスワード
   ▼りん さん:
こんばんは、久しぶりですねえ!!

>あまのじゃく さん、こんばんわ。
>
>>実は、訳あってForEachの実行順序を逆にしたいと
>>考えています。
>
>>A20,A19,...A1の順番にする方法はないのでしょうか。
>
>Sub test()
>  Dim II%, NN%
>  With Range("A1:B20")
>   For II% = .Count To 1 Step -1
>     NN% = NN% + 1 '検証用カウンタ
>     Set cc = .Cells(II%)
>     cc.Value = NN%
>   Next
>  End With
>  Set cc = Nothing
>End Sub
>
>Rangeの場合は、Range(範囲).Cells(インデックス値)
>Worksheetの場合は、Worksheets(インデックス値) 
>Workbookの場合は、Workbooks(インデックス値) 
>
>のように、大概のオブジェクトはオブジェクトコレクションからインデックスで取得できます。
別に意見はなかったんですが、
今度は削除できないように・・・、
ははっ、失礼しました。

12879 / 13644 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free