プロが教える店舗&オフィスのセキュリティ対策術

エクセル2007を使用して住所録を作成しています。
一行に1名ずつの情報(各列に氏名など)が入るようになっています。
A列にリスト番号・B列に氏名、といった感じで作成しています。
一覧表示だと列の数が多く個別の内容が分かりにくいため、
ユーザーフォームを使って1件ずつ詳細を見られるようにしました。

ユーザーフォームに付けたコマンドボタン「次」を押すと
順番(住所録リストの上から順)に個別の内容が表示されるように
したのですが、オートフィルタをかけてしまうと
非表示のリストもユーザーフォームに表示されてしまいます。

そこで、いくつかの参考書などを使って組んでみたのですが、
私の作ったものではコマンドボタン「次」を押すと
オートフィルタで表示されている一番下の
リストにユーザーフォームの内容が飛んでしまいます。

どのようにすれば、オートフィルタで表示されているリストのみを
順番にユーザーフォームに表示ができるのでしょうか?

私が作ったものです。↓

Private Sub cmd次_Click()
Dim r As Range, rr As Range, rs As Range

If Not Worksheets("名簿").AutoFilterMode Then
 データ行 = データ行 + 1
Else
Set r = Worksheets("名簿").Range("A3", Range("A" & Rows.Count).End(xlUp)).SpecialCells(xlCellTypeVisible)

For Each rr In r
For Each rs In rr.Areas
データ行 = rs.Row
Next rs
Next

 End If
表示データ変更
End Sub

このような質問で分かりにくいようでしたらすみません。

どなたかご教授いただければ幸いです。

A 回答 (3件)

次の非表示ではない(=表示されている)行を取得できればよいということですよね?



 Do
  データ行 = データ行 + 1
 Loop Until Not Rows(データ行).Hidden

でいけると思います。
最大行数に制限があるなどの場合は、判断条件にそれを追加してください。
    • good
    • 0
この回答へのお礼

fujillin様

お返事が遅くなり申し訳ありません。
必要に応じて多少のアレンジは致しましたが
ご回答頂いたコードでうまく出来ました。

私が作ったものよりも簡潔で、非常に助かりました。

ありがとうございました。

お礼日時:2009/08/31 14:45

Private Sub 進む_Click()



Do
ActiveCell.Offset(1, 0).Activate
Loop Until Rows(ActiveCell.Row).Hidden = False

TextBox1 = ActiveCell.Value

End Sub

Private Sub 戻る_Click()

Do
ActiveCell.Offset(-1, 0).Activate
Loop Until Rows(ActiveCell.Row).Hidden = False

TextBox1 = ActiveCell.Value

End Sub

でいかがでしょう
    • good
    • 0
この回答へのお礼

kmetu様

お返事が遅くなり申し訳ありません。
fujillin様の回答と組み合わせてアレンジし、
うまく組むことが出来ました。

しかも「戻る」のコードまで頂き、
とても助かりました。

ありがとうございました。

お礼日時:2009/08/31 14:49

>どのようにすれば、オートフィルタで表示されているリストのみを順番にユーザーフォームに表示ができるのでしょうか?



簡単にできそうですがフィルタ中のリスト操作はVBAでも無理な事なのです・・・。
フィルタ結果を別シートにコピーして利用してください。
    • good
    • 0
この回答へのお礼

回答ありがとうございました。

お礼日時:2009/08/27 11:09

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!