• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:【再質問】EXCEL(VBA)における次行遷移)

EXCEL(VBA)における次行遷移

このQ&Aのポイント
  • EXCELの明細行の各項目のデータによりメールを作成・表示し、手作業で送信するために、VBAを使用しています。
  • マクロを実行するたびに、該当する行・項目のデータでメールを作成し、次の行にカーソルを移動させています。
  • しかし、フィルターの掛かっていないデータも次の行に移動してしまうため、フィルターを掛けてメールを送信したい時に問題が発生します。

質問者が選んだベストアンサー

  • ベストアンサー
  • end-u
  • ベストアンサー率79% (496/625)
回答No.2

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さんの回答などは、サンプルの内容を理解して、 その応用をしてほしかったのではないですかね。

imachan_net
質問者

お礼

ありがとうございます。 私の説明の仕方がまだまずい部分があるようで、 今回の回答を頂いた中にも、 参考になる部分は有りますが、 そのまま採用させてもらうにはまだ・・・のようでした。 いくつか案を頂きましたが、 私自身、いろいろと参考にしながら、実際に動かしながら、 確認するのがまだVBAの理解能力なのです。 取り急ぎは、2つ目の案を参考に、 現在のコーディングに追加させて頂きました。 本当にありがとうございました。

その他の回答 (5)

  • DOUGLAS_
  • ベストアンサー率74% (397/534)
回答No.6

>マクロの記述は割愛します。  「以前の質問」の コーディング がそのまま使えるような コード にしなければなりませんかね。 '### 次行へ遷移 Cells(i + 1, 1).Select の次に、 While ActiveCell.EntireRow.Hidden: ActiveCell.Offset(1).Select: Wend を入れてお試しください。

noname#181803
noname#181803
回答No.5

フィルタかけたあと全コピして、別シートに貼り付け、貼り付けたシートでマクロ走らせてみては? 1つ手作業入っちゃうけれど、コード修正は必要ないと思われます。 ・・・などと思ったり。

imachan_net
質問者

お礼

ありがとうございます。 しかしながら・・・ 私だけで使うのではないので、 自動化出来る部分は自動化するのが狙いです。

  • nda23
  • ベストアンサー率54% (777/1415)
回答No.4

とりあえず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

imachan_net
質問者

お礼

ありがとうございます。 まだ私には難しいようです。 もう少し時間を掛けて確認させて頂きます。 今回は、NO.2の方のアドバイスを参考にさせて頂きました。

  • nattocurry
  • ベストアンサー率31% (587/1853)
回答No.3

オートフィルタで隠れている行は、Heightプロパティが0になっています。また、HiddenプロパティがTrueになっています。 どちらかのプロパティをチェックして、隠れているか表示されているかを判断して、隠れていると判断したら次の行に処理を移せば良いと思います。

imachan_net
質問者

お礼

ありがとうございます。

  • DOUGLAS_
  • ベストアンサー率74% (397/534)
回答No.1

#前のご質問で ベストアンサー にしていらっしゃるご回答でほぼイケるかと存じますが。。。 #そのまま流用させていただきました。 「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

imachan_net
質問者

お礼

ありがとうございます。 でも、これだとA列固定となってしまいます。