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

Excel 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でした。

フィードバック

VBA系の→[掲示板]←を覗く、質問を書き込む

評価・感想

No.109を読んだ満足度(評価)は?
5満足(参考になった)
4まぁまぁ(一部参考になった)
3普通(どちらとも言えない)
2なんかなぁ(期待と違った)
1不満(読んで損した気分)
作者に感想・質問を送る場合は下記に気軽に書いてください
あなたのお名前(ニックネーム) さん

作者からの返信は、 不用 E-mail で受信したい
*質問・感想はメルマガで紹介する場合があります

ページフッター(リンクや広告など)


[三流君(TOP ken3.org へ戻る)]
-- [VBA系TOPへ]
---- [VBA系バックナンバー目次へ移動]
------ [VBAでIEを操作 CreateObject("InternetExplorer.application")]・・・実は当店一番人気、VBAでIEを操作するサンプルです
------ [VBAでOutlookの操作 CreateObject("Outlook.Application")]・・・Outlookを使い、メール関係の処理です
------ [Access から Excel 連携 CreateObject("Excel.Application")]・・・人気のAccessからExcelへデータ書き出しなどです
------ [AccessのUserForm/サブフォームを操作]・・・アクセスでフォームを使ったサンプルです
------ [Accessのレポートを操作]・・・レポートを操作してみました
------ [Access クエリー関係やその他関数]・・・あまりまとまってませんが、スポット的な単体関数の解説です
------ [Excel UserForm(ユーザーフォーム)を操作する]・・・エクセルでユーザーフォームを作成して入力などを行ってます
------ [ExcelからAccessを操作する]・・・ExcelからAccessのマクロを起動してみました、
------ [Excel関係 関数、その他]・・・その他Excel関係です
------ [VBAでテキストファイル(*.txt,*.html,*.csv)の操作]・・・テキストファイルを使ったサンプルです
------ [VBA 標準関数関係とその他解説]・・・その他、グダグタ解説してます


広告
-- [通販系の売れ筋広告へ] ←主に楽天やAmazonのランキングです
blog
-- [三流君の作業日記] ← 日々の作業を少々
-- [通販あしあと] ← 通販ページの足跡を一覧で羅列

情報を探す

情報を探すならGoogleかな?

↓Web全体、サポート情報(support.microsoft.com)や三流君VBA(ken3.org)から検索する
Google
Web www.ken3.org
www.microsoft.com support.microsoft.com

あとは、項目別にMSでお勉強かな?
◆ マイクロソフト サイトの歩き方
◇ How-To インデックス
◇ FAQ インデックス
◇ スキルレベル別おすすめコンテンツ
◇ テクノロジ マップ
◇ テーマ別技術資料一覧

書籍の購入

Webだけじゃさすがに勉強しきれないので、プログラミング関係の書籍も読んでみては??

コンピュータ書籍の発送がハヤイ専門店

コンピュータの本・専門店
種類が豊富で探し易いです。※在庫ありが48時間以内発送が急ぎで資料や書籍がほしい時、とても助かります。
お奨め本の目次を見るだけでも勉強になったり

amazon.co.jpでキーワード別チェック

下記、私が設定したキーワードですが、こんな感じで資料や書籍を探ってみては?
[VBA全体を把握する] -- やはり全体をさらっと見たいですよね。
[SQL関連でDB力UP] -- システムはデータベース設計が重要
[ADO接続を探る] -- VBAなのでADO接続を押さえておく
[Windows APIを探る] -- さらにAPIになて知ってれば強力だ!
[.NETを探る] -- と言っても時代は.NETに流れてるし
プログラミング以外でも知りたいことは多くって、
[人間関係] -- で、客先・上司、まわりに気を使い。
[プログラマーの自己啓発] -- プログラムだけじゃなくいろいろと向上したいよ
[コーチング・育成] -- 先輩になったら後輩(部下)の面倒をみてね。
そんなこんなでプログラマーっていろいろと大変なんだってば・・・