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

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

【再質問】EXCEL(VBA)における次行遷移

いつもお世話になっています。 先日質問しましたが、 私の意図が十分に伝わらずに、やりたいことに対する回答が得られませんでした。 もう一度、質問させて下さい。 EXCELのVBAにて、 EXCELの明細行の各項目のデータにより、 メールを作成・表示して確認後に手作業でメールを送っています。 実際には、マクロを実行する毎に該当する行・項目のデータで、 作成したあとは、次の行の処理待ちとするようにカーソルを遷移させています。 ただ、ある項目でフィルターを掛けて、 該当のデータのみを次々とメールを送りたいのですが、 単純な次行遷移だと、 フィルターの掛かっていないデータ(行)を含めて、 遷移されますので、思いの通りとなりません。 マクロの記述は割愛します。 また、以前の質問をリンクします。 http://okwave.jp/qa/q6442441.html よろしくお願い致します。

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

  • ベストアンサー
  • 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列固定となってしまいます。

関連するQ&A

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

    いつもお世話になっています。 EXCELのVBAにて、 EXCELの明細行の各項目のデータにより、 メールを作成・表示して確認後に手作業でメールを送っています。 実際には、マクロを実行する毎に該当する行・項目のデータで、 作成したあとは、次の行の処理待ちとするようにカーソルを遷移させています。 ただ、ある項目でフィルターを掛けて、 該当のデータのみを次々とメールを送りたいのですが、 単純な次行遷移だと、 フィルターの掛かっていないデータ(行)を含めて、 遷移されますので、思いの通りとなりません。 どのようなVBAの修正をすれば可能なのでしょうか? (メール作成の部分の詳細は割愛しています) 教えて下さい。 よろしくお願い致します。 *** Sub DISPLAY() Dim i As Long i = ActiveCell.Row '### Outlookのオブジェクトを作成後、メールを新規作成する : : '### メールを送信前表示 myDATA.DISPLAY '### 次行へ遷移 Cells(i + 1, 1).Select End Sub ***

  • Excel VBA: オートフィルターの処理

    いつもお世話になります。 オートフィルターの処理をマクロでやれという指令がきました。具体的に言うと、 #|キー -+- 1|A<=カーソル位置 2|B 3|A 4|A 5|C 6|A 7|B のようなシートがあった場合、ツールバーのボタンをクリックするたびに #|キー -+- 1|A<=カーソル位置 =====隠れ 3|A 4|A =====隠れ 6|A ★ #|キー -+- =====隠れ 2|B<=カーソル位置 =====隠れ 7|B ★ #|キー -+- =====隠れ 5|C<=カーソル位置 =====隠れ のように遷移しなさいという問題です。 やっかいなのは、ボタンを押す間に別の作業が入る(同じマクロの連続実行の中で遷移させることができない。Excelを終了して(フィルター状態は保存)途中からやることもあることです。 最初は (1)フィルターがないときはカーソル位置のデータでフィルターする (2)フィルターがあるときは ((1))フィルターを解除する ((2))カーソル位置のキーを覚えておく ((3))下になめていって、覚えているのと違うキーが出てきたらその値でフィルターする みたいにしていたのですが、カーソル位置を常に見つかったのの中で先頭に戻しなさい、と言われたので、使えなくなってしまいました。(今ここです) キーの値のバリエーションを配列に入れて、言わば自前でフィルターを作ってやればいいのかもしれませんが、マクロを実行するたびに全データをスキャンすることになるので、遅くなると思います。 手動で「データ」=>「オートフィルタ」をやったときのフィルターの一覧を取り出して配列に入れることができれば一番いいと思うのですが、その方法が見出せませんでした。 ということで、 質問1:「データ」=>「オートフィルタ」をやったときのフィルターの一覧を取り出して配列に入れることはできるでしょうか 質問2:上の題意でどのようなプログラムが考えられるでしょうか 次は、同じ問題の発展形なのですが、  |キ|キ  |イ|イ #|1|2 -+---- 1|A|あ<=カーソル位置 2|B|あ 3|A|あ 4|A|い 5|C|い 6|A|い 7|B|う のようになったとき、ボタンを押すたびに、  |キ|キ  |イ|イ #|1|2 -+---- 1|A|あ<=カーソル位置 =====隠れ 3|A|あ =====隠れ ★  |キ|キ  |イ|イ #|1|2 -+---- =====隠れ 2|B|あ<=カーソル位置 =====隠れ ★  |キ|キ  |イ|イ #|1|2 -+---- =====隠れ 4|A|い<=カーソル位置 =====隠れ 6|A|い =====隠れ のように遷移しろというものですが、これもエレガントな書き方があるでしょうか。 一応キー1、キー2の値を配列にとって、キー1の個々の値でフィルターして、次にキー2の個々の値でフィルターする、ただし、キー1の値によってはありえないキー2の値でフィルターしてしまうかもしれないので気を付ける、というやり方は思いつくのですが・・・。 以上、よろしくお願いします。

  • Excelマクロの質問

    マクロについて質問があります。  数千行のデータがあるのですが、それを一番上から一番下にするときに、フォームで作ったボタンで一番下にもっていきたいのですが、どのように行ったらいいかわかりません。(フォームで作成までできたのですが…)  また、オートフィルタという機能がありますが、一度フィルタをかけるとものをリセットする(フィルタがかかっていない状態)マクロは組めないでしょうか? 分かりにくい質問ですが、分かる人がいましたらよろしくお願いします。

  • Excelで2行単位のソートの出来る方法があれば教えてください。

    Excelはとっても便利ですが、データの並び替え・フィルタ処理をするには、1行単位で行うようです。 項目が多い場合、1行単位でデータを記入すると横(若しくは縦)に相当広がり入力が大変不便です。 そこで2行単位で項目を設定して入力しますと約半分の長さになり、入力もしやすくなります。 そこでご質問ですが、このような2行単位でのデータの並び替え、又はフィルタを使う場合、1行単位でソートされてしまいデータがめちゃめちゃになってしまいます。 どなたか、もしExcelでデータの並び替え、又はフィルタを行う場合、2行単位で出来る方法をご存知でしたら教えて頂けないでしょうか。 当方、ちなみにExcelにおきましては、簡単なマクロ処理などを行う知識ぐらいです。 Excel VBA につきましては、ボタン等の設定程度です。 以上、よろしくお願いします。

  • ExcelのVBAで作りたいんです

    Excelのマクロで以下のようなものを作りたいのですが、調べても適当なものが見つからず、どのようなコードを書いたらいいのか分からないので有識者の方のお力をお貸しください。 Sheet1に検索ワードが入力された表を作成しておきます。(表自体は数十行程度で1列だけ) Sheet2にSheet1に書かれている検索ワードがあるかどうかを調べて、該当した場合にはその行を削除する。 もしくは別シートに移動する。 この作業をSheet1の検索ワード行数分自動で処理する。 Sheet2は数百行程度で複数列ありますが、検索ワードが該当さえすれば削除(移動)してしまって構いません。 また、話は変わりますがこのようなものも作りたいのです・・・。 CSVからの整形用マクロがあるのですが、整形処理が終了したら整形済みのシート(例としてSheet2~5)から1つのシートにまとめたい(Sheet1へ)と思っているのですが、データがどこまで入力されているか(Sheet2~5に)の判断と、Sheet1へのコピーでSheet1にどの行までデータが入っていてどの行から追加すればいいのかをお教えください。

  • エクセル2000で質問があります。

    エクセル2000で質問です。 あるデータが毎日メールに添付して送られてきます。 列は10列と決まっています。 1行目に項目が入っていて2行目から数行に渡ってデータが入っています。 日によって行数は異なります。 毎日それをコピー&ペーストして1ヶ月分のデータを作成しているのですが 何かルールを付ける事により自動で増やしていっていく方法は無いのでしょうか? もちろん昨日までの分はそのまま残った状態で増やしていきたいのです。 項目はすでに入っているので必要ありません。2行目以降のデータのみを 移すやり方ってないものでしょうか? たったそれくらいの作業は大して手間じゃないんだから毎日すれば! と言う声も聞こえてきそうですが・・・お許し下さい。

  • Excel BVA

    今晩は、いつもお世話になっています! 今回は、エクセルで500行以上の大量のデータの表があります。 そのデータを元に後程、色々な視点からグラフを作成したりするので、本来ならば、エクセルよりアクセスを使用すれば良いのかもしれませんが、エクセルで使用しています。 そこで、500行以上入力してあると、次行記入の際にスクロールさせるのも面倒で、全列記入してあれば Ctrl+End キーで最終行に移行できますが、記入しない列もあり、必ず記入する列は A1 の連番位です。 そこで、1行目辺りにボタンを作成し、そのボタンをクリックすると次行記入する頭の列に移行するようなマクロをボタンに登録したいと考えています。 ですが、本やネットで検索しても同様の目的がヒットせず、マクロはまだ自分でプログラムの作成は厳しいので、いつも本などに載っているプログラムをそっくり入力してやっている程度です。  そこで、すいませんが上記内容のプログラムが解かる方、もしくは同じ目的のホームページなどありましたら、お手数ですが教えて頂けたら・・・ と思います。宜しくお願いします。

  • 【マクロ】オートフィルター内の全データが削除される

    こんにちは、質問させていただきます。宜しくお願いします。 [エクセル] 2007 [内容] オートフィルタをかけ任意のデータのみ消したいのですが 全てのデータが消えてしまいます。 [詳細] A1~C5までデータが入っているのもだと仮定します。 (実際には項目があってフィルタがきちんとかかるものとします。)    A   B   C ----------------------- 1  ○   2個  \10 2  △   1個  \5 3  ×   3個  \15 4  ○   1個  \20 5  ○   4個  \5 オートフィルタをかけA列を基準として「○」を選択します。 そして選択した「○」を含む行(1行・4行・5行)を削除し 2行・3行目が残るようにしたいです。 その一連をマクロにして処理したいのですが… 1行から5行のすべての行データが削除されてしまいます。 <マクロ作成> マクロを記憶する。 ↓ 手動でオートフィルタをかけ、「○」を選択して行を削除 ↓ マクロの記憶を終了。 ↓ マクロ文の削除する行範囲をA1からC5に書き換え ↓ マクロ実行 <マクロ作成文>  Selection.AutoFilter Selection.AutoFilter Field:=1, Criteria1:="○" ActiveSheet.Range("A1:C5").Select Selection.Delete Shift:=xlUp ※エクセル2007のバージョンによっては選択した「○」のみ 削除されるPCもありましたので、何か設定があるのかな?と 思いましたが…解決しませんでした。 何か良い案があれば教えていただきたいです。 宜しくお願い致します。

  • エクセル・オートフィルタを使わず関数で抽出をするには

    excelのデータで、該当する項目のある行のみの抽出をオートフィルタもマクロも使用せずに、関数で行う方法があれば教えてください。     A B 1  桃太郎 123456 2  猿   122222 3  キジ  123555 4  桃太郎 122245    … 1000 桃太郎 002145 ↑このような表で「桃太郎」だけを抽出したいのです。 イメージとしては、ボックスに「桃太郎」と入力するだけで結果が一覧として出るようなものを作りたいのです。 さらにB列が昇順に並び替えされていると、なおよいのです。 随時更新するデータなので、その都度の最新の表が欲しいのです。 オートフィルタ→並べ替えをすれば簡単なのですが、エクセルを全く使えないような人がいる職場環境でして、教えるのが面倒というのとデータがぐちゃぐちゃになったら困るので、誰でも簡単にできる方法はないものかと考えています。 また環境的にマクロはあまり使いたくないのです。 よろしくお願いします。

  • Excelについて質問です。

    Excelについて質問です。 複数行にわたり、セル値を入力するのですが、1行に同じセル値が出てきた場合、2回目以降は自動で削除したい。(行がまたがる場合は削除の対象ではない。)ただし、セル値は決まった数ではなく行により数はランダムです。 マクロで作成するしか方法はないのかと思いますがマクロ作成方法が全く分かりません。 マクロ作成方法など教えていただければ幸いです。

専門家に質問してみよう