- ベストアンサー
EXCEL(VBA)における次行遷移
- EXCELの明細行の各項目のデータによりメールを作成・表示し、手作業で送信するために、VBAを使用しています。
- マクロを実行するたびに、該当する行・項目のデータでメールを作成し、次の行にカーソルを移動させています。
- しかし、フィルターの掛かっていないデータも次の行に移動してしまうため、フィルターを掛けてメールを送信したい時に問題が発生します。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
Sub test1() SendKeys "{down}", True End Sub とか Sub test2() On Error GoTo er Do ActiveCell.Offset(1).Select Loop Until Not ActiveCell.EntireRow.Hidden Exit Sub er: MsgBox Err.Number & "::" & Err.Description End Sub とか Sub test3() Dim r As Range On Error GoTo er For Each r In Range(ActiveCell.Offset(1), ActiveCell.Offset(1).End(xlDown)).SpecialCells(xlCellTypeVisible) r.Select Exit For Next Set r = Nothing Exit Sub er: MsgBox Err.Number & "::" & Err.Description End Sub ..など。 元スレッドでは『意図が十分に伝わらず』..とは思えませんけれども。 #1さんの回答などは、サンプルの内容を理解して、 その応用をしてほしかったのではないですかね。
その他の回答 (5)
- DOUGLAS_
- ベストアンサー率74% (397/534)
>マクロの記述は割愛します。 「以前の質問」の コーディング がそのまま使えるような コード にしなければなりませんかね。 '### 次行へ遷移 Cells(i + 1, 1).Select の次に、 While ActiveCell.EntireRow.Hidden: ActiveCell.Offset(1).Select: Wend を入れてお試しください。
フィルタかけたあと全コピして、別シートに貼り付け、貼り付けたシートでマクロ走らせてみては? 1つ手作業入っちゃうけれど、コード修正は必要ないと思われます。 ・・・などと思ったり。
お礼
ありがとうございます。 しかしながら・・・ 私だけで使うのではないので、 自動化出来る部分は自動化するのが狙いです。
- nda23
- ベストアンサー率54% (777/1415)
とりあえず1~最終行までの可視性を返す関数を作って みました。戻り値はBoolean配列で、行がインデックスに なっています。見えている(フィルタで選択された)行は True、見えていない(フィルタで排除された)行はFalse ですので、Falseの行は処理しないようにすればよいと 思います。 尚、見出し行なども可視なので範囲に入ります。 実データが何行目から始まるかはご存知ですよね。 Function 行の可視属性応答(シート As Worksheet) As Boolean() Dim 最終行 As Long Dim 行 As Long Dim 可視行配列 Dim 可視行範囲 Dim 行位置配列 Dim 可視開始行 As Long Dim 可視終了行 As Long '最終行位置を記録する 最終行 = シート.Cells.SpecialCells(xlCellTypeLastCell).Row '戻り値用の配列を定義する ReDim 可視属性(1 To 最終行) As Boolean '行の初期値を設定する 行 = 1 '見えている行の範囲を配列化する 可視行配列 = Split(シート.Cells.SpecialCells(xlCellTypeVisible).Address, ",") '各配列要素を順番に処理する For Each 可視行範囲 In 可視行配列 '範囲をコロンで区切り、開始位置と終了位置に分ける 行位置配列 = Split(可視行範囲, ":") '可視範囲の位置を求める 可視開始行 = Val(Mid(行位置配列(0), 2)) 可視終了行 = Val(Mid(行位置配列(1), 2)) '前回位置から可視開始行直前までは不可視 For 行 = 行 To 可視開始行 - 1 可視属性(行) = False Next '可視開始行~可視終了行までは可視 For 行 = 行 To 可視終了行 可視属性(行) = True Next '最終行を越えた場合はループを抜ける If 行 > 最終行 Then Exit For Next '戻り値を返す 行の可視属性応答 = 可視属性 End Function 使用例 Dim 可視 Dim 行 AS Long 可視 = 行の可視属性応答(ThisWorkbook.WorkSheets(1)) For 行 = 2 To 最終行 If 可視(行) Then メール送信 End If Next
お礼
ありがとうございます。 まだ私には難しいようです。 もう少し時間を掛けて確認させて頂きます。 今回は、NO.2の方のアドバイスを参考にさせて頂きました。
- nattocurry
- ベストアンサー率31% (587/1853)
オートフィルタで隠れている行は、Heightプロパティが0になっています。また、HiddenプロパティがTrueになっています。 どちらかのプロパティをチェックして、隠れているか表示されているかを判断して、隠れていると判断したら次の行に処理を移せば良いと思います。
お礼
ありがとうございます。
- DOUGLAS_
- ベストアンサー率74% (397/534)
#前のご質問で ベストアンサー にしていらっしゃるご回答でほぼイケるかと存じますが。。。 #そのまま流用させていただきました。 「MyC.Select」が imachan_net さんのご要望かと存じます。 Option Explicit Sub test() Dim MyR As Range Dim TargetRng As Range Dim MyC As Range '取り敢えずA列を Range オブジェクト に格納 Set MyR = Range(Range("A2"), Range("A2").End(xlDown)) 'MyR の中の 可視セル を TargetRng に格納 Set TargetRng = MyR.SpecialCells(xlCellTypeVisible) '可視行A列(TargetRng) を1つずつ選択 For Each MyC In TargetRng MyC.Select ここでメール送信作業 Next End Sub
お礼
ありがとうございます。 でも、これだとA列固定となってしまいます。
お礼
ありがとうございます。 私の説明の仕方がまだまずい部分があるようで、 今回の回答を頂いた中にも、 参考になる部分は有りますが、 そのまま採用させてもらうにはまだ・・・のようでした。 いくつか案を頂きましたが、 私自身、いろいろと参考にしながら、実際に動かしながら、 確認するのがまだVBAの理解能力なのです。 取り急ぎは、2つ目の案を参考に、 現在のコーディングに追加させて頂きました。 本当にありがとうございました。