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

このQ&Aのポイント
  • EXCELのVBAにて、EXCELの明細行の各項目のデータにより、メールを作成・表示して確認後に手作業でメールを送っています。
  • マクロを実行する毎に該当する行・項目のデータで、次の行の処理待ちとするようにカーソルを遷移させています。
  • しかし、フィルターを掛けた場合でも、遷移される行にフィルターの影響を受けないため、望む結果を得ることができません。
回答を見る
  • ベストアンサー

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 ***

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

  • ベストアンサー
回答No.1

こんばんは。 フィルタは「オートフィルタ」ですか、それとも「フィルタオプション」ですか? 「オートフィルタ」だと思って回答します。 以下のコードはシートの1行目が項目行で、A列に0以上1以下のランダムな数値が入っており、 オートフィルタをかけて0.5より大きいものを取り出し、可視セル(フィルタで取り出された行)の アドレスをイミディエイト・ウィンドウに表示するものです。 ご要望のことは、可視セルの取り出しと、For Eachで解決するものと思われます。 Option Explicit Sub test() Dim WS As Worksheet Dim MyR As Range Dim TargetRng As Range Dim MyC As Range Set WS = ActiveSheet WS.AutoFilterMode = False Set MyR = WS.Range("A1").CurrentRegion MyR.AutoFilter Field:=1, Criteria1:=">0.5" Set TargetRng = MyR.Resize(MyR.Rows.Count - 1, 1).Offset(1).SpecialCells(xlCellTypeVisible) WS.AutoFilterMode = False For Each MyC In TargetRng Debug.Print MyC.Address Next End Sub

imachan_net
質問者

お礼

ありがとうございます。 私がやりたいのは、都度、フィルターを掛けても、 次の行への移動を有効にするやり方なのです。 お分かりでしょうか?

その他の回答 (1)

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.2

初歩的なことを、なぜ聞くの判らない。質問を誤解しているかもしれないが。 >### Outlookのオブジェクトを作成後、メールを新規作成する の方がよほど高等な技術ではないかな。この点と質問のレベルがアンバランスだと思うので。これはエクセルVBAのVBE画面で出来ますが、エクセルVBAといえるものはないでしょう。どちらかと言えばOutlookのVBAでしょう。 WEBのOutlookで送信する記事を丸ごとコピーしたのかな。 ーーー やり方として データ最終行を察知し、そこまで各行でメイル文くみたてと送信処理を繰り返す。 そのとき>ある項目でフィルターを掛けて、をするためにIF文で除外文に当たるか聞いて、該当の文は何もしないで次に行けば仕舞い。 「フィルタをかけて」、と難しくする必要は無いでしょう。 もちろんフィルタをかけて、見えている行だけを対象に処理を繰り返すコードも書けるが。 Sub test01() d = Range("A65536").End(xlUp).Row MsgBox d For i = 2 To d If Cells(i, "C") = "xx" Then '条件はC列がxxの場合送信しないという例 '何もしない Else 'メイル文作成、送信 MsgBox Cells(i, "A") 'テスト確認用 End If Next i End Sub ーー >次行遷移 と言う放言も大げさ。「次の行の処理に移る」で良い。

imachan_net
質問者

補足

私の説明不足で、質問の意図が十ニ分に伝わらなかったようです。 質問に対する回答でなく、私にとって難解なアドバイスを頂き、 大変に申し訳有りません。

関連するQ&A

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

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

  • 【Excel VBA】カンマ毎にデータを区切る

    はじめて質問をさせて頂きます。 Excel VBAは初心者です。 仕事で必要なため、本を読みながら考えておりましたが、 手も足も出ない状態です。 【質問内容】 Excel VBAにて、ExcelファイルのA列のみに格納されているデータを カンマ「,」の位置毎に区切ります。 ※格納されているデータ例:A,B,C,D,E Excelの区切り位置にて、カンマで区切る処理と同じです。 A1から処理を開始し、A列のデータがなくなるまで 上記の処理を行います。 下記のプログラムを実行すると、1行目は正常にカンマ毎に 区切られますが、2行目以降はカンマ毎に区切られず、 そのままの状態です。 どこに問題があり、どのように修正すれば良いのでしょうか、 ご教示頂けると助かります。宜しくお願いします。 【プログラム】 Sub カンマ毎に区切る() Dim mydata As String Dim myArray() As String Dim i, j As Integer j = 0 Do While Cells(j + 1, "A").Value <> "" mydata = Cells(j + 1, 1) myArray() = Split(mydata, ",") For i = 0 To UBound(myArray) Cells(1, i + 1).Value = myArray(i) Next j = j + 1 Loop End Sub

  • EXCELのVBAでのsortについて

    EXCELでVBAを使ってsortしているのですが 1行目が項目行にもかかわらずデータとみなされて 並び変えられてしまいます Header:=xlGuess としているのですが・・・ 条件指定していて 同じデータで並び順を変えてsortかけると そちらはきちんと項目行が判断されて 正しく並び変ります とても困っています どうかご指導下さい

  • Excel collectionについて VBA

    Dim Mydata As New Collection Dim i As Long Dim EndNumber As Long On Error Resume Next 'データを登録する間、エラーを無視する For i = 2 To EndNumber '2行目から最終行までチェック Mydata.Add Range("J" & i).Value, Range("J" & i).Value 'J列のデータ取得 Next i On Error GoTo 0 i = 1 For Each A In Mydata Worksheets("Sheet1").Range("A" & i).Value = A i = i + 1 Next A 現在見ているシートの重複しない項目を 別シートに書き込みしているプログラムになります。 様々なサイトを参考にさせて頂き、 上記のような結果になり、 文字列は取得できるようになりました。 しかし、もとになるデータがある位置に(例は、J列) 数値が入っていると上手くコレクションに入ってくれません。 J列に文字列(りんご、ごりらなど)が入っている場合は 重複しない項目がコレクションに格納されていきます。 J列に文字列(0,1)が入っていた場合、 重複しない項目もなにも無く、 ローカルのMydataの中には<変数無し>とありました。 このプログラムの何処を直せば、数値をコレクションとして取得できますか? ちなみに、EndNumberには最終行の数値が入っています。 >Mydata.Add Range("J" & i).Value, Range("J" & i).Value 'J列のデータ取得 .valueを.stringにしても効果はありませんでした。 回答よろしくお願いいたします。

  • excelマクロについて

    お世話になります。 下記のように間引きしたいのですが、 0.10.20.30,40,50.60→0.100.200 何故か80からスタートしてしまいます。 0.10.20.30,40,50.60→80.180.280 宜しくお願いします。 Sub test() Application.ScreenUpdating = False i = 1 '1行目の意味 mydata = Cells(i, 1) 'A列でデータが存在するか判定 Do Until mydata = "" '空白になるまで繰り返し処理 Rows(i).Resize(9).Delete '9行の削除 i = i + 1 mydata = Cells(i, 1) Loop Application.ScreenUpdating = True End Sub

  • エクセルVBAで

    エクセルのVBAのFor文のような繰り返し処理で、 for i = 1 to 最終行 のように、セルA1からデータが入力されている最終行まで繰り返すために最終行を求めたいのですがどうすれば良いでしょうか?

  • エクセルからOUTLOOKでメール送信:2

    ●前回下記の質問を書かせていただきました。 ---------- エクセルに複数件のデータを記載してあります。 A列 に メールアドレス B列 に 件名 C列 に 本文A D列 に 本文B があるときに連続してメールを立ち上げ送信したいです。 いろいろ試してみましたが全く動きませんでした。 お手隙の際にでもお教え下さい。 マクロのサンプルソースがあると助かります。 よろしくお願いいたします。 ---------------- ●下記の回答をいただきメールの送信までは出来ました。 ---------------- Sub ボタン1_Click() Dim myOLApp As Object ' Dim myDATA As MailItem '### OUTLOOKのオブジェクトを作成後、メールを新規作成する。 Set myOLApp = CreateObject("Outlook.Application") For i=2 To 5 Set myDATA = myOLApp.CreateItem(olMailItem) '### メールの宛先、題名、本文、添付ファイルを設定する。 '(宛先のアドレス) myDATA.to = Range("A" & i).Value ' myDATA.CC = Range("D33").Value myDATA.Subject = Range("B" & i).Value myDATA.Body = Range("C" & i).Value & CHAR(10) & Range("D" & i).Value '### メールを送信 myDATA.Send Next '### お約束の後始末。 Set myDATA = Nothing Set myOLApp = Nothing End Sub こんな感じでしょうか。 For i=2 To 5 と 2行目から5行目です。 うまくいくようでしたら For i=2 To Range("A" &Rows.Count).End(xlUp).Row とでも変更してください。 なんといっても失敗すると大変なリスクが発生するプログラムです。 十分に実験してから運用してください。 ------------------------ ●メール送信は問題なくできておりましたが、  他のCSVリストよりエクセルにデータを引っ張ってきて  メールの送信を使用とした所 システムエラーです 80004005 エラーを特定できません。 と言ったエラーが出てくるようになりました。 多分他のシートから引っ張ってくる関数がジャマをしているとは思うのですが、 何かこのエラーを回避する方法はございますでしょうか? お教え下さい。

  • エクセルワークシートからVBA自動作成の方法

    エクセル2007を使用しています。 エクセルワークシートからVBAを自動作成する方法を探しています。 添付のエクセルワークシート01の4行目以降を1行づつ処理し、以下のVBAを自動作成したいです。 〔作成希望VBA〕 Public Sub aaa() sample = (1111, 2222, 3333) test = A End Sub Public Sub bbb() sample = (4444, 5555, 6666) test = B End Sub Public Sub ccc() sample = (7777, 8888, 9999) test = C End Sub 以上よろしくお願いします。

  • エクセル2003 VBAで セル内を 一発呼び出し

    エクセル2003 オートフィルタではなく VBAで セル内を 一発呼び出ししたいので。  よろしく お願いします。 表 列A~E(結合2行) :商品名と内容   列H~K(結合2行) 住所氏名電話番号を記載してます。 1年分を オートフィルターで  氏名 や 商品名で 探すのは 結構 時間がかかります。 同じものが ほぼ少ないため。。。 そこで  たまに 同じ氏名  同じような 品を 検索する セルを 2個ほど作って  そこへ セル1へ 商品名を入力すると  該当する 行のみ 表示される。 セル2に 名前をを入力すると  該当する 行のみ 表示される。 また、セルを赤色に塗った部分の結合行(2~3行)を 赤色に塗りつぶした行のみ 表示も できれば うれしいです。 コマンドボタン等を使ってもいいので お願いします。 そんな VBAを 作っていただけませんでしょうか^^; お手数おかけしますが どなたか よろしく お願いします。 

  • EXCEL VBA 特定の行に色をつけたい

    お世話になります。田中と申します。 金額の差異チェックするシートがあります。A~Z列まで各項目があり行は可変です。 データはA2から始まります。 Z列に[結果]という項目があります。 この結果が"NG"の場合はその行全体の文字を赤に塗る処理をVBAで自動化したいのです。 現在は手動で[結果]列にオートフィルターをかけて該当行に色付けしているため結構手間がかかります。 理想はこのシートに[判定]というボタンをおいてボタンを押したら上記の処理が実施されると嬉しいです。 どなたまお知恵をお借りできますでしょうか。 よろしくお願い致します。 EXCEL2013