[三流君] −−> [VBAで楽しく] −−> [バックナンバー一覧]
−−> No.109 Excel Selectionプロパティで選択範囲を処理する

Excel Selectionプロパティで選択範囲を処理する

今回は、
・Selectionで、選択範囲を参照する
・ActiveCellとSelectionの違い
・処理のタイミングについて
そんなお話です。

メルマガ発行内容

<Excel Selectionプロパティで選択範囲を処理する>

どうも、三流プログラマーのKen3です。 今回は、 メールでもらった質問、 現在選択中のセルについて、探ってみます。 いつものように、たいした解説、回答内容じゃないので、 暇つぶしに休み時間などに拾い読みしてください。

/* * 1.今回のキッカケ */

メールで下記の質問をもらいました。 ---- >エクセルで範囲を指定したところだけマクロを実行するにはどうすれば良いのですが >? >最近はMMの量(発行量)が多すぎて読むのに苦労しています。 >お手数ですがご教授をお願いします。---- ---- メルマガの量が多いのかぁ・・一回一回が薄いので、回数でカバーしてるんだけど、 回数が多いとうんざりする、そんな女性もいたりしてね(なんの話だよ・・?) たしかに、連続発行すると解除者が増えるんだよなぁ。 遠距離恋愛で2・3ヶ月に一度は困るけど、 毎日もうざい、そんな感じなんだろうなぁ? 会話でネタがツキナイヨウニいつも新鮮な話題を提供しないと。 ご教授?そんなレベルじゃないけど、今回も回答します。 ハヤク始めろって? いつもの前置き(前○)が長かったですね(謎?)

/* * 2.プログラムの中でタイミングを取れると楽 */

範囲指定した部分だけマクロの実行。 一番簡単なのは、プログラムの中でタイミングを取れると楽ですよね。 タイミングを取る? イベント起動型のプログラムとはいっても、 ~~~~~~~~~~~~~~~~~~~~~~~~~~ 個々のプログラムは上から下へ、 分岐したり、ループしたり、途中で抜ける、エラー処理に飛ぶ、 と プログラムを組んでます。 簡単なのは、範囲指定をプログラム中に組み込んでしまう方法。 No.102 Excel 範囲を選択して、カンマ区切りのファイルを作る http://www.ken3.org/backno/backno_vba21.html#102 で、作りかけなんだけど(最後まで出さないと体に悪いのに・・・?) プログラムの頭で(頭のタイミングで)、 Dim objTARGET As Range '選択されたセルの集合 Set objTARGET = Application.InputBox(prompt:="セルを選択", Type:=8) と、 Application.InputBox(prompt:="セルを選択", Type:=8) を使用して、セル範囲を選択させる。 で、 選択された範囲を 'テーブルデータを作成する Call MAKE_CSV_FILE(strFNAME, objTARGET) と、関数へ渡す。 For y = 1 To objHANI.Rows.Count '行のループ For x = 1 To objHANI.Columns.Count '列のループ で、ループを作り、データの書き出しを行っています。 処理の流れは簡単で、 1.プログラム Sub Mainが起動される 2.Application.InputBoxでセルを選択させる 3.選択範囲に対して、処理を行う と、ワンセットになってます。
Sub Main()

    'Application.InputBoxでセルを選択させる
    Dim objTARGET As Range '選択されたセルの集合
    Set objTARGET = Application.InputBox(prompt:="セルを選択", Type:=8)
    If IsEmpty(objTARGET) Then 'キャンセルが押されたかチェックする
        MsgBox "キャンセルが押されました"
        Exit Sub
    End If
    
    'ファイル名を作成 ファイル名は自分のパス+\test.html
    Dim strFNAME As String   'ファイル名保存用
    strFNAME = ThisWorkbook.Path & "\test.csv" 'ファイル名を作る

    'テーブルデータを作成する
    Call MAKE_CSV_FILE(strFNAME, objTARGET)

    'できたファイルをメモ帳で表示して確認する
    Shell "notepad.exe " & strFNAME '手抜きでShellで起動
    
    '終わりの挨拶
    MsgBox strFNAME & "を作成しました"
    
End Sub
Sub MAKE_CSV_FILE(strFNAME As String, objHANI As Range)

    'ファイルをオープンする
    Dim FNO      As Integer  'ファイル番号
    FNO = FreeFile '空いてるファイル番号を取出す
    Open strFNAME For Output As #FNO  'テキストファイルを新規作成

    '行、列でループを作る
    Dim y As Integer
    Dim x As Integer
    For y = 1 To objHANI.Rows.Count         '行のループ
        For x = 1 To objHANI.Columns.Count  '列のループ
            Print #FNO, objHANI.Cells(y, x).Value;
            Print #FNO, ",";
        Next x
        Print #FNO, ""  '改行のみ出力
    Next y

    'ファイルをクローズする
    Close #FNO

End Sub

/* * 3.範囲を選択してからプログラムを起動する */

何言ってるの?基本的な処理は同じだろ?と言われる人もいるかもしれませんが。 もう一つの操作方法として、 範囲を選択してから、各種プログラムを実行するパターンがあります。 どんな処理だよ、そんな処理無いよ? まぁまぁ、そんなに怒らないでよ。 セルをドラッグしてから(範囲を選択してから) ・右ボタンのコピーを押したりしてコピーしてるよね? ・範囲を選択してからBの太字の強調ボタン押してるよね? ・範囲を選択してからフォントの色、変更しているよね? それは、Excelの中だから?と言われるけど、 大きなワクの流れで言えば、 1.好きな範囲を選択する(対象を決める、顔、唇、○○○の範囲に手を持っていく) 2.その範囲に対してコピーのプログラム、太字の強調と処理が走る   (その範囲に対して、キス、なでる、○○、○○と動作が走る) チョット例題がおかしいけど(本や学校じゃ使わない、例題だけど) 範囲選択後、個々のプログラムが、その範囲に対して処理を行う。 簡単に言うと、 オブジェクト(対象)を選択してから、処理が走る。 そんなイメージです。 ※初めから↑って書けよ。 さてと、そんな処理を書きたい場合は、 選択されているオブジェクト(セル範囲)を知りたいですよね。 そんな時は、
Sub ボタン1_Click()
    Selection.Font.Bold = True
End Sub
と、 Selection プロパティ を使うことも出来ます。 下記、Excel2002のヘルプから引用 >Application オブジェクトでは、アクティブ ウィンドウで現在選択されている >オブジェクトを返します。Windows オブジェクトでは、指定されたウィンドウで >現在選択されているオブジェクトを返します。 > >解説 >Selection プロパティで返されるオブジェクトの種類は、何を選択するかによって >異なります。たとえば、セルを選択しているときは、Range オブジェクトが返されます >何も選択していないときは Nothing が返されます。 > >次の使用例は、シート 1 の選択範囲を消去します。選択しているのは、 >セル範囲であるものとします。 >Worksheets("Sheet1").Activate >Selection.Clear > >次の使用例は、選択しているオブジェクト型を表示します。 >Worksheets("Sheet1").Activate >MsgBox "選択されているオブジェクト型は" & TypeName(Selection) コッチのほうが、有名かもしれないのは、 ActiveCell プロパティ かな ~~~~~~~~~~ 私も今回気が付いたけど、 ヘルプを見ると気になる記述が書いてある、その気になる部分は、 >解説 >対象となるオブジェクトを指定しない場合は、 >アクティブ ウィンドウのアクティブ セルが返されます。 > >アクティブ セルと選択セル範囲を混同しないように注意してください。 えっ、混同するなって? >アクティブ セルは、現在の選択セル範囲内の単一セルを指します。 >選択セル範囲には、複数のセルが含まれる場合がありますが、 >アクティブ セルはその中の 1 つだけを指します。 何い?1つしか返さないの?オイオイ・・・ いままで、気が付かなかった(笑)、だから三流なんだって? 読者質問で1つ賢くなったよ。 下記、動作比較する、簡単なサンプルです。
Sub ボタン1_Click()
    MsgBox "ActiveCell.Addressは、" & ActiveCell.Address
    MsgBox "Selection.Addressは、" & Selection.Address
End Sub
両方の、.Addressプロパティを表示してみました。 結果は、こんな感じです。 .Addressのテスト結果↑ たしかに、 ActiveCell.Address は、単一のアドレス Selection.Address は、複数のアドレスだった。

/* * 4.あとは、Selection.に対して処理を行う */

さてと、方針が見えたら、あとは、Selection.に対して処理を行います。 今日は、少し丁寧に作ってみます。 普段は、 If TypeName(Selection) <> "Range" Then なんてチェック入れないけど(オイオイ) TypeName(Selection)で選択されたオブジェクトのタイプをチェックします。 グラフオブジェクトを選択して、処理が走るのを防止してます。 ※逆に、グラフを選択させて、処理を実行する、  そんな処理も作れるんだなぁと思いました。 で、Range型だったら、 For Each 〜 IN で、 For Each objRANGE In Selection.Cells と、選択されたセルを取り出しながら処理してます。 洒落た例題思いつかなかったので、 100以下なら赤、その他は青にフォントのカラーを変えてみました。
Sub ボタン1_Click()
    '選択範囲がRange型かチェックする
    'グラフを選択されていたりするのを防止したかったため
    If TypeName(Selection) <> "Range" Then
        MsgBox "変なとこ触るなよ、セルを選択してよ"
        Exit Sub   'Range以外は抜ける
    End If
    'テストで範囲の表示
    MsgBox "選択範囲は、" & Selection.Address
    'ループさせて処理を行う
    Dim objRANGE As Range
    For Each objRANGE In Selection.Cells
        If objRANGE.Value < 100 Then '数値が100以下なら
            objRANGE.Font.Color = RGB(&HFF, 0, 0) '赤にする
        Else
            objRANGE.Font.Color = RGB(0, 0, &HFF) '青にする
        End If
    Next

End Sub

/* * 5.終わりの挨拶 */

今回は、 ・Selectionで、選択範囲を参照する ・ActiveCellとSelectionの違い ・処理のタイミングについて そんなお話でした。 何かの参考となれば幸いです。 Excel/Access大好き、三流プログラマーKen3でした。

ページフッター リンクや広告、質問送信など

三流解説を読んでいただき、どうもです。ここから下は、三流君宛のメッセージ送信や 三流君のホームページの紹介・案内です
目的の情報が見つかったか?少々心配しつつ、、、※質問や感想は、気軽に送ってくださいね。

開発時によく使う操作: [F1を押してHELPを見る]/ [Debug.Print と イミディエイトウインドウ]/ [実行時エラーでデバッグ]/ [参照設定を行う]

仕様書(設計書?) XXXX書類: [基本設計書や要求仕様書]/ [テスト仕様書 テストデータ]/ [バグ票]/ [関数仕様書]/ [流れは 入力・処理・出力]

項目別に↓に人気の記事をまとめてみました。お探しのジャンルを選択してください。
人気記事(来場者が多いTOP3):
[VBAでIE,WebBrowserを操作]・・・VBAでIE,WebBrowserを操作する サンプルです
[Access から Excel 連携 CreateObject("Excel.Application")]・・・AccessからExcelを操作したりデータの書き出しなどです
[VBAでOutlookの操作 CreateObject("Outlook.Application" )]・・・VBAからOutlookを使い、メール関係を処理するサンプルです
↑上記3つみたいなCreateObjectで他のアプリケーションを操作するサンプルが人気です。

Excel関係:
[Excel UserFormを操作する]・・・エクセルでユーザーフォームを作成して入力などを行ってます
[ExcelからAccessを操作する]・・・ExcelからAccessのマクロを起動してみました、
[Excel関係 関数、その他]・・・その他Excel関係です

Access関係:
[Access UserForm/サブフォーム 操作]・・・アクセスでフォームを使ったサンプルです
[Access レポート操作]・・・レポートを操作してみました
[Access クエリーやその他関数]・・・あまりまとまってませんが、スポット的な単体関数の解説です

その他:VBAの共通関数やテキストファイルの操作など
[VBAでテキストファイル(TextFile)の操作]・・・普通のテキストファイルを使ったサンプルです
[VBA 標準関数関係とその他解説]・・・その他、グダグタ解説してます

Blog:[三流君の作業日記]/ [サンプルコードのゴミ箱]/ 広告-[通販人気商品の足跡]

質問や要望など メッセージを送る(三流君に連絡する)

三流プログラマーのKen3 が 皆さんの質問にお答えします
と カッコつけて言っても、実力不足ですべての質問に回答することはできないのが現実なのですが、できる範囲で 三流的な逃げ手 や 解決方法 を探します(回答します)。

感想や質問・要望・苦情など 三流君へメッセージを送る。
時間的余裕のある要望・質問・苦情の場合は、下記のフォームからメッセージを送ることができます。
あなたのお名前(ニックネーム):さん
返信は?: 不用(HP更新を待つ) , E-mail→ アドレス:に返事をもらいたい



(感想や質問・要望 メッセージはHPで記事に載せることがあります。)

急ぎで連絡がほしい、そんな時は:[三流君連絡先]に連絡してください。



[三流君(TOP ken3.org へ戻る)] / [VBA系TOPへ] / [VBA系バックナンバー目次へ移動]