Internet Start Page  TOP  
 Road of Developers
 
 

Visual Basic Aplications for Excel



******************************************************************************* Visual Basic Aplications for Excel Excelをある程度使いこなせるようになると、次のステップとして作成した表を効率よ く使いたいという要求が出てくるのではないでしょうか? 例えば、次のような事が可能になれば、表は非常に使いやすいものになります。 その上、Excelの操作に慣れていない初心者でも、簡単に扱うことが可能になります。 ファイルを開くと、処理に必要なメニューが表示される。 ワンタッチで新規データ入力位置がアクティブになる。 検索文字を入力するだけで検索が実行される。 ワンタッチで、いろいろな集計ができる。 ワンタッチで、グラフが表示される。 これらの事を可能にするのがマクロです。 マクロとは繰り返して利用する一連の操作を登録しておいて、必要なときに呼び出して 実行させる機能のことをいいます。 マクロは操作の手順を登録した一種のプログラムですのでプログラム言語で書かれています。 多くのアプリケーションソフトは独自のマクロをサポートし、独自のプログラム言語を 使っています。 Excelの場合、VBAといわれています。 現在VBAをサポートしているのはExcelとAccessだけです。l ******************************************************************************* VBAでできること VBAマクロでなにができるか? という問いは、Excelの操作をどこまで自動化出来るかという問いと同じです。 この問いに対しては、キーボードやマウスで行える操作は全て自動化(マクロ化) できると答えられると思います。 さらに条件分岐、ループ、メッセージの表示や文字などの入力、変数等を使う事により より高度な自動化・システム化を実現することが可能となります。 ****************************************************************************** マクロ記録機能の使用 Excelにはキーボードやマウスで行った操作をマクロとして記録するマクロ記録が あります。マクロ記録機能を使うと、キーやマウスの操作に対応した一連の命令文 (スタートメント)がVisual Basicのコード(マクロの内容を記述した単語や記号) として作成されるので、VBAの文法に詳しくなくてもある程度のVBAマクロを作成する ことが出来ます。 従って、VBAマクロを作成する手順としては、マクロ記録機能が使えるところは、 それを使ってマクロの骨格をまず作成し、ついで、自動作成されたマクロを修正する ことで目的のマクロを得る。というのがもっとも効率的な方法といえるでしょう。 第一段階の「マクロ記録機能によるマクロの作成」はVBAマクロの初心者でも簡単に 実行できますが、第二段階の「自動作成されたマクロを修正」では次の知識が必要と なります。 ******************************************************************************* ステートメントの冗長な部分を修正する知識 例えばセルA1のフォントのスタイルを「太字」にサイズを「24」に変更する場合の マクロは次のようになります。 Sub EX() Range("A1").Select With Selection. Font .FontStyle="太字" .Size=24 End With End Sub これをマクロ記録機能を使って作成した場合は次のようになり、初期設定されている 部分(注釈の部分)もコード化されてしまいます。マクロの実行には直接差し支え ありませんが、マクロが長くなるので実効速度に影響を与えます。 どのコードが無駄なのかを把握する必要があります。 Sub EX() Range("A1").Select .Name="MSPゴシック" 'フォント名はMSPゴシック .Size=24 .Strikethrough=False '取消線を付けない .Superscript '上付でない .Subscript=False '下付でない .OutlineFont=False 'アウトラインフォントではない .Shadow=False '影付きでない .Underline=xlNone 'アンダーラインなし .ColorIndex=xlNone '色は自動設定 End With End Sub A1の部分を選択していましたが、Range("A1").Selectを削除するとアクティブセルにあ る文字を設定した用に変化させることができます。 ******************************************************************************* VBAマクロの構成要素 VBAマクロは「モジュール(Module)シート」に記述します。 マクロ記録機能を実行すると、モジュールシートが自動的に作成され、 そのモジュールシートにマクロは自動的に記述されます。 VBAマクロを構成する主な要素は次の通りです。 '抽出マクロ コメント 'マクロ記録日 1996/9/28 Sub 抽出() 'プロシージャ名 プロシージャの始め Dim DENSAKU as String '変数・定数の宣言 Const FLDas Integer=4 KENSAKU="東京*" 'ステートメントの始め Sheets("住所録") .Select Application.Goto Reference:="住所録リスト" Selection.AutoFilter Field: = FLD,Criteria1: =KENSAKU End Sub 'プロシージャの終わり ******************************************************************************* プロシージャ VBAのマクロはプロシージャを単位として構成されます。 VBAのおける主要なプロシージャは、SubプロシージャとFunctionプロシージャです。 Functionプロシージャは特定の処理を実行して値を返すのに対して、Subプロシージャは 値を返しません。 Subプロシージャは「Subマクロ名()」ステートメントで始まり、 「EndSub」ステートメントで終わります。この2つのステートメントに挟まれた ステートメントがマクロの本体となります。 Sub マクロ名() マクロ本体 End Sub ******************************************************************************* ステートメント ステートメントは、Excelに操作を実行させるための命令文です。 ステートメントは、キーワード、演算子、変数、プロシージャ呼び出しの組み合わせで 構成されます。 ステートメントの書き方 1 行の先頭から改行するまでの1行が1つのステートメント 2 1つのステートメントを複数の行にわたって記述する場合は行継続文字 「 _」(半角のスペースとアンダースコア)を使う 3 「'」で始まる行はコメント行。Excelはこの行を無視する。 4 大文字小文字は、区別しない。 5 マクロ本体では次のようなステートメントを使うことが出来る。 コメント行 変数の宣言 変数への代入 オブジェクトのプロパティに値を設定 オブジェクトのプロパティの値を取得 オブジェクトにメソッドを実行 画面にメッセージを表示するMsgBox関数 キーボードからデータを入力するInputBox関数 条件式を使ってマクロの流れを変える。(条件分岐) 命令の繰り返し ******************************************************************************* 'サンプルマクロ コメント行 Sub Sample() Dim SUM As Integer '変数の宣言 Range("A1").Clear 'オブジェクトにメソッドを実行 SUM = Range("A1") 'オブジェクトのプロパティの値を取得 KAISUU = InputBox("数字を入力して下さい。") 'InputBox関数 If KAISUU <> 0 Then '条件分岐 For I = 0 To KAISUU '命令の繰り返し SUM = SUM + I '変数への代入 Next I End If Range("A1") = SUM 'オブジェクトプロパティに値を設定 MsgBox ("終了しました") 'MsgBox関数 End Sub ******************************************************************************* 条件分岐のステートメント マクロは、基本的には命令を上から下に向かって順に実行します。 しかしこれだけではあらゆる処理に対応することは出来ません。 条件によって処理の流れを変えたり(条件分岐)繰り返し処理をしなければならない 事もあります。 条件分岐のステートメントには、次の4種類があります。 If-Then If-Then-Else If-Then-ElseIf SelectCase ******************************************************************************* If-Thenステートメント If-ThenステートメントはIfで設定した条件が満たされている場合にThen以下のステート メントを実行するものです。 statementblockではいくつでもステートメントを記述できます。 End IfはStatementblockが1行の場合は省略可能です。 If condition Then statementblock End If 下のマクロはキーボードからの2つの数を入力し、2つの数の差の絶対値を計算する マクロです。 '条件分岐(If Then) Sub BUNKI2() A = InputBox("Aの値を入力して下さい。") B = InputBox("Bの値を入力して下さい。") SA = A - B If SA < 0 Then SA = -SA MsgBox "A-Bの絶対値は" & SA & "です。" End Sub ************************************************ If-Then-Else ステートメント If-Then-Elseステートメントは、条件によって、複数の処理の中の1つを選んで 実行します。 Ifで設定した条件が満たされている場合は「Then」以下のStatementblock_1を実行し ます。 そうでなければ「Else」以下の「statementblock_2」を実行します。 If condtion Then statementblock_1 Else statementblock_2 End If ************************************************ サンプルマクロ '条件分岐(If-Then-Else)偶数、奇数の判定 Sub BUNKI3() SUU = Int(Rnd() * 10) AMARI = SUU - 2 * Int(SUU / 2) ANS = InputBox("偶数と思う場合は0を、奇数と思う場合は1を入力して下さい") ANS = ANS + 0 If ANS = AMARI Then MsgBox "値は " & SUU & " なので当たりです" Else MsgBox "値は " & SUU & " なのではずれです" End If End Sub ************************************************ 説明 1 0から10までの乱数を発生させ、変数SUUに代入 2 変数SUUを2で割ったあまりを、変数AMARIに代入 3 キーボードから0または1を入力させ、変数ANSに代入 4 変数ANSを整数型に 5 変数ANSとAMARIが等しい場合は、"当たりです"を実行 6 等しくない場合は"はずれです"を実行 ******************************************************************************* If-Then-ElseIfステートメント If-Then-ElseIfステートメントは条件によって、複数の処理の中から1つを選び、 さらに複数の条件の中から1つを選んで実行します。 condition_1が満たされている場合は、statementblock_1を実行し、そうでなければ、 condition_2を評価し、満たされている場合は、statementblock_2を実行します。 全ての条件が満たされていない場合はstatementblock_nを実行します。 If condition_1 Then statementblock_1 ElseIf condition_2 Then statementblock_2 Else statementblock_n End If ****************************************************** サンプルマクロ '条件分岐(If-Then-ElseIf) Sub BUNKI4() A = 10 B = 3 SYORI = InputBox("処理番号(1-4)を入力して下さい") If SYORI = 1 Then WA = A + B MsgBox"A足すBは "& WA &" です" ElseIf SYORI = 2 Then SA = A - B MsgBox"A引くBは "& SA &" です" ElseIf SYORI = 3 Then SEKI=A * B MsgBox"A割るBは "& SEKI &" です" ElseIf SYORI = 4 Then SYOU = A / B MsgBox"A割るBは "& SYOU &" です" Else MsgBox"処理番号が正しくありません" EndIf End Sub *****************************************************: 説明 キーボードから1−4のいずれかの数字を入力 A=10 B=3 変数SYORIが1の場合は、 WA = A + B と MsgBox"A足すBは "& WA &" です"を実行 変数SYORIが1でなく2の場合は SA = A - B と MsgBox"A引くBは "& SA &" です"を実行 変数SYORIが1でも2でもなく3の場合は SEKI=A * B と MsgBox"A割るBは "& SEKI &" です"を実行 変数SYORIが1−3でなく4の場合は SYOU=A / B と MsgBox"A割るBは "& SYOU &" です"を実行 変数SYORIが1−4のいずれでもない場合は、 MsgBox"処理番号が正しくありません"を実行 ******************************************************************************* Select Caseステートメント Select Caseステートメントは条件式の値を複数の値と比較するときに使います。 Select Case構造は、構造の先頭(Selet Case節)に書かれた式を評価し、その値と一致 するCase節があればそれに続くステートメントを次のCase節の直前まで実行します。 Select Case testexpression Case Expressionlist_1 statementblock_1 Case expressiolist_2 statementblock_2 Case Else statementblock_n End Select expressionlist 1つ以上の数式または文字列を指定する statementblock 複数のステートメントを記述できる。 Caseの後にステートメントがなければ、End Selectの後まで ジャンプ。 複数の条件式と一致するときは最初に一致したCase節に 続くステートメントのみが実行される Case Else 条件式がどのCase節のexpressionlistとも一致しない時に実 行される *****************************************************************************: サンプルマクロ '条件分岐(Select Case) Sub BUNKI5() A = 10 B = 3 SYORI = InputBox("処理番号(1-4)を入力して下さい") Select Case SYORI Case 1 WA = A + B MsgBox "A足すBは " & WA & "です" Case 2 SA = A - B MsgBox "A足すBは " & SA & "です" Case 3 SEKI = A * B MsgBox "A足すBは " & SEKI & "です" Case 4 SYOU = A / B MsgBox "A割るBは " & SYOU & "です" Case Else MsgBox "処理番号がが正しくありません" End Select End Sub ******************************************************************************* If-Then-ElseIfステートメントを使ったサンプルマクロをSelect Caseステートメントを 使って書き直したものです。 Select Caseステートメントを使った方がマクロがすっきりしている事が解ると 思います。 ******************************************************************************* 繰り返し処理のステートメント Do Loopステートメント Do Loopステートメントは回数を指定しないでステートメントブロックの実行を繰り返す 時に使います。 次の4種類あります。 Do Whie-Loop Do-Loop While Do Until-Loop Do Loop-Until ******************************************** Do While-Loop 条件(condition)が満たされている間、statementsを繰り返します。ループの実行前に 条件を評価するのでconditionが最初から満たされていない(False)の場合はループ内の statementsは一度も実行されません。 Do While condition statements Loop condition 数値や条件式を指定する。数値や条件式が「0」の時は「False」 「0」以外の時は「True」と評価される statements conditionが「False」になる時のステートメントを必ず記述する必要 がある。無限ループに注意 ******************************************************************** サンプルマクロ '繰り返し(Do While-Loop) Sub HANPUKU1() KAISUU = 0 SUU = 0 Do While SUU <> 5 SUU = Int(Rnd() * 10) KAISUU = KAISUU + 1 Loop MsgBox KAISUU & " 回目で5が出ました" End Sub ******************************************** Do-Loop While ループ内のstatementsを実行した後で条件(condition)を評価します。ループの実行後に 条件を評価するのでstatementsが少なくとも1回は実行されます。 Do statements Loop While condition ********************************************* サンプルマクロ '繰り返し(Do-Loop While) Sub HANPUKU2() KAISUU = 0 Do SUU = Int (Rnd() * 10) KAISUU = KAISUU + 1 Loop While SUU <> 5 MsgBox KAISUU &" 回目で5が出ました" End Sub ********************************************* Do Until-Loop 条件が満たされていない(False)間、statementsを繰り返し実行します。 満たされている(True)の場合はループは1度も実行されません。 Do Until condition statements Loop ******************************************* サンプルマクロ '繰り返し(Do Until-Loop) Sub HANPUKU3() KAISUU = 0 SUU = 0 Do Until SUU = 5 SUU = Int ( Rnd () * 10) KAISUU = KAISUU + 1 Loop MsgBox KAISUU & " 回目で5が出ました" End Sub ************************************************ Do -Loop-Until 条件(condtin)が満たされていない(False)間、statementsを繰り返し実行します。 ループは少なくとも1回は実行されます。 Do statements Loop Until condition *********************************************** サンプルマクロ '繰り返し(Do-Loop Until) Sub HANPUKU4() KAISUU = 0 Do SUU = Int (Rnd () * 10 ) KAISUU = KAISUU + 1 Loop Until SUU = 5 MsgBox KAISUU &" 回目で5が出ました" End Sub ****************************************************************************** For Nextステートメント statementsを実行する回数があらかじめ解っている時に使います。 For counter = start To end [Step increment] statements Next [counter] counter カウンタ変数。ループを何回繰り返したかを示す値を格納する start カウンタ変数の初期値を指定する end カウンタ変数の最終地を指定する increment ループを繰り返すごとに加算されていく値を指定する statements ループ内で実行するステートメントを記述する *******************************************  '繰り返し(For Next) Sub HANPUKU5() Sheets("Sheet1").Select For l = 1 To 12 Range("A1").Value = l & "月" MsgBox l & " 回目のループ終了" Next l End Sub ******************************************************************************* メッセージの表示 画面にメッセージを表示したい場合は、出力用ダイアログボックスを表示するMsgBox() という関数を使います。 MsgBox()関数はマクロ記録機能では作成することは出来ませんので、その使い方につい てそれなりの知識を持っておく必要があります。 MsgBox(prompt,buttons,titile,helpfile,context) prompt ダイアログボックス内にメッセージとして表示させる文字列を指定 buttons ダイアログボックス内に表示させるボタンの種類と個数 アイコンの種類 標準ボタンの指定・モーダルの指定を組み込み定数 又は数値で指定 title ダイアログボックスのタイトルバーに表示させる文字列を指定 helpfile 使用するヘルプファイルの名前を指定 context ヘルプトピックに指定したコンテキストIDを表す数式を指定 OKボタンのみ 0 vbOKOnly OK,キャンセル 1 vbOKCancel 中止、再試行、無視 2 vbAbortRetrylgnore はい、いいえ、キャンセル 3 vbYesNoCancel はい、いいえ、 4 vbYesNo 再試行、キャンセル 5 vbRetryCancel 警告アイコン (X) 16 vbCritical 問い合わせアイコン (?) 32 vbQuestion 注意アイコン (!) 48 vbExclamation 情報アイコン (i) 64 vbInfomatin }*******************************************************************: マクロサンプル '終了の確認 Sub Massage() KAISUU = 0 SUU = 0 Do Until SUU = 5 SUU = Int(Rnd() * 10) KAISUU = KAISUU + 1 Loop MsgBox KAISUU & " 回目で5が出ました" MsgBox "終了しますか?", 32 [終了の確認] End Sub ********************************************************************** マクロサンプル 'よろしいですか? Sub Massage2() KAISUU = 0 SUU = 0 Do Until SUU = 5 SUU = Int(Rnd() * 10) KAISUU = KAISUU + 1 Loop MsgBox KAISUU & " 回目で5が出ました" MsgBox "よろしいですか?",vbQuestion [よろしいですか?] End Sub ********************************************************************* マクロサンプル 'よろしいですか?2 Sub Massage3() KAISUU = 0 SUU = 0 Do Until SUU = 5 SUU = Int(Rnd() * 10) KAISUU = KAISUU + 1 Loop MsgBox KAISUU & " 回目で5が出ました" MsgBox "よろしいですか?", vbOKCancel + vbQuestion [よろしいですか?] End Sub ******************************************************************************* データ入力とマクロの作成 マクロ機能を効率的に使うために、住所録にデータを入力しながら、それと平行して マクロを作成することにします。 シート見出し 住所録 A1 住所録 A3 =COUNTA(a6:a14) B3 レコード数 A5:K11 罫線で囲って下さい。 **罫線で囲まれた表に名前を付けます。 **挿入ー名前ー定義で住所録リストにします。 列 A5 番号 B5 名前 C5 ふりがな D5 住所1 E5 住所2 F5 郵便番号 G5 メモ H5 電話番号 I5 キー1 J5 キー2 K5 更新日 ************************************************ マクロ1 新規入力用の作成 既に入力済みの行を飛ばして未入力行にジャンプし、番号欄に連番を入力しアクティブ セルを名前欄に移動するマクロを作成します。 まずは1行目に1件目のレコードを入力します。 更新日まで入力が終わったら・・・・ ツールメニューをクリックして「マクロの記録」ー「新規作成マクロの記録」を クリックします。 「新規マクロの記録」ダイアログボックスが表示されます。 「マクロ名」欄に「新規入力用」「説明」欄に「未入力行にジャンプ」し、「番号」に 「連番を入力」と入力し、OKボタンをクリックします。 ここから先の操作がマクロとして記録されます。正確に操作して下さい。 1 シート見出し「住所録」をクリックします。 2 新しいレコード(2件目)の番号のセルをクリックします。 3 番号(ここでは「2」)を入力します。 4 隣の名前の欄をクリックします。 5 ツールバーの「マクロの終了」ボタンをクリックします。 マクロが作成されます。 シートに「Mocule1」が作成されます。 ************************************************************ 'マクロ1(新規入力用) ' '新規入力用マクロ '未入力行にジャンプして「番号」に連番を入力 ' Sub 新規入力用() ' ' 新規入力用 Macro ' 未入力行にジャンプし「番号」を連番に入力 ' ' Keyboard Shortcut: Ctrl+a ' Sheets("住所録").Select Range("A7").Select ActiveCell.FormulaR1C1 = "2" Range("B7").Select End Sub ************************************************************ さて作成したマクロ1は 特定のセル(A7)に特定の値(2)を入力するものです。 これを任意のセルに任意の値を入力するマクロにするために修正します。 考え方は セルA3の内容を変数に代入 変数に6を加える 記入行の「番号」「名前」欄のセル番地を計算 です。 *********************************************************** 修正したマクロ1(新規入力用) Sub 新規入力用() ' ' 新規入力用 Macro ' 未入力行にジャンプし「番号」を連番に入力 ' ' Keyboard Shortcut: Ctrl+a ' Sheets("住所録").Select SUU = Range("A3").Value GYOU = SUU + 6 RENBAN = SUU + 1 BANCHIA = "A" & GYOU BANCHIB = "B" & GYOU Range(BANCHIA).Select ActiveCell.FormulaR1C1 = RENBAN Range(BANCHIB).Select End Sub ************************************************************ 説明 Sheets("住所録").Select SUU = Range("A3").Value セルA3の値(現在は「2」)を現在のレコード数を示す偏す「SUU」に代入する GYOU = SUU + 6 入力行を示す変数「GYOU」に「SUU + 6」を代入する 「GYOU」の値は「8」となる RENBAN = SUU + 1 番号を示す変数「RENBAN」に「SUU + 6」を代入する GYOUの値は3になる。 BANCHIA = "A" & GYOU 文字Aと変数GYOUを連結し、番号列のセル番地を示す変数BNCHIAに代入する BANCHIAの値はA8となる。&は&演算子と呼ばれ文字列との間にはスペースを 入れる BANCHIB = "B" & GYOU 文字Bと変数GYOUを連結し、名前欄のセル番地を示す変数BANCHIBに代入する BANCHIBの値はB8となる Range(BANCHIA).Select BANCHIAのセルが選択される ActiveCell.FormulaR1C1 = RENBAN 選択したセルに変数RENBANの内容を入れる Range(BANCHIB).Select BANCHIBのセルを選択する End Sub **********************************************************:: 修正前と修正後を見比べてみて下さい。 ********************************************************** 修正前 'マクロ1(新規入力用) ' '新規入力用マクロ '未入力行にジャンプして「番号」に連番を入力 ' Sub 新規入力用() ' ' 新規入力用 Macro ' 未入力行にジャンプし「番号」を連番に入力 ' ' Keyboard Shortcut: Ctrl+a ' Sheets("住所録").Select Range("A7").Select ActiveCell.FormulaR1C1 = "2" Range("B7").Select End Sub **************************************************** 修正したマクロ1(新規入力用) Sub 新規入力用() ' ' 新規入力用 Macro ' 未入力行にジャンプし「番号」を連番に入力 ' ' Keyboard Shortcut: Ctrl+a ' Sheets("住所録").Select SUU = Range("A3").Value 'まずレコード数をSUUに代入 GYOU = SUU + 6 'SUUの値に6を加えそれをGYOUとする RENBAN = SUU + 1 'SUUの値に1を加えたものをRENBANとする BANCHIA = "A" & GYOU '文字AとGYOUを連結してA8を示す BANCHIB = "B" & GYOU '文字BとGYOUを連結してB8を示す Range(BANCHIA).Select 'BANCHIAを示す ActiveCell.FormulaR1C1 = RENBAN '選択したセルに変数RENBANの内容を入れる Range(BANCHIB).Select 'BANCHIBを示す End Sub ****************************************************************************** マクロ2(行挿入)の作成 次に行を10行増やすマクロを作成します。このマクロは記入行の残りが少なくなった ら実行します。 マクロの記録準備をします。 ツールメニューのマクロの記録ー新規マクロの記録をクリックする 新規マクロを記録ダイアログボックスでマクロ名に「行挿入」 説明欄に「行を10行分挿入する」と入力してOKボタンをクリックします。 マクロの記録が開始されます。 これからの操作を正確に実行して下さい。 1 シート見出し「住所録」をクリックします。 2 行番号「11」をクリックし、行番号「20」までドラッグします。 3 挿入メニューの行をクリックします。 4 行が10行挿入されます。セルA11をクリックして下さい。 5 マクロの記録を終了します。 ********************************************************** Sub マクロ1新規入力用() ' ' 新規入力用 Macro ' 未入力行にジャンプし「番号」を連番に入力 ' ' Keyboard Shortcut: Ctrl+a ' Sheets("住所録").Select SUU = Range("A3").Value GYOU = SUU + 6 RENBAN = SUU + 1 BANCHIA = "A" & GYOU BANCHIB = "B" & GYOU Range(BANCHIA).Select ActiveCell.FormulaR1C1 = RENBAN Range(BANCHIB).Select End Sub Sub マクロ2行挿入() ' ' 行挿入 Macro ' 行を10行分挿入する ' ' Keyboard Shortcut: Ctrl+s ' Sheets("住所録").Select Range("A11:K20").Select Selection.EntireRow.Insert Range("A11").Select End Sub **********************************************:: マクロ2の修正 さて先ほどと同じようにマクロ機能で作成したマクロ2は特定の行に対して特定の 行数だけ行挿入を実行します。これを未記入行の先頭に対して行挿入が実行できるよう にするために、修正を加えます。 考え方としては セルA3の内容を変数に代入 変数に6を加える 挿入先頭行の行番号に9を加える 挿入先頭行と最終行の行番号と「:」を連結 行を挿入 ************************************************************** 修正したマクロ Sub マクロ1新規入力用() ' ' 新規入力用 Macro ' 未入力行にジャンプし「番号」を連番に入力 ' ' Keyboard Shortcut: Ctrl+a ' Sheets("住所録").Select SUU = Range("A3").Value GYOU = SUU + 6 RENBAN = SUU + 1 BANCHIA = "A" & GYOU BANCHIB = "B" & GYOU Range(BANCHIA).Select ActiveCell.FormulaR1C1 = RENBAN Range(BANCHIB).Select End Sub Sub マクロ2行挿入() ' Keyboard Shortcut: Ctrl+b Sheets("住所録").Select SUU = Range("A3").Value GYOUBEG = SUU + 6 GYOUEND = GYOUBEG + 9 GYOUHANI = GYOUBEG & ":" & GYOUEND Rows(GYOUHANI).Select Selection.Insert Shift:=xlDown BANCHIA = "A" & GYOUBEG Range(BANCHIA).Select End Sub ***************************************************** では 修正前と見比べてみましょう ****************************************************************************** マクロ3と4の作成 列を非表示にするマクロ(マクロ3)と 非表示を解除するマクロ(マクロ4)を作成します。 マクロ3の作成 住所録の右半分を見たいときに使用するマクロを作成します。 このマクロは「ふりがな」〜「電話番号」欄(C〜G列)までを非表示にします。 マクロを記録する準備をします。 ツールメニューのマクロの記録ー新規マクロの記録をクリックします。 新規マクロを記録ダイアログボックスで「マクロ名」欄に列非表示、 「説明」欄にC〜G列を非表示にすると入力してOKボタンをクリックします。 マクロ記録が開始されます。 シート見出し「住所録」をクリックします。 C列〜G列の列番号をドラッグして範囲指定します。 マウスを右クリックし、ショートカットメニューの「表示しない」をクリックします。 C列〜G列が非表示になります。セルA5をクリックして下さい。 マクロ記録を終了します。 作成されたマクロを見る ****************************************************** Sub マクロ1新規入力用() ' ' 新規入力用 Macro ' 未入力行にジャンプし「番号」を連番に入力 ' ' Keyboard Shortcut: Ctrl+a ' Sheets("住所録").Select SUU = Range("A3").Value GYOU = SUU + 6 RENBAN = SUU + 1 BANCHIA = "A" & GYOU BANCHIB = "B" & GYOU Range(BANCHIA).Select ActiveCell.FormulaR1C1 = RENBAN Range(BANCHIB).Select End Sub Sub マクロ2行挿入() ' Keyboard Shortcut: Ctrl+b Sheets("住所録").Select SUU = Range("A3").Value GYOUBEG = SUU + 6 GYOUEND = GYOUBEG + 9 GYOUHANI = GYOUBEG & ":" & GYOUEND Rows(GYOUHANI).Select Selection.Insert Shift:=xlDown BANCHIA = "A" & GYOUBEG Range(BANCHIA).Select End Sub Sub 列非表示() ' ' 列非表示 Macro ' C〜G列を非表示にする ' Keyboard Shortcut: Ctrl+c ' Sheets("住所録").Select Columns("C:G").Select Selection.EntireColumn.Hidden = True Range("A5").Select End Sub ******************************************************* 説明 True 行又は列を非表示 False 行又は列を表示 マクロ4(列再表示)の作成 マクロ3を解除するときに使用するマクロを作成します。 このマクロは非表示にした行を再表示します。 マクロ3を解除するときに使用するマクロを作成します。 このマクロは非表示にした表を再表示します。 マクロを記録する準備をします。 ツールメニューのマクロの記録ー新規マクロの記録をクリックします。 新規マクロの記録ダイアログボックスでマクロ名欄に列再表示 C〜G列を再表示すると入力すると入力すしてOKをクリックします。 マクロの記録が開始されます。 まず、シート見出し「住所録」をクリックします。 B〜H列の列番号をドラッグして範囲指定します。(非表示の列を含むように指定) マウスを右クリックし、ショートカットメニューから列表示をクリックします。 C列からG列が表示されます。セルA5をクリックして下さい。 マクロ記録を終了します。 作成されたマクロを見る ********************************************************* Sub マクロ1新規入力用() ' ' 新規入力用 Macro ' 未入力行にジャンプし「番号」を連番に入力 ' ' Keyboard Shortcut: Ctrl+a ' Sheets("住所録").Select SUU = Range("A3").Value GYOU = SUU + 6 RENBAN = SUU + 1 BANCHIA = "A" & GYOU BANCHIB = "B" & GYOU Range(BANCHIA).Select ActiveCell.FormulaR1C1 = RENBAN Range(BANCHIB).Select End Sub Sub マクロ2行挿入() ' Keyboard Shortcut: Ctrl+b Sheets("住所録").Select SUU = Range("A3").Value GYOUBEG = SUU + 6 GYOUEND = GYOUBEG + 9 GYOUHANI = GYOUBEG & ":" & GYOUEND Rows(GYOUHANI).Select Selection.Insert Shift:=xlDown BANCHIA = "A" & GYOUBEG Range(BANCHIA).Select End Sub Sub 列非表示() ' ' 列非表示 Macro ' C〜G列を非表示にする ' Keyboard Shortcut: Ctrl+c ' Sheets("住所録").Select Columns("C:G").Select Selection.EntireColumn.Hidden = True Range("A5").Select End Sub Sub 列再表示() ' ' 列再表示 Macro ' C〜G列を再表示する ' Keyboard Shortcut: Ctrl+d Sheets("住所録").Select Columns("B:H").Select Selection.EntireColumn.Hidden = False Range("A5").Select End Sub *********************************************************: 説明 True 行又は列を非表示 False 行又は列を表示 ****************************************************************************** マクロ5の作成 並べ替えを行うマクロを作成します。 Excelでは 優先されるキーを最大3項目指定して、昇順または降順にリストを並べ替 える事が出来ます。 ここでは2つのマクロを作成します。 組み込み定数を使って並べ替えダイアログボックスを表示するマクロ マクロ名(並べ替え1) 並べ替えを元に戻すマクロ マクロ名(並べ替え2) マクロ5−1(並べ替え1)の作成 並べ替えダイアログボックスを表示するマクロを組み込み定数を使って作成します。 このマクロはマクロ記録機能が使えないので直接モジュールに書き込みます 住所録リストという名で最初に表に挿入ー名前ー定義で表自体に名前を付けておかな くてはなりません。 *****************************************************: マクロ5−1(並べ替え1) Sub マクロ1新規入力用() ' ' 新規入力用 Macro ' 未入力行にジャンプし「番号」を連番に入力 ' ' Keyboard Shortcut: Ctrl+a ' Sheets("住所録").Select SUU = Range("A3").Value GYOU = SUU + 6 RENBAN = SUU + 1 BANCHIA = "A" & GYOU BANCHIB = "B" & GYOU Range(BANCHIA).Select ActiveCell.FormulaR1C1 = RENBAN Range(BANCHIB).Select End Sub Sub マクロ2行挿入() ' Keyboard Shortcut: Ctrl+b Sheets("住所録").Select SUU = Range("A3").Value GYOUBEG = SUU + 6 GYOUEND = GYOUBEG + 9 GYOUHANI = GYOUBEG & ":" & GYOUEND Rows(GYOUHANI).Select Selection.Insert Shift:=xlDown BANCHIA = "A" & GYOUBEG Range(BANCHIA).Select End Sub Sub 列非表示() ' ' 列非表示 Macro ' C〜G列を非表示にする ' Keyboard Shortcut: Ctrl+c ' Sheets("住所録").Select Columns("C:G").Select Selection.EntireColumn.Hidden = True Range("A5").Select End Sub Sub 列再表示() ' ' 列再表示 Macro ' C〜G列を再表示する ' Keyboard Shortcut: Ctrl+d Sheets("住所録").Select Columns("B:H").Select Selection.EntireColumn.Hidden = False Range("A5").Select End Sub '並べ替えダイアログボックスを表示する Sub 並べ替え1() ' Keyboard Shortcut: Ctrl+e Sheets("住所録").Select Range("住所録リスト").Select Application.Dialogs(xlDialogSort).Show Range("A5").Select End Sub ************************************************** 説明 Application.Dialogs(xlDialogSort).Show 並べ替えダイアログボックス(xlDialogSort)を画面に表示する(Showメソッド) マクロ5−2(並べ替え2) 並べ替えを元に戻すマクロ(並べ替え2)を作成します。 マクロ5−1による並べ替えの状態を元に戻す操作(番号欄を最優先されるキーに指定 し、昇順で並べ替え)をマクロ記録によって記録すれば、それが並べ替え前の状態に戻 すマクロとなります。 マクロを記録する準備をします。 ツールメニューのマクロの記録ー新規マクロの記録をクリックします。 新規マクロの記録ダイアログボックスでマクロ名欄に「並べ替え2」 説明欄に「並べ替えを元に戻す」を入力してOKをクリックして下さい。 マクロの記録が開始されます。 まず、シート見出し、「住所録」をクリックします。 名前ボックスの↓をクリックし、「住所録リスト」をクリックします。 データメニューの並べ替えを選択します。 並べ替えダイアログ僕巣で最優先されるキーに「番号」を昇順で指定します。 尚、2番目に優先されるキー欄に何か入力されていれば「なし」を指定して下さい。 並べ替えが実行され、番号順に並べ替えられます。 セルA5をクリックして下さい。 マクロ記録を終了します。 ************************************************* 作成されたマクロを見る Sub マクロ1新規入力用() ' ' 新規入力用 Macro ' 未入力行にジャンプし「番号」を連番に入力 ' ' Keyboard Shortcut: Ctrl+a ' Sheets("住所録").Select SUU = Range("A3").Value GYOU = SUU + 6 RENBAN = SUU + 1 BANCHIA = "A" & GYOU BANCHIB = "B" & GYOU Range(BANCHIA).Select ActiveCell.FormulaR1C1 = RENBAN Range(BANCHIB).Select End Sub Sub マクロ2行挿入() ' Keyboard Shortcut: Ctrl+b Sheets("住所録").Select SUU = Range("A3").Value GYOUBEG = SUU + 6 GYOUEND = GYOUBEG + 9 GYOUHANI = GYOUBEG & ":" & GYOUEND Rows(GYOUHANI).Select Selection.Insert Shift:=xlDown BANCHIA = "A" & GYOUBEG Range(BANCHIA).Select End Sub Sub 列非表示() ' ' 列非表示 Macro ' C〜G列を非表示にする ' Keyboard Shortcut: Ctrl+c ' Sheets("住所録").Select Columns("C:G").Select Selection.EntireColumn.Hidden = True Range("A5").Select End Sub Sub 列再表示() ' ' 列再表示 Macro ' C〜G列を再表示する ' Keyboard Shortcut: Ctrl+d Sheets("住所録").Select Columns("B:H").Select Selection.EntireColumn.Hidden = False Range("A5").Select End Sub '並べ替えダイアログボックスを表示する Sub 並べ替え1() ' Keyboard Shortcut: Ctrl+e Sheets("住所録").Select Range("住所録リスト").Select Application.Dialogs(xlDialogSort).Show Range("A5").Select End Sub Sub 並べ替え2() ' ' 並べ替え2 Macro ' 並べ替えを元に戻す ' ' Keyboard Shortcut: Ctrl+f ' Sheets("住所録").Select Application.Goto Reference:="住所録リスト" Selection.Sort Key1:=Range("A6"), Order1:=xlAscending, Header:=xlGuess, _ OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, SortMethod _ :=xlPinYin Range("A5").Select End Sub **************************************************** マクロ6(検索)の作成 住所録から特定のデータを探し出す(検索)の時に使用するマクロを作成します。 このマクロは指定した文字列や式を含むセルをアクティブにし、検索された文字を赤で 表示させるマクロです。 ここでは 入力要求ダイアログボックスを使って、検索条件をキーボードから入力して 検索を実行するマクロ(マクロ名:検索)を作成します。 このマクロでは繰り返し処理のステートメント(Do While-Loop)を使っています。 住所録の中から「東京」の文字列を検索する操作をマクロ記録機能を使って記録し、 これを検索用のマクロの骨組みとします。 マクロを記録する準備をします。 ツールメニューのマクロの記録ー新規マクロの記録をクリックします。 新規マクロの記録ダイアログボックスで、マクロ名欄に検索、説明欄に条件を入力して 検索と入力して、OKボタンをクリックします。 マクロの記録が開始されます。 まずシート見出し「住所録」をクリックします。 セルA1 をクリックします。 編集メニューの検索を選択します。 検索ダイアログボックスで検索する文字列欄に検索する文字列 (ここでは「東京」を入力して次に検索をクリックします。) 検索が実行され「東京」の文字列を含むセルがアクティブになります。 検索ダイアログボックスで次を検索をクリックします。 「東京」の文字列を含む次のセルがアクティブになります。 検索ダイアログボックスを終了します。 マクロ記録を終了します。 ********************************************: 作成されたマクロを見る Sub 検索() ' ' 検索 Macro ' 条件を入力して検索 ' ' Keyboard Shortcut: Ctrl+h ' Sheets("住所録").Select Range("A1").Select Cells.Find(What:="東京", After:=ActiveCell, LookIn:=xlFormulas, LookAt:= _ xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _ MatchCase:=False).Activate Cells.FindNext(After:=ActiveCell).Activate End Sub *******************************************************: マクロ6の修正 自動作成されたマクロを修正して検索条件をキーボードから入力出来る様にしてみまし ょう。 又検索された文字が一目でわかる様に、赤で表示されるようにします。 考えかた 検索条件を入力 検索を実行 検索した文字を赤で表示 次を検索しますか? はい いいえ 文字の色を元に戻す 終了メッセージ 文字の色を元に戻す ******************************************************** Sub マクロ1新規入力用() ' ' 新規入力用 Macro ' 未入力行にジャンプし「番号」を連番に入力 ' ' Keyboard Shortcut: Ctrl+a ' Sheets("住所録").Select SUU = Range("A3").Value GYOU = SUU + 6 RENBAN = SUU + 1 BANCHIA = "A" & GYOU BANCHIB = "B" & GYOU Range(BANCHIA).Select ActiveCell.FormulaR1C1 = RENBAN Range(BANCHIB).Select End Sub Sub マクロ2行挿入() ' Keyboard Shortcut: Ctrl+b Sheets("住所録").Select SUU = Range("A3").Value GYOUBEG = SUU + 6 GYOUEND = GYOUBEG + 9 GYOUHANI = GYOUBEG & ":" & GYOUEND Rows(GYOUHANI).Select Selection.Insert Shift:=xlDown BANCHIA = "A" & GYOUBEG Range(BANCHIA).Select End Sub Sub 列非表示() ' ' 列非表示 Macro ' C〜G列を非表示にする ' Keyboard Shortcut: Ctrl+c ' Sheets("住所録").Select Columns("C:G").Select Selection.EntireColumn.Hidden = True Range("A5").Select End Sub Sub 列再表示() ' ' 列再表示 Macro ' C〜G列を再表示する ' Keyboard Shortcut: Ctrl+d Sheets("住所録").Select Columns("B:H").Select Selection.EntireColumn.Hidden = False Range("A5").Select End Sub '並べ替えダイアログボックスを表示する Sub 並べ替え1() ' Keyboard Shortcut: Ctrl+e Sheets("住所録").Select Range("住所録リスト").Select Application.Dialogs(xlDialogSort).Show Range("A5").Select End Sub Sub 並べ替え2() ' ' 並べ替え2 Macro ' 並べ替えを元に戻す ' ' Keyboard Shortcut: Ctrl+f ' Sheets("住所録").Select Application.Goto Reference:="住所録リスト" Selection.Sort Key1:=Range("A6"), Order1:=xlAscending, Header:=xlGuess, _ OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, SortMethod _ :=xlPinYin Range("A5").Select End Sub Sub 検索() ' ' 検索 Macro ' 条件を入力して検索 ' ' Keyboard Shortcut: Ctrl+g ' Sheets("住所録").Select Range("A1").Select MOJI = InputBox("検索文字を入力して下さい", "検索文字入力") Cells.Find(What:=MOJI, After:=ActiveCell, LookIn:=xlValues, _ LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _ MatchCase:=False).Activate ActiveCell.Font.ColorIndex = 3 RESPONSE = MsgBox("次を検索しますか", vbYesNo + vbQuestion, "検索続行") Do While RESPONSE = vbYes ActiveCell.Font.ColorIndex = xlAutomatic Cells.FindNext(After:=ActiveCell).Activate ActiveCell.Font.ColorIndex = 3 RESPONSE = MsgBox(" 次を検索しますか", vbYesNo + vbQuestion, _ "検索続行") Loop MsgBox ("検索を終了しました") ActiveCell.Font.ColorIndex = xlAutomatic End Sub **********************************************: 説明 Sub 検索() ' ' 検索 Macro ' 条件を入力して検索 ' ' Keyboard Shortcut: Ctrl+h ' Sheets("住所録").Select Range("A1").Select MOJI = InputBox("検索文字を入力して下さい", "検索文字入力") '検索文字入力ダイアログボックスを表示する。入力した文字列は、 '変数MOJIに代入される Cells.Find(What:=MOJI, After:=ActiveCell, LookIn:=xlValues, _ LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _ MatchCase:=False).Activate ActiveCell.Font.ColorIndex = 3 '文字の色を赤にする(ColorIndexプロパティ) ' xlAutomatic 規定値 ' 3 赤 ' 4 緑 ' 5 青 ' 6 黄 RESPONSE = MsgBox("次を検索しますか", vbYesNo + vbQuestion, "検索続行") '検索続行ダイアログボックスを表示する。選択されたボタン(はい、いいえ) 'に対応する定数値が変数RESPONSEに代入される。 Do While RESPONSE = vbYes 'Do Loop ステートメント(Do While-Loop)ある条件を満たす間で同じ操作を '繰り返す命令 '変数RESPONSEの値がvbYesの間はいボタンが選択されている間は繰り返す ActiveCell.Font.ColorIndex = xlAutomatic '文字の色を規定値にする Cells.FindNext(After:=ActiveCell).Activate ActiveCell.Font.ColorIndex = 3 '文字の色を赤にする(ColorIndexプロパティ) ' xlAutomatic 規定値 ' 3 赤 ' 4 緑 ' 5 青 ' 6 黄 RESPONSE = MsgBox(" 次を検索しますか", vbYesNo + vbQuestion, "検索続行") '次を検索しますか?の表示ボックスを表示 Loop MsgBox ("検索を終了しました") '検索を終了しました。のメッセージを表示 ActiveCell.Font.ColorIndex = xlAutomatic End Sub ****************************************************************************** マクロ7の作成 次に指定した条件に合うレコードを抽出するマクロを作成します。 2つの方法があります。 1 リスト範囲内に抽出する 2 抽出範囲を指定し、そこに抽出する ここでは2つのマクロを作成します。 マクロ7−1  条件をキーボードから入力して抽出を実行するマクロ マクロ7−2 抽出を解除するマクロ *******************************: マクロ7−1 の作成 条件をキーボードから入力して抽出を実行するマクロ ツールメニューのマクロの記録ー新規マクロの記録をクリックします。 新規マクロの記録ダイアログボックスでマクロ名欄に抽出 説明欄に条件を入力して抽出と入力して、OKボタンをクリックします。 マクロの記録が開始されます。 まず、シート見出し「住所録」をクリックします。 名前ボックスの▼をクリックして「住所録リスト」をクリックします。 データメニューのフィルターオートフィルタを選択します。 選択した範囲の見出しにオートフィルタ矢印が表示されます。 名前欄の▼をクリックしてオプションを選択して下さい。 オートフィルタオプションダイアログボックスが表示されます。 条件を入力して(ここでは「鈴木*」)を入力してOKボタンをクリックして下さい。 姓が「鈴木」のレコードが抽出されます。次にスクロールバーの矢印をクリックして 「住所1」欄を画面に表示させ、「住所1」欄の▼をクリックしてオプションを選択 して下さい。 オートフィルタオプションダイアログぼっkすで条件に「東京*」と「京都*」を入力し ORをクリックしてOKボタンをクリックして下さい。 指定した条件に合うレコードが抽出されます。次にスクロールバーの矢印をクリックし てオプションを選択して下さい。 オートフィルタオプションダイアログボックスで条件に「1995/11/1」を「>」で、 「1996/1/1」を「<=」で入力し「AND」をクリックしてOKボタンをクリックして下さい。 指定した条件に合うレコードが抽出されます。 セルA5をクリックして下さい。 マクロ7−1の記録を終了します。 ************************************************** 続いて、マクロ7−2を記録する準備をします。 ツールメニューのマクロの記録ー新規マクロの記録をクリックします。 新規マクロの記録ダイアログボックスで「マクロ名」欄に「抽出解除」 「説明」欄に「抽出を解除する」と入力してOKボタンをクリックします。 マクロの記録が開始されます。 マクロの記録が開始されます。 シート見出し「住所録」をクリックします。 データメニューのフィルターオートフィルタを選択します。 抽出が解除されます。セルA5をクリックして下さい。 マクロ7−2の記録を終了します。 **************************************************** 作成されたマクロ7−1を見る Sub 抽出() ' ' 抽出 Macro ' 条件を入力して抽出 ' ' Keyboard Shortcut: Ctrl+j ' Sheets("住所録").Select Application.Goto Reference:="住所録リスト" Selection.AutoFilter Selection.AutoFilter Field:=2, Criteria1:="=鈴木*", Operator:=xlAnd Selection.AutoFilter Field:=4, Criteria1:="=東京*", Operator:=xlOr Selection.AutoFilter Field:=11, Criteria1:=">1995/11/1", Operator:=xlAnd _ , Criteria2:="<=1996/1/1" Range("A5").Select End Sub Sub 抽出解除() ' ' 抽出解除 Macro ' 抽出を解除する Sheets("住所録").Select Selection.AutoFilter Range("A5").Select End Sub *************************************************:: 説明 Sub 抽出() ' ' 抽出 Macro ' 条件を入力して抽出 ' ' Keyboard Shortcut: Ctrl+j ' Sheets("住所録").Select '住所録のシートをクリックする Application.Goto Reference:="住所録リスト" '住所録リストを選択する Selection.AutoFilter 'データーフィルターオートフィルタを選択する Selection.AutoFilter Field:=2, Criteria1:="=鈴木*", Operator:=xlAnd 'フィルタを掛ける 'Field フィルタの対象となるフィールド番号 'Criterial1 抽出条件を指定 'Operator 複合抽出条件を指定 'xlAnd AND条件 'xlOr OR条件 'xlAnd 省略 Selection.AutoFilter Field:=4, Criteria1:="=東京*", Operator:=xlOr 'オートフィルタを使ってリストにフィルタを掛ける Selection.AutoFilter Field:=11, Criteria1:=">1995/11/1", Operator:=xlAnd _ , Criteria2:="<=1996/1/1" 'オートフィルタを使ってリストにフィルタを掛ける Range("A5").Select 'セルA5をクリックする End Sub Sub 抽出解除() ' ' 抽出解除 Macro ' 抽出を解除する Sheets("住所録").Select '住所録シートをクリック Selection.AutoFilter 'データーフィルターオートフィルタを選択 Range("A5").Select 'セルA5を選択 End Sub ************************************************************** マクロの修正 Sub マクロ1新規入力用() ' ' 新規入力用 Macro ' 未入力行にジャンプし「番号」を連番に入力 ' ' Keyboard Shortcut: Ctrl+a ' Sheets("住所録").Select SUU = Range("A3").Value GYOU = SUU + 6 RENBAN = SUU + 1 BANCHIA = "A" & GYOU BANCHIB = "B" & GYOU Range(BANCHIA).Select ActiveCell.FormulaR1C1 = RENBAN Range(BANCHIB).Select End Sub Sub マクロ2行挿入() ' Keyboard Shortcut: Ctrl+b Sheets("住所録").Select SUU = Range("A3").Value GYOUBEG = SUU + 6 GYOUEND = GYOUBEG + 9 GYOUHANI = GYOUBEG & ":" & GYOUEND Rows(GYOUHANI).Select Selection.Insert Shift:=xlDown BANCHIA = "A" & GYOUBEG Range(BANCHIA).Select End Sub Sub 列非表示() ' ' 列非表示 Macro ' C〜G列を非表示にする ' Keyboard Shortcut: Ctrl+c ' Sheets("住所録").Select Columns("C:G").Select Selection.EntireColumn.Hidden = True Range("A5").Select End Sub Sub 列再表示() ' ' 列再表示 Macro ' C〜G列を再表示する ' Keyboard Shortcut: Ctrl+d Sheets("住所録").Select Columns("B:H").Select Selection.EntireColumn.Hidden = False Range("A5").Select End Sub '並べ替えダイアログボックスを表示する Sub 並べ替え1() ' Keyboard Shortcut: Ctrl+e Sheets("住所録").Select Range("住所録リスト").Select Application.Dialogs(xlDialogSort).Show Range("A5").Select End Sub Sub 並べ替え2() ' ' 並べ替え2 Macro ' 並べ替えを元に戻す ' ' Keyboard Shortcut: Ctrl+f ' Sheets("住所録").Select Application.Goto Reference:="住所録リスト" Selection.Sort Key1:=Range("A6"), Order1:=xlAscending, Header:=xlGuess, _ OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, SortMethod _ :=xlPinYin Range("A5").Select End Sub Sub 検索() ' ' 検索 Macro ' 条件を入力して検索 ' ' Keyboard Shortcut: Ctrl+g ' Sheets("住所録").Select Range("A1").Select MOJI = InputBox("検索文字を入力して下さい", "検索文字入力") Cells.Find(What:=MOJI, After:=ActiveCell, LookIn:=xlValues, _ LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _ MatchCase:=False).Activate ActiveCell.Font.ColorIndex = 3 RESPONSE = MsgBox("次を検索しますか", vbYesNo + vbQuestion, "検索続行") Do While RESPONSE = vbYes ActiveCell.Font.ColorIndex = xlAutomatic Cells.FindNext(After:=ActiveCell).Activate ActiveCell.Font.ColorIndex = 3 RESPONSE = MsgBox(" 次を検索しますか", vbYesNo + vbQuestion, _ "検索続行") Loop MsgBox ("検索を終了しました") ActiveCell.Font.ColorIndex = xlAutomatic End Sub Sub 抽出() ' ' 抽出 Macro ' 条件を入力して抽出 ' ' Keyboard Shortcut: Ctrl+h ' Dim FIELD(11) As String Sheets("住所録").Select Application.Goto Reference:="住所録リスト" Selection.AutoFilter FIELD(1) = "番号" FIELD(2) = "名前" FIELD(3) = "ふりがな" FIELD(4) = "住所1" FIELD(5) = "住所2" FIELD(6) = "郵便番号" FIELD(7) = "電話番号" FIELD(8) = "メモ" FIELD(9) = "キー1" FIELD(10) = "キー2" FIELD(11) = "更新日" FIELDNO = InputBox("抽出条件の項目を半角数字で入力して下さい" _ & Chr(13) & Chr(10) & " 1" & FIELD(1) & " 2" & FIELD(2) _ & " 3" & FIELD(2) & " 4" & FIELD(4) & " 5" & FIELD(5) _ & Chr(13) & Chr(10) & " 6" & FIELD(6) & " 7" & FIELD(7) _ & " 8" & FIELD(8) & " 9" & FIELD(9) & Chr(13) & Chr(10) _ & "10" & FIELD(10) & " 11" & FIELD(11), "項目指定") JOKENSUU = InputBox("条件数を半角数字で入力して下さい" _ & Chr(13) & Chr(10) & "1 条件は1つ" _ & Chr(13) & Chr(10) & "2 条件は2つ(OR)" _ & Chr(13) & Chr(10) & "3 条件は3つ(AND)", "条件数") Select Case JOKENSUU Case "1" JOKEN = InputBox(FIELD(FIELDNO) & "で抽出します" & Chr(13) _ & Chr(10) & "条件を入力して下さい", "抽出条件入力") Selection.AutoFilter FIELD:=FIELDNO, Criteria1:=JOKEN, _ Operator:=xlAnd Case "2" JOKEN = InputBox(FIELD(FIELDNO) & "で抽出します" & Chr(13) _ & Chr(10) & "1番目のOR条件を入力して下さい", _ "OR条件入力1") JOKEN2 = InputBox(FIELD(FIELDNO) & "で抽出します" & Chr(13) _ & Chr(10) & "2番目のOR条件を入力して下さい", _ "OR条件入力2") Selection.AutoFilter FIELD:=FIELDNO, Criteria1:=JOKEN, _ Operator:=xlOr, Criteria2:=JOKEN2 Case "3" JOKEN = InputBox(FIELD(FIELDNO) & "で抽出します" & Chr(13) _ & Chr(10) & "1番目のAND条件を入力して下さい", _ "AND条件入力1") JOKEN2 = InputBox(FIELD(FIELDNO) & "で抽出します" & Chr(13) _ & Chr(10) & "2番目のAND条件を入力して下さい", _ "AND条件入力2") Selection.AutoFilter FIELD:=FIELDNO, Criteria1:=JOKEN, _ Operator:=xlAnd, Criteria2:=JOKEN2 Case Else MsgBox ("条件のタイプには、1〜3の数字を入力して下さい") End Select Range("A5").Select KEKKA = MsgBox("抽出が完了しました" & Chr(13) & Chr(10) _ & "抽出を解除しますか?", vbYesNo + vbQuestion, "抽出終了") If KEKKA = vbYes Then Call 抽出解除 End If End Sub Sub 抽出解除() ' ' 抽出解除 Macro ' 抽出を解除する Sheets("住所録").Select Selection.AutoFilter Range("A5").Select End Sub ***************************************************: 説明 Sub 抽出() ' ' 抽出 Macro ' 条件を入力して抽出 ' ' Keyboard Shortcut: Ctrl+j ' Dim FIELD(11) As String '変数FIELD(1)-FIELD(11)のデータ型を文字型に宣言する。 '変数のデータ型をしてするには、Dimステートメントを使う Sheets("住所録").Select 'シート「住所録」を指定 Application.Goto Reference:="住所録リスト" '罫線枠内の住所録リストを選択する Selection.AutoFilter 'オートフィルタを選択する FIELD(1) = "番号" FIELD(2) = "名前" FIELD(3) = "ふりがな" FIELD(4) = "住所1" FIELD(5) = "住所2" FIELD(6) = "郵便番号" FIELD(7) = "電話番号" FIELD(8) = "メモ" FIELD(9) = "キー1" FIELD(10) = "キー2" FIELD(11) = "更新日" '変数FIELD(1)に文字列「番号」を代入する。 'ほかも同じ FIELDNO = InputBox("抽出条件の項目を半角数字で入力して下さい" _ & Chr(13) & Chr(10) & " 1" & FIELD(1) & " 2" & FIELD(2) _ & " 3" & FIELD(2) & " 4" & FIELD(4) & " 5" & FIELD(5) _ & Chr(13) & Chr(10) & " 6" & FIELD(6) & " 7" & FIELD(7) _ & " 8" & FIELD(8) & " 9" & FIELD(9) & Chr(13) & Chr(10) _ & "10" & FIELD(10) & " 11" & FIELD(11), "項目指定") 「項目指定」ダイアログボックスを表示する 入力された数字は、変数FIELDNOに代入される。メッセージ文は文字列や 変数を「&」でつないで作成し、途中で改行したい場合は、 Chr(13) & Chr(10)を使う JOKENSUU = InputBox("条件数を半角数字で入力して下さい" _ & Chr(13) & Chr(10) & "1 条件は1つ" _ & Chr(13) & Chr(10) & "2 条件は2つ(OR)" _ & Chr(13) & Chr(10) & "3 条件は3つ(AND)", "条件数") 条件数ダイアログボックスを表示。入力された文字は変数JOKENに代入 Select Case JOKENSUU 条件式の値により、複数のステートメントブロックのどれかを実行する Case "1" JOKEN = InputBox(FIELD(FIELDNO) & "で抽出します" & Chr(13) _ & Chr(10) & "条件を入力して下さい", "抽出条件入力") Selection.AutoFilter FIELD:=FIELDNO, Criteria1:=JOKEN, _ Operator:=xlAnd 条件が1の場合はこの記述を実行するJOKENに代入される Case "2" JOKEN = InputBox(FIELD(FIELDNO) & "で抽出します" & Chr(13) _ & Chr(10) & "1番目のOR条件を入力して下さい", _ "OR条件入力1") OR条件入力1ダイアログを表示する入力された文字列は変数 JOKENに代入される JOKEN2 = InputBox(FIELD(FIELDNO) & "で抽出します" & Chr(13) _ & Chr(10) & "2番目のOR条件を入力して下さい", _ "OR条件入力2") OR条件入力2ダイアログボックスを表示する。入力された 文字列は変数JOKEN2に代入される Selection.AutoFilter FIELD:=FIELDNO, Criteria1:=JOKEN, _ Operator:=xlOr, Criteria2:=JOKEN2 抽出実行 Case "3" JOKEN = InputBox(FIELD(FIELDNO) & "で抽出します" & Chr(13) _ & Chr(10) & "1番目のAND条件を入力して下さい", _ "AND条件入力1") AND条件入力1ダイアログを表示。入力された文字列は JOKENに代入される JOKEN2 = InputBox(FIELD(FIELDNO) & "で抽出します" & Chr(13) _ & Chr(10) & "2番目のAND条件を入力して下さい", _ "AND条件入力2") AND条件入力2ダイアログを表示。入力された文字列は JOKEN2に代入される Selection.AutoFilter FIELD:=FIELDNO, Criteria1:=JOKEN, _ Operator:=xlAnd, Criteria2:=JOKEN2 抽出実行 Case Else MsgBox ("条件のタイプには、1〜3の数字を入力して下さい") 変数JOKENSUUの値が1−3以外の場合は、MsgBoxを実行する End Select Select Case ステートメントの終わり Range("A5").Select KEKKA = MsgBox("抽出が完了しました" & Chr(13) & Chr(10) _ & "抽出を解除しますか?", vbYesNo + vbQuestion, "抽出終了") 抽出終了ダイアログボックスを表示する。はい、いいえに対応 する定数値を変数KEKKAに代入する If KEKKA = vbYes Then vbYesのボタンが押されたとき(はい)はCall 抽出解除を実行 Call 抽出解除 抽出解除を実行。CallはSub 抽出解除()プロシージャを呼び出す ステートメント End If If Thenステートメント終了 End Sub Sub 抽出解除() ' ' 抽出解除 Macro ' 抽出を解除する Sheets("住所録").Select Selection.AutoFilter Range("A5").Select End Sub ***************************************************************************: ボタンによるマクロの実行 ボタンを定義して、そこへマクロを登録しておくと、そのボタンをクリックするだけで 登録したマクロを実行することが出来ます。 ツールバーにマクロを登録する メニューバーの下に表示されているボタンを群をツールバーといいます。 このツールバーのボタンにマクロを登録してみましょう。 1 表示メニューのツールバーをクリックします。 2 ツールバーダイアログボックスrが表示されます。 3 設定ボタンをクリックして下さい。 4 ユーザー設定ボタンをクリックして下さい。 5 ツールバーに設定したいボタンをクリックして画面上部のツールバーにドラッグ します 6 マクロの登録ダイアログボックスが表示されるので、マクロ「新規入力用」をクリ ックしてOKボタンを押して下さい。 7 最後にユーザー設定ダイアログボックスで閉じるボタンをクリックします。 8 ツールボタンを削除をしたいときは表示メニューからツールバーをクリックします 9 ツールバーダイアログボックスのツールバー欄で、ユーザー設定したボタンがある ツールバー名にカーソルをおいてリセットボタンをクリックしてください。 尚、そのボタン上で右クリックしてボタンイメージの編集をクリックするとボタン エディタが起動してボタンを好きなデザインに変えることが出来ます。 ****************************************************************************** ツールバーを新規作成してマクロを登録 ユーザー独自のツールバーを作成し、ここにマクロを登録することも出来ます。 1 表示メニューのツールバーをクリックします。 2 ツールバーダイアログボックスが表示されます。 3 ツールバー名欄にツールバーに付ける名前を入力して新規作成ボタンをクリックし ます。 4 画面左上にツールバー「並べ替え」が表示されます。 5 ユーザー設定ダイアログボックスも同時に表示されるので、分類欄でユーザー設定 をクリックして下さい。 6 適当なボタンををクリックして新しくできたツールバーにドラッグします。 マクロの登録ダイアログボックスが表示されるのでボタンにマクロを登録しま す。 7 最後にユーザー設定ダイアログボックスで閉じるボタンをクリックして下さい。 ****************************************************************************** シート上にコマンドボタンを作成してマクロを登録 シート上にコマンドボタンを作成してこれにマクロを登録して実行することも出来ます 1 コマンドを作りたいシートを表示させます。 2 表示メニューのツールバーをクリックします。 3 ツールバー欄内の図形描画を選択します。 4 図形描画ツールバーの中のコマンドボタンをクリックしてコマンドをシートに作り ます。ドラッグして大きさも決めます。 5 作成し終わるとマクロの登録ダイアログが表示されます。 6 ここでマクロを登録します。 ******************************************************************************* ******************************************************************************* ******************************************************************************* 中級編 ***************************************************** セルやセル範囲を扱うRangeオブジェクト 番地を指定してセル範囲を指定する Sub test1() Range("b4").Value = 1452 End Sub この記述でb4のセルは1452の値が入力されます。 ****************************** セル範囲を選択する事もできます。 Sub test2() Range("b4 : d6").Value = 30 End Sub この記述でセル範囲b4とd6を対角線で結ぶ範囲を選択することが出来ます。 ****************************** 表やグラフに名前が付いている場合 Range = ("名前") で、直接指定することが出来ます。 ******************************************************************** シートの中のある選択範囲の値を取り出すためには「Selection」を使います。 Sub test4() Range("c3 : e5").Select With Selection.Font .Name = "明朝" .FontStyle = "標準" .Size = 20 End With End Sub こうする事によってこの選択範囲の値は指定したフォントに変更することが出来ます。 ********************************************************************** アクティブセルのオブジェクト 選択範囲内のアクティブセルは ActiveCellによって求めることが出来ます。 Sub test5() ActiveCell.Value = 100 End Sub この記述によってそのシートでのアクティブにあるセルには指定した値が入力されます では アクティブセルを指定するには Sub test6() Range("b5 : c8").Select Range("b7").Activate End Sub この記述により b5 : c8の範囲選択の中で b7のセルがアクティブになります。 ************************************************************************** あるセルに値を入れるには Sub main() Dim targetCell As Range Set targetCell = Range("A1") targetCell.Value = 125 End Sub の様な記述をします。 この記述を簡単に記述することが出来ます。しかし大きなプログラムになると セル範囲を変数として扱わなくてはならなくなるので同じセル範囲の記述がマクロの 中にあちこちに出てきて判りにくくなります。 Sub main() Range("a1".Value = 125 End Sub ************************************************************************* アクティブセルをすぐ右に移動するには Sub test7() ActiveCell.Offset(0, 1).Activate End Sub と言う命令をします。この命令は前から順に見てアクティブセルの右のセルを アクティブにすると言う意味です。 ************************************************************************* セルに入力されている文字列の一部分をオブジェクトとして参照します。 a1のセルに こんにちはSuzukiです と入力されているとします。 Sub test8() [a1].Characters(6, 6).Font.Size = 20 End Sub とすると 文字列の先頭から6文字目から6文字分の文字が参照されて Suzukiです の部分が20ポイントの文字サイズに変更されます。 ************************************************************************** ある範囲のセルの値や式を別の範囲にコピーするような場合 Sub test9() Dim aData As Variant aData = [a1 : a4].Value [b1 : b4].Value = aData End Sub で行えます。 [a1 : a4]の値は[b1: b4]にコピーされます。 **************************************************************************** 決められた各セルに乱数を発生させる rand()関数 Sub test10() Dim targetRange As Range, i As Integer, j As Integer Dim ColNum As Integer, rowNum As Integer Set targetRange = Range("c3 : G9") ColNum = targetRange.Columns.Count rowNum = targetRange.Rows.Count For i = 1 To ColNum For j = 1 To rowNum targetRange.Cells(j, i).Formula = "=rand()" Next j Next i End Sub ***************************************************************************** セル範囲内のセルを各行の核列について順番に見て行く方法としては次の様な記述が 出来ます。 Sub test11() Dim targetRange As Range, oneCell As Range Dim targetRow As Range, oneRow As Range Set targetRange = Range("c3 : g9") For Each oneRow In targetRange.Rows For Each oneCell In oneRow.Cells oneCell.Value = 13 Next oneCell Next oneRow End Sub これは 実際にモジュールに書き込んで見ると判ります。 ******************************************************************************* 罫線を引く ********************************************** [c3 : f3]のセルの下に太い線を引く Sub test12() [c3 : f3].Borders(xlBottom).Weight = xlThick End Sub ちなみに細い線は xlThin 中位は xlMedium 太い線は xlThick 二重線は xlDouble 点線は xlDot ********************************************** [c3 : f3]のセルの下の罫線を消すには Sub test13() [c3 : f3].Borders.LineStyle = xlNone End Sub ***************************************************************************** 範囲を指定した部分に罫線を引く Sub keisen() Range("B4:F13").Select With Selection.Borders(xlEdgeLeft) .Weight = xlMedium End With With Selection.Borders(xlEdgeTop) .Weight = xlMedium End With With Selection.Borders(xlEdgeBottom) .Weight = xlMedium End With With Selection.Borders(xlEdgeRight) .Weight = xlMedium End With End Sub ******************************************** これは使えます。*************************************************************** 最初に範囲を選択しておいた部分に外枠罫線、1行目には二重線その他は点線と 勝手に入れてくれるマクロです。 これは便利です。   Sub DrawTheLine() Dim targetRange As Range, firstCol As Range, firstRow As Range Dim outline As Integer, border1stRow As Integer, border1stCol As Integer Dim borderRow As Integer, borderCol As Integer Set targetRange = Selection '罫線表を作る範囲は現在の選択範囲 outline = xlThick '表の外枠の罫線 border1stCol = xlMedium '1行目の右側の罫線 border1stRow = xlDouble '1行目の下側の罫線 borderCol = xlContinuous '表の中の縦罫線 borderRow = xlDot '表の中の横罫線 targetRange.Borders.LineStyle = xlNone '範囲の中の罫線をまず消す Set firstCol = targetRange.Columns(1) '1列目を取り出す Set firstRow = targetRange.Rows(1) '1行目を取り出す DrawBorder targetRange, xlRight, borderCol '各セルの縦罫線を引く DrawBorder targetRange, xlBottom, borderRow '各セルの横罫線を引く DrawBorder firstCol, xlRight, border1stCol '1行目と残りを区切る線を引く DrawBorder firstRow, xlBottom, border1stRow '1行目と残りを区切る線を引く If isWeight(outline) Then '外側の罫線を引く targetRange.BorderAround Weight:=outline Else targetRange.BorderAround LineStyle:=outline End If End Sub Sub DrawBorder(cellRange As Range, index As Integer, whichLIne As Integer) If isWeight(whichLIne) Then cellRange.Borders(index).Weight = whichLIne Else cellRange.Borders(index).LineStyle = whichLIne End If End Sub Function isWeight(num) As Boolean isWeight = False Select Case (num) Case xlHairline isWeight = True Case xlThick isWeight = True Case xlThin isWeight = True Case xlMedium isWeight = True End Select End Function ****************************************************************************** 不連続なセル範囲への捜査 不連続なセル範囲の操作もRangeで同様に行えます。 Sub main() Range("b2 : c5, f4, a7 : b10").Select End Sub で 同様に二つの場所に選択されたオブジェクトを作るには Sub main() Dim Range1 As Range, Range2 As Range Set Range1 = Range ("b2 : f4") Set Range2 = Range("g1 : g6") Union(Range1, Range2).Select End Sub です。 **************************************************************************** ユーザーインターフェースの設計 まずはウインドウを作ってみましょう。 Sub test2() Dim typed As String typed = InputBox(prompt:="入力してください", Title:="Input Boxのサンプル") MsgBox typed End Sub これを実行すると入力画面が表示されてその入力した文字が次のダイアログに 反映されます。 ****************************************************************************** こんなのはどうでしょうか? これは 範囲を選択してほしいというダイアログを表示させて 範囲を指定した部分の確認とその中のフォントサイズを読みとるものです。 Sub test3() Dim selected As Range Worksheets("Sheet1").Select Set selected = Application.InputBox _ (prompt:="範囲を選択してください", Type:=8) MsgBox CStr(selected.Address) & _ "の範囲のフォントサイズ:" & selected.Font.Size End Sub ******************************************************************************* ****************************************************************************** アクティブにしているセルをボールド文字に変える記述 Sub test() Selection.Font.Bold = True End Sub ************************************************ その他・・・・ Sub test() と End Sub の間に次の記述を入れると思った通りにマクロが動きます。 ボールド文字 Selection.Font.Bold = True イタリック文字 Selection.Font.Italic = True アンダーライン Selection.Font.Underline = xlUnderlineStyleSingle センタリング Selection.HorizontalAliginment = xlCenter 左寄せ Selection.HorizontalAliginment = xlLeft 右寄せ Selection.HorizontalAliginment = xlRight 縦位置センタリング Selection.VerticalAliginment = xlCenter 縦位置を最下位置に Selection.VerticalAliginment = xlBottom コピー Selection.Copy 切り取り Selection.Cut 貼り付け ActiveSheet.Paste フォントを20ポイントに Selection.Font.Size = 20 フォントをMSPゴシックに Selection.Font.Name = "MS Pゴシック" ********************************************************* Sub test2() Selection.Font.Bold = True Selection.Font.Italic = True Selection.Font.Underline = xlUnderlineStyleSingle End Sub ********************************************************** 同じ記述を何度も繰り返すことなく次のように・・・・ ***************************************************** Sub test2() With Selection.Font .Bold = True .Italic = True .Underline = xlUnderlineStyleSingle End With End Sub ***************************************************** 上の記述のように With End With を使うことによって省略することが出来ます。 *********************************************************************** Sub OpenFile() '指定したファイルを常に開くマクロの記述 Workbooks.Open FileName:="C:\My Documents\ExcelVBA\BUDGET.XLS" '指定したファイルの指定したセルをアクティブにする記述 Range("C5").Select End Sub ******************************************************: 空白セルに値を入力する (Excelのシートを想像して考えてください。) (株)若葉テキスタイル 平成8年3月 受注概要 都道府県 販売経路 商品分類 価格帯 数量 純益 表示単 神奈川県 小売 子供 Mid 9 4050 450 4050 Low 143 43406 350 50050 アート High 17 9350 550 9350 Mid 23 10350 450 10350 スポーツ High 26 14300 550 14300 Mid 6 2700 450 2700 Low 4 1400 350 1400 シアトル High 13 7150 550 7150 Mid 7 3150 450 3150 Low 25 8750 350 8750 恐竜 Mid 22 9900 450 9900 Low 22 7700 350 7700 ユーモア Mid 143 55432 450 64350 Low 13 4550 350 4550 環境 Mid 35 15750 450 15750 Low 40 14000 350 14000 卸売り 子供 Mid 30 6750 225 6750 Low 10 1750 175 1750 アート High 410 106213 275 112750 Mid 900 184848 225 202500 スポーツ High 25 6875 275 6875 Mid 30 6750 225 6750 Low 5 875 175 875 シアトル High 910 213483 275 250250 Mid 60 13500 225 13500 Low 405 68760 175 70875 恐竜 Mid 660 140108 225 148500 Low 345 58660 175 60375 ユーモア Mid 65 14625 225 14625 Low 25 4375 175 4375 環境 Mid 210 45916 225 47250 Low 195 34125 175 34125 千葉県 小売 子供 Mid 109 49050 450 49050 Low 405 111235 350 141750 アート High 150 73703 550 82500 Mid 65 29250 450 29250 スポーツ High 12 6600 550 6600 Mid 207 85308 450 93150 Low 13 4550 350 4550 シアトル High 60 33000 550 33000 Mid 35 15750 450 15750 Low 45 15750 350 15750 恐竜 Mid 230 91522 450 103500 Low 75 26250 350 26250 ユーモア Mid 575 121291 450 258750 ******************************************************************************* 入力後・・・・ (株)若葉テキスタイル 平成8年3月 受注概要 都道府県 販売経路 商品分類 価格帯 数量 純益 表示単 神奈川県 小売 子供 Mid 9 4050 450 4050 神奈川県 小売 子供 Low 143 43406 350 50050 神奈川県 小売 アート High 17 9350 550 9350 神奈川県 小売 アート Mid 23 10350 450 10350 神奈川県 小売 スポーツ High 26 14300 550 14300 神奈川県 小売 スポーツ Mid 6 2700 450 2700 神奈川県 小売 スポーツ Low 4 1400 350 1400 神奈川県 小売 シアトル High 13 7150 550 7150 神奈川県 小売 シアトル Mid 7 3150 450 3150 神奈川県 小売 シアトル Low 25 8750 350 8750 神奈川県 小売 恐竜 Mid 22 9900 450 9900 神奈川県 小売 恐竜 Low 22 7700 350 7700 神奈川県 小売 ユーモア Mid 143 55432 450 64350 神奈川県 小売 ユーモア Low 13 4550 350 4550 神奈川県 小売 環境 Mid 35 15750 450 15750 神奈川県 小売 環境 Low 40 14000 350 14000 神奈川県 卸売り 子供 Mid 30 6750 225 6750 神奈川県 卸売り 子供 Low 10 1750 175 1750 神奈川県 卸売り アート High 410 106213 275 112750 神奈川県 卸売り アート Mid 900 184848 225 202500 神奈川県 卸売り スポーツ High 25 6875 275 6875 神奈川県 卸売り スポーツ Mid 30 6750 225 6750 神奈川県 卸売り スポーツ Low 5 875 175 875 神奈川県 卸売り シアトル High 910 213483 275 250250 神奈川県 卸売り シアトル Mid 60 13500 225 13500 神奈川県 卸売り シアトル Low 405 68760 175 70875 神奈川県 卸売り 恐竜 Mid 660 140108 225 148500 神奈川県 卸売り 恐竜 Low 345 58660 175 60375 神奈川県 卸売り ユーモア Mid 65 14625 225 14625 神奈川県 卸売り ユーモア Low 25 4375 175 4375 神奈川県 卸売り 環境 Mid 210 45916 225 47250 神奈川県 卸売り 環境 Low 195 34125 175 34125 千葉県 小売 子供 Mid 109 49050 450 49050 千葉県 小売 子供 Low 405 111235 350 141750 千葉県 小売 アート High 150 73703 550 82500 千葉県 小売 アート Mid 65 29250 450 29250 千葉県 小売 スポーツ High 12 6600 550 6600 千葉県 小売 スポーツ Mid 207 85308 450 93150 千葉県 小売 スポーツ Low 13 4550 350 4550 千葉県 小売 シアトル High 60 33000 550 33000 千葉県 小売 シアトル Mid 35 15750 450 15750 千葉県 小売 シアトル Low 45 15750 350 15750 千葉県 小売 恐竜 Mid 230 91522 450 103500 千葉県 小売 恐竜 Low 75 26250 350 26250 千葉県 小売 ユーモア Mid 575 121291 450 258750 千葉県 小売 ユーモア Low 135 40673 350 47250 千葉県 小売 環境 Mid 165 65588 450 74250 千葉県 小売 環境 Low 435 123963 350 152250 千葉県 卸売り 子供 Mid 325 71034 225 73125 千葉県 卸売り 子供 Low 945 155791 175 165375 千葉県 卸売り アート High 900 219642 275 247500 千葉県 卸売り アート Mid 40 9000 225 9000 ******************************************************************************* 1 エクセルのシート上で編集ージャンプを選択する 2 セル選択をクリックする 3 選択オプションで空白セルを選択してOKボタンをクリック 4 =を入力して↑を1回押してCtrl+Enterを押す 5 画面全体に空白セルのひとつ上の文字がフィルインされる。 *********************************************************** Sub FrreeCell() ' ' FrreeCell Macro 'カレントの選択対象内の空白セルを選択する Selection.SpecialCells(xlCellTypeBlanks).Select '全ての対象セルに次の式を代入するという記述 Selection.FormulaR1C1 = "=R[-1]C" '作業が終了したらA1をアクティブセルにするための記述 Range("A1").Select End Sub ************************************************************ Ctrl + Enter 選択している全てのセルに一度に数式を入力できます。 Ctrl + * データ範囲のみを全て選択することが出来ます。 ************************************************************ 選択したセルに入力を求めるダイアログを表示させる Sub InputDate() 'ダイアログを表示 myDate = InputBox("Input Date XX年ZZ月") 'アクティブセルに入力データを代入する Selection.FormulaR1C1 = myDate End Sub ************************************************************* セルのデータ全体で20%以上のセルを黄色のセルに変える 1 データの入ったシートを選択する 2 Ctrl+Shift+Aを押してデータ全てを選択する 3 次のマクロを実行する 自動的に改行して次の行次の列に移動して20%以上のセルを黄色にして 目立たせます。 ************************************************************* Sub chooseForm() With Selection.Interior .ColorIndex = 6 .Pattern = xlSolid End With ActiveCell.Offset(1,0).Range("A1").Select End Sub ************************************************************* 上のマクロではマウスでアクティブにしているセルを黄色のセルに変化させます。 ここでマクロで20%以上であれば黄色にするという意志を持たせます。 ********************************************************************** Sub ChooseForm2() If ActiveCell > 0.2 Then With Selection.Interior .ColorIndex = 6 .Pattern = xlSolid End With End If ActiveCell.Offset(1,0).Range("A1").Select End Sub ******************************************************************* 上の記述で20%以上の数値であればマクロによって自動的に黄色のセルに 変化させます。 しかし、一回一回セルをアクティブにしていたのでは大変です。 同じ動作を何度も繰り返すには・・・ ******************************************************************** Sub ChooseForm3() Do If ActiveCell > 0.2 Then With Selection.Interior .ColorIndex = 6 .Pattern = xlSolid End With End If ActiveCell.Offset(1,0).Range("A1").Select Loop End Sub ******************************************************************* Do Loopを記述することによって繰り返しセルをクリックしなくても セルの色を変化させることが出来ます。 しかし、縦列だけをマクロは実行してデータが終わってもそのまま下へどんどん・・・ これでは困るのでデータの最後が切れたらマクロを終了させるために・・・ ***************************************************************** Sub ChooseForm4() Do Until ActiveCell = "" If ActiveCell > 0.2 Then With Selection.Interior .ColorIndex = 6 .Pattern = xlSolid End With End If ActiveCell.Offset(1,0).Range("A1").Select Loop End Sub ******************************************************************** このマクロによっていちいちセルの内容をチェックしなくても良くなりました。 後は列のデータが終了したら隣の列に改行するように記述するだけです。 ******************************************************************* Sub ChooseForm5() Do Until ActiveCell = "" If ActiveCell > 0.2 Then With Selection.Interior .ColorIndex = 6 .Pattern = xlSolid End With End If ActiveCell.Offset(1,0).Range("A1").Select Loop ActiveCell.Offset(-1,0).Range("A1).Select Selection.End(xlup).Select ActiveCell.Offset(1,0).Range("A1").Select End Sub ********************************************************************* さて改行が出来たらその作業さえもマクロにやらせて全ての作業を自動化してしま いましょう。 データを全て選択して(Ctrl + Shift + * )で後はこのマクロを実行すれば全てのデー タを最後まで手を入れることなく終了させることが出来ます。 *********************************************************************** Sub choooseForm() Do Until ActiveCell = "" Do Until ActiveCell = "" If ActiveCell > 0.2 Then With Selection.Interior .ColorIndex = 6 .Pattern = xlSolid End With End If ActiveCell.Offset(1, 0).Range("A1").Select Loop ActiveCell.Offset(-1, 1).Range("A1").Select Selection.End(xlUp).Select ActiveCell.Offset(1, 0).Range("A1").Select ActiveCell.Offset(1, 0).Range("A1").Select Loop End Sub ************************************************************** Bookを操作する *********************************: Bookを1枚追加します。 Sub test1() Workbooks.Add End Sub ********************************* 別にアクティブになっていない Personal.xls Bookを指定する Sub test1() Workbooks("Personal.xls").Activate End Sub *********************************** 1枚目のBookを閉じる Sub test2() Workbooks.Item(1).Close End Sub *************************: Bookを保存する Sub test2() ActiveWorkbook.Save End Sub **************************** WorkSheetを操作する ********************************** Bookの中のWorkSheetを一枚増やします。 Sub test1() WorkSheets.Add End ***************************** 1枚目のシート名をInput Valuesに変える Sub test2() WorkSheets(1).Name = "Input Values" End ***************************** 当然2枚目は・・・・ Sub test3() WorkShets(2).Name = "Input Values" End ****************************** となります。 新しくシートを1枚増やしてさらにそのシート名をInput Values3とするには Sub test4() Worksheet.Add Worksheet(1).Name = "Input Vallues3" End となります。 ************************************************ ワークシート Input Values をコピーして2枚目のシートに貼り付けます。 Sub test5() Worksheets("input Values").Copy Before:=Worksheets(2) End Sub ************************************************ ワークシートInput Values を切り取って2枚目のシートに移動するには Sub test6() WorksheetS("Input Values").Move Before:=Worksheets(2) End Sub ************************************************* 2枚目のブックの1枚目のワークシートの名前を "Old Valus"に変えるには Sub test2() Workbooks(2).Worksheets(1).Name = "Old Values" End Sub **************************************************** 複数のワークシートを操作する ワークシートの1枚目2枚目5枚目をまとめて操作する時にグループ化するには Sub test3() Worksheets(Array(1,2,5)).Select End Sub ***************************************************** ****************************************************************************** .Active expression.Activate expression 必ず指定します。オブジェクトへの参照を表すオブジェクト式を指定し ます。 Activate メソッドでブックをアクティブにすると、ブックはアクティブ ウインドウに 表示されます。次の使用例は、既に開かれている MyBook.xls というブックをアクティ ブにします。 Sub MakeActive() Workbooks("MyBook.xls").Activate End Sub ******************************************************************************* .Add expression.Add(Template) expression 必ず指定します。 Workbooks オブジェクトを表すオブジェクト式を指定します。 Visual Basic で新しいブックを作成するには、Add メソッドを使います。 次の使用例は新しいブックを作成します。 ブックの名前は自動的に BookN になります。 N は数字で、連番になるように付けられます。 ブックの作成後は、新しいブックがアクティブになります。 Sub AddOne() Workbooks.Add End Sub 新しいブックを作成するときに、そのブックをオブジェクト型変数に割り当てると便利 です。 次の使用例では、Add メソッドで返される Workbook オブジェクトを、newBook という オブジェクト型変数に割り当てています。 さらに、変数 newBook でいくつかのプロパティを設定できます。 オブジェクト型変数を使うことで、新しいブックの制御を簡単に記述できます。 Sub AddNew() Set newBook = Workbooks.Add With newBook .Title = "1995 年度 売上高" .Subject = "売上高" .SaveAs filename:="95Sales.xls" End With End Sub ******************************************************************************* .Open expression.Open("FileName") expression 必ず指定します。 対象となる Workbooks オブジェクトまたは RecentFile オブジェクトを表すオブジェ クト式を指定します。 FileName 必ず指定します。文字列型 (String) の値を指定します。 開くブックのファイル名を指定します。 Open メソッドでブックを開くと、ブックは Workbooks コレクションのメンバになりま す。次の使用例は、C ドライブの [MyFolder] フォルダにある、Mybook.xls というブ ックを開きます。 Sub OpenUp() Workbooks.Open("C:\MyFolder\MyBook.xls") End Sub ****************************************************************************** Worksheets(*).Activate インデックス番号は、同じ種類のシートに対して、シート見出しの並び順に基づいて左 から順番に付けられる番号です。次の使用例は、Worksheets プロパティを使って、作 業中のブックのワークシート 1 をアクティブにします。 Sub FirstOne() Worksheets(1).Activate End Sub ******************************************************************************* Sheets(*).Activate すべての種類のシート (ワークシート、グラフ シート、モジュール、およびダイアログ シート) を対象にする場合は、Sheets プロパティを使います。次の使用例は、シート の種類は区別せずに、ブックの 4 番目にあるシートをアクティブにします。 Sub FourthOne() Sheets(4).Activate End Sub ****************************************************************************** Sheets("***").Activate Sheets コレクションには、ワークシート、グラフ シート、モジュール、およびダイア ログ シートのすべてが含まれているので、Sheets プロパティを使うと、どの種類のシ ートにもアクセスできます。次の例は、作業中のブックのシート Graph1 をアクティブ にします。 Sub ActivateChart() Sheets("Graph1").Activate End Sub ****************************************************************************** セルまたはセル範囲の参照方法 Visual Basic では、最初にセルまたはセル範囲を指定し、そのセルやセル範囲に対して 数式の入力や書式の変更などを行う、というような操作がよく行われます。通常では、 セル範囲を指定する操作とプロパティの変更またはメソッドの実行の操作は、1 つのス テートメントの中で行うことができます。 Range オブジェクトは、単一セルを表すことも、セル範囲を表すこともできます。 ******************************************************************************* .Range Range プロパティと A1 形式の参照を使って、セルまたはセル範囲を参照できます。 次の使用例はセル範囲 A1:D5 の書式を太字に変更します。 Sub FormatRange() Workbooks("Book1").Sheets("Sheet1").Range("A1:D5") _ .Font.Bold = True End Sub 次に Range プロパティを使った A1 形式の参照例を示します。 参照 意味 Range("A1") セル A1 Range("A1:B5") セル A1 から B5 まで Range("C5:D9,G9:H16") 複数の範囲の選択 Range("A:A") 列 A 全体 Range("1:1") 行 1 全体 Range("A:C") 列 A から C まで Range("1:5") 行 1 から 5 まで Range("1:1,3:3,8:8") 行 1、3、および 8 Range("A:A,C:C,F:F") 列 A、C、および F ****************************************************************************** .Cells Cells プロパティを使うと、行および列のインデックス番号によって、単一のセルを参 照することができます。このプロパティは、単一のセルを表す Range オブジェクトを 返します。次の使用例では、Cells(6,1) で返された Sheet1 のセル A6 を、Value プ ロパティで 10 に設定します。 Sub EnterValue() Worksheets("Sheet1").Cells(6, 1).Value = 10 End Sub Cells プロパティではインデックス番号の代わりに変数を指定できるので、次の使用例 のようにループを使ってセル範囲の各セルへの操作を行う場合に便利です。 Sub CycleThrough() Dim counter As Integer For counter = 1 To 20 Worksheets("Sheet1").Cells(counter, 3).Value = counter Next counter End Sub ******************************************************************************* セル範囲の各セルをループで操作する Visual Basic では、セル範囲の各セルに対して同じステートメント ブロックを実行す ることがよくあります。この場合、各セルを指定するためのメソッドとループ構造を組 み合わせて処理します。 最初の方法は Cells プロパティと For...Next ループを組み合わせて操作します。Cell s プロパティを使うと、ループのカウンタ変数 (またはその他の変数や式) をセルのイ ンデックス番号として使うことができます。次の使用例は、counter という変数を行番 号として使っています。このプロシージャは、セル範囲 C1:C20 を対象にしてループを 行い、セルの値の絶対値が 0.01 より小さい場合は値を 0 (ゼロ) に設定します。 Sub RoundToZero1() For counter = 1 To 20 Set curCell = Worksheets("Sheet1").Cells(counter, 3) If Abs(curCell.Value) < 0.01 Then curCell.Value = 0 Next counter End Sub 次の方法は Range プロパティで返されるセルのコレクションと For Each...Next ルー プを組み合わせて操作します。For Each...Next ループでは、ループで繰り返されるた びに、オブジェクト型変数に次のセルが自動的に設定されます。次の使用例は、セル範 囲 A1:D10 を対象にしてループを行い、セルの値の絶対値が 0.01 より小さい場合は値 を 0 (ゼロ) に設定します。 Sub RoundToZero2() For Each c In Worksheets("Sheet1").Range("A1:D10").Cells If Abs(c.Value) < 0.01 Then c.Value = 0 Next End Sub ループの対象とするセル範囲の境界が明確でない場合は、CurrentRegion プロパティを 使うと、アクティブ セルの周囲の領域を取得することができます。たとえば、次の使用 例をワークシートで実行すると、アクティブ セルの周囲の領域を対象にしてループを 行い、セルの値の絶対値が 0.01 より小さい場合は値を 0 (ゼロ) に設定します。 Sub RoundToZero3() For Each c In ActiveCell.CurrentRegion.Cells If Abs(c.Value) < 0.01 Then c.Value = 0 Next End Sub ******************************************************************************* ワークシートのすべてのセルを参照する ワークシートを対象にして、インデックス番号を指定せずに Cells プロパティを使うと 、ワークシートのすべてのセルを表す Range オブジェクトを返します。次の使用例は、 アクティブ ブックの Sheet1 のすべてのセルの内容をクリアにします。 Sub ClearSheet() Worksheets("Sheet1").Cells.ClearContents End Sub ******************************************************************************* 他のセルからの相対位置でセルまたはセル範囲を参照する 他のセルからの相対位置でセルを指定するには、通常では Offset プロパティを使いま す。次の例では、作業中のワークシートのアクティブ セルから 1 行下で 3 列右のセ ルの書式に、二重下線を設定します。 Sub Underline() ActiveCell.Offset(1, 3).Font.Underline = xlDouble End Sub メモ マクロ記録のとき、絶対参照の代わりに Offset プロパティを使うように設定す ることができます。マクロを相対参照で記録するには、[ツール] メニューの [マクロ] をポイントして [新しいマクロの記録] をクリックします。表示される [マクロの記録] ダイアログ ボックスでマクロ名などを入力して [OK] をクリックし、表示される [記 録終了] ツールバーの [相対参照] をクリックします。 セル範囲の各セルに対する操作をループで行うには、ループ内で変数の値を変化させな がら Cells プロパティを使います。次の使用例は、3 番目の列にある最初の 20 のセル の値を、5 から 100 まで 5 ずつ増やしながら設定します。Cells プロパティの行イン デックスとして、counter という変数を使います。 Sub CycleThrough() Dim counter As Integer For counter = 1 To 20 Worksheets("Sheet1").Cells(counter, 3).Value = counter * 5 Next counter End Sub ******************************************************************************* Range オブジェクトでセルまたはセル範囲を参照する Range オブジェクトをオブジェクト型変数に割り当てておくと、セル範囲に対する操作 をオブジェクト型変数を使って簡単に記述できます。 次の使用例は、myRange というオブジェクト型変数を宣言し、この変数をアクティブ ブックの Sheet1 のセル範囲 A1:D5 を指すように設定します。これに続くステートメン トでは、Range オブジェクトの代わりに変数名を使って、セル範囲のプロパティを変更 します。 Sub Random() Dim myRange As Range Set myRange = Worksheets("Sheet1").Range("A1:D5") myRange.Formula = "=RAND()" myRange.Font.Bold = True End Sub ******************************************************************************* インデックス番号でセルを参照する Cells プロパティを使うと、行および列のインデックス番号によって、単一のセルを参 照することができます。このプロパティは、単一のセルを表す Range オブジェクトを 返します。次の使用例では、Cells(6,1) で返された Sheet1 のセル A6 を、Value プロ パティで 10 に設定します。 Sub EnterValue() Worksheets("Sheet1").Cells(6, 1).Value = 10 End Sub Cells プロパティではインデックス番号の代わりに変数を指定できるので、次の使用例 のようにループを使ってセル範囲の各セルへの操作を行う場合に便利です。 Sub CycleThrough() Dim counter As Integer For counter = 1 To 20 Worksheets("Sheet1").Cells(counter, 3).Value = counter Next counter End Sub ******************************************************************************* ショートカット形式でセルまたはセル範囲を参照する Range プロパティのショートカットとして、次の使用例のように角かっこ ([ ]) の中 に A1 形式の参照またはセル範囲の名前を記述したものを使うことができます。Range というキーワードを入力したり、クォーテーションで囲む必要はありません。 Sub ClearRange() Worksheets("Sheet1").[A1:B5].ClearContents End Sub Sub SetValue() [MyRange].Value = 30 End Sub ******************************************************************************* 複数のシートを指定する 複数のシートを同時に指定するには、Array 関数を使います。次の使用例は、アクティ ブ ブックの 3 つのシートを選択します。 Sub Several() Worksheets(Array("Sheet1", "Sheet2", "Sheet4")).Select End Sub ******************************************************************************* 複数のセル範囲を参照する 複数のセル範囲を参照するには、必要に応じて次のメソッドを使い分けます。任意の複 数セル範囲を参照する場合は、Range プロパティと Union メソッドを使います。また ワークシートで選択している複数のセル範囲を参照する場合には、Areas プロパティを 使います。 Range プロパティを使う Range プロパティで複数のセル範囲を参照するには、各セル範囲をカンマ (,) で区切 って並べます。次の使用例は、Sheet1 にある 3 つのセル範囲の内容をクリアします。 Sub ClearRanges() Worksheets("Sheet1").Range("C5:D9,G9:H16,B14:D18").ClearContents End Sub セル範囲に名前を付けておくと、Range プロパティで複数のセル範囲を扱う操作が簡単 になります。次の使用例は、名前を付いた 3 つのセル範囲が、すべて同じシートにある 場合に動作します。 Sub ClearNamed() Range("MyRange, YourRange, HisRange").ClearContents End Sub Union メソッドを使う Union メソッドを使うと、複数のセル範囲を 1 つの Range オブジェクトに結合できま す。次の例は、myMultipleRange という Range オブジェクトを宣言し、このオブジェク トをセル範囲 A1:B2 と C3:D4 として定義し、結合されたセル範囲の書式に太字を設定 します。 Sub MultipleRange() Dim r1, r2, myMultipleRange As Range Set r1 = Sheets("Sheet1").Range("A1:B2") Set r2 = Sheets("Sheet1").Range("C3:D4") Set myMultipleRange = Union(r1, r2) myMultipleRange.Font.Bold = True End Sub Areas プロパティを使う Areas プロパティを使うと、複数での選択範囲の中の指定された領域、または領域のコ レクションを参照できます。次の使用例は、選択範囲の中の領域を数えます。複数の領 域がある場合は、警告のメッセージが表示されます。 Sub FindMultiple() If Selection.Areas.Count > 1 Then MsgBox "この操作は、複数の選択範囲には実行できません。" End If End Sub ******************************************************************************* 名前付きセル範囲を参照する A1 形式の参照よりも、名前でセル範囲を指定する方が簡単です。選択したセル範囲に名 前を付けるには、数式バーの左端にある名前ボックスをクリックし、名前を入力して、E nter キーを押します。 名前を付けたセル範囲を参照する 次の使用例は、MyBook.xls というブックの MyRange という名前のセル範囲を参照しま す。 Sub FormatRange() Range("MyBook.xls!MyRange").Font.Italic = True End Sub 次の使用例は、Report.xls というブックの Sheet1!Sales という、シート指定も含んだ 名前のセル範囲を参照します。 Sub FormatSales() Range("[Report.xls]Sheet1!Sales").BorderAround weight:=xlthin End Sub 名前を付けたセル範囲を選択するには、GoTo メソッドを使います。このメソッドは、指 定されたセル範囲があるブックのワークシートをアクティブにし、そのセル範囲を選択 します。 Sub ClearRange() Application.Goto Reference:="MyBook.xls!MyRange" Selection.ClearContents End Sub 上記のアクティブ ブック内にあるセル範囲を選択するには、次の使用例のように記述す ることもできます。 Sub ClearRange() Application.Goto Reference:="MyRange" Selection.ClearContents End Sub 名前を付けたセル範囲に対してループを実行する 次の使用例は、名前を付けたセル範囲の各セルに対する操作を、For Each...Next ステ ートメントを使ってループで実行します。範囲内のセルで、値が limit よりも大きなセ ルは、黄色になります。 Sub ApplyColor() Const limit As Integer = 25 For Each c In Range("MyRange") If c.Value > limit Then c.Interior.ColorIndex = 27 End If Next c End Sub ******************************************************************************* 行または列を参照する 行または列全体を操作するには、Rows プロパティまたは Columns プロパティを使いま す。これらのプロパティは、セル範囲を表す Range オブジェクトを返します。次の使 用例では、Rows(1) で返された Sheet1 の行 1 で、Font オブジェクトの Bold プロパ ティを True に設定します。 Sub RowBold() Worksheets("Sheet1").Rows(1).Font.Bold = True End Sub 次に Rows プロパティ、または Columns プロパティを使った行および列の参照を示し ます。 参照 意味 Rows(1) 行 1 Rows ワークシートのすべての行 Columns(1) 列 1 Columns("A") 列 1 Columns ワークシートのすべての列 複数の行または列を同時に操作するには、オブジェクト型変数を宣言し、Union メソッ ドを使って、複数の Rows プロパティまたは Columns プロパティの呼び出しを結合しま す。次の使用例は、アクティブ ブックのワークシート 1 の行 1、3、および 5 の書式 を太字に変更します。 Sub SeveralRows() Worksheets("Sheet1").Activate Dim myUnion As Range Set myUnion = Union(Rows(1), Rows(3), Rows(5)) myUnion.Font.Bold = True End Sub ******************************************************************************* セルを選択するまたはアクティブにする マウスを使って作業する場合、通常では最初にセルを選択し、次に書式の設定や値の入 力などの操作を行います。Visual Basic の場合、セルへの操作を行う前に、通常のセ ルを選択する必要はありません。 たとえば、Visual Basic でセル D6 に数式を入力するときに、D6 を選択するコードを 記述する必要はありません。次の使用例のように、Range オブジェクトとしてセルを返 し、入力する数式はそのオブジェクトの Formula プロパティに設定します。 Sub EnterFormula() Worksheets("Sheet1").Range("D6").Formula = "=SUM(D2:D5)" End Sub セルを選択せずに、その他のメソッドを使って直接操作する方法については、「セルま たはセル範囲の参照方法」を参照してください。 Select メソッドと Selection プロパティを使う Select メソッドは、シートやシートにあるオブジェクトをアクティブにします。一方、 Selection プロパティは、ブックの作業中のシートで現在選択されているオブジェクト を返します。Selection プロパティを使うときは、あらかじめブックをアクティブにし ます。シートをアクティブ、または選択し、Select メソッドでセル範囲 (またはその 他のオブジェクト) を選択しておく必要があります。 マクロでは、頻繁に Select メソッドと Selection プロパティが組み合わされて記録 されます。Sub プロシージャはマクロ記録で作成されたものです。次の使用例は、 Select メソッドと Selection プロパティを組み合わせて記述したものです。 Sub Macro1() Sheets("Sheet1").Select Range("A1").Select ActiveCell.FormulaR1C1 = "名前" Range("B1").Select ActiveCell.FormulaR1C1 = "住所" Range("A1:B1").Select Selection.Font.Bold = True End Sub 次の使用例は、上記と同じ操作をワークシートおよびセルをアクティブまたは選択せず に行う方法を記述したものです。 Sub Labels() With Worksheets("Sheet1") .Range("A1") = "名前" .Range("B1") = "住所" .Range("A1:B1").Font.Bold = True End With End Sub アクティブ ワークシートでセルを選択する Select メソッドを使ってセルを選択する場合、アクティブでないワークシートでは Sel ect メソッドでセルを選択できないことに注意してください。モジュールから Sub プロ シージャを実行するときには、セル範囲に対して Select メソッドを使う前に、ワーク シートをアクティブにする操作を記述する必要があります。たとえば、次の使用例はア クティブ ブックの Sheet1 から Sheet2 に行をコピーします。 Sub CopyRow() Worksheets("Sheet1").Rows(1).Copy Worksheets("Sheet2").Select Worksheets("Sheet2").Rows(1).Select Worksheets("Sheet2").Paste End Sub 選択範囲内のセルをアクティブにする Activate メソッドを使って、選択範囲内のセルをアクティブにすることができます。 セル範囲を選択している場合でも、アクティブにできるのは単一のセルだけです。次の 使用例はセル範囲を選択し、選択範囲を変更せずに、範囲内の単一のセルをアクティブ にします。 Sub MakeActive() Worksheets("Sheet1").Activate Range("A1:D4").Select Range("B2").Activate End Sub ****************************************************************************** 3-D セル範囲を操作する 複数のシートの同じ位置にあるセル範囲を操作する場合は、Array 関数を使って、各シ ートを指定します。次の使用例は、3-D セル範囲の罫線の書式を設定します。 Sub FormatSheets() Sheets(Array("Sheet2", "Sheet3", "Sheet5")).Select Range("A1:H1").Select Selection.Borders(xlBottom).LineStyle = xlDouble End Sub 次の使用例は、FillAcrossSheets メソッドを使って、Sheet2 のセル範囲からアクティ ブ ブックのすべてのワークシートの対応するセル範囲に、書式とデータを転送します。 Sub FillAll() Worksheets("Sheet2").Range("A1:H1") _ .Borders(xlBottom).LineStyle = xlDouble Worksheets.FillAcrossSheets (Worksheets("Sheet2") _ .Range("A1:H1")) End Sub ******************************************************************************* アクティブ セルを操作する ActiveCell プロパティは、アクティブ セルを表す Range オブジェクトを返します。 次の使用例のように、アクティブ セルでは Range オブジェクトの任意のプロパティま たはメソッドを使うことができます。 Sub SetValue() Worksheets("Sheet1").Activate ActiveCell.Value = 35 End Sub メモ アクティブ セルを操作できるのは、そのセルを含むワークシートがアクティブ になっているときだけです。 他のセルをアクティブ セルにする Activate メソッドを使って、どのセルをアクティブ セルにするかを指定できます。 次の使用例は、セル B5 をアクティブにして、書式を太字に設定します。 Sub SetActive() Worksheets("Sheet1").Activate Worksheets("Sheet1").Range("B5").Activate ActiveCell.Font.Bold = True End Sub メモ セル範囲を選択する場合は、Select メソッドを使います。セル範囲内の単一の セルをアクティブにするには、Activate メソッドを使います。 Offset プロパティを使って、他のセルをアクティブ セルにできます。次の使用例は、 選択範囲内のアクティブ セルに文字列を挿入し、選択範囲を変更せずに、右隣のセル をアクティブ セルにします。 Sub MoveActive() Worksheets("Sheet1").Activate Range("A1:D10").Select ActiveCell.Value = "合計" ActiveCell.Offset(0, 1).Activate End Sub アクティブ セルを囲むセル範囲を選択する CurrentRegion プロパティは、空白の行と列で囲まれたセル範囲を返します。次の使用 例では、アクティブ セルの周囲の空白のセルも含まれるように、選択範囲を拡大します 。これらのセル範囲の書式を、通貨スタイルに設定します。 Sub Region() Worksheets("Sheet1").Activate ActiveCell.CurrentRegion.Select Selection.Style = "通貨" End Sub ******************************************************************************* コレクションからオブジェクトを取得する たとえば、コレクションからオブジェクトを返す Item プロパティを使います。次の使 用例は、Workbook オブジェクトのブック 1 を表す変数 firstBook を設定します。 Set firstBook = Workbooks.Item(1) Item プロパティおよび、Item メソッドは、多くのコレクションの既定プロパティ (既 定メソッド)となっているため、既定の Item というキーワードを省略して、既定プロ パティや既定メソッドを使用するステートメントをより正確に記述することができます 。 Set firstBook = Workbooks(1) 特定のコレクションの詳細については、そのコレクションのオンライン ヘルプまたは 既定プロパティ (既定メソッド) を参照してください。 名前付きオブジェクト ほとんどの Item プロパティでは整数値を指定できますが、オブジェクト名で指定する 方が便利な場合があります。このような場合は、プロパティを使用する前にオブジェク トに名前を付ける必要があります。通常、名前を付けるときはオブジェクトの Name プ ロパティを設定します。次の使用例は、アクティブ ブックに名前付きのワークシート を作成して、そのワークシートを名前で参照します。 ActiveWorkbook.Worksheets.Add.Name = "新規" With Worksheets("新規") .Range("a5:a10").Formula = "=rand()" End With 定義済みのインデックス値 いくつかのコレクションには定義済みのインデックス値が含まれていて、この値を使用 してオブジェクトを取得できます。定義済みインデックス値は、それぞれ定数で表すこ とができます。たとえば、Borders コレクションに対して定数を指定した Item プロパ ティを使用して、境界線を取得できます。 次の使用例は、Sheet1 のセル範囲 A1:G1 までの下の境界線を二重線に設定します。 Worksheets("Sheet1").Range("a1:g1"). _ Borders.Item(xlEdgeBottom).LineStyle = xlDouble ******************************************************************************* Activate この使用例は、ワークシートがアクティブにされると、セル範囲 A1:A10 を並べ替えま す。 Private Sub Worksheet_Activate() Range("a1:a10").Sort Key1:=Range("a1"), Order1:=xlAscending End Sub ****************** この使用例は、ブックが変更されるときに必ずその内容を保存します。 Private Sub Workbook_BeforeClose(Cancel as Boolean) If Me.Saved = False Then Me.Save End Sub ****************** この使用例は、グラフ床面に対する既定のダブルクリックの操作を無効にします。 Private Sub Chart_BeforeDoubleClick(ByVal ElementID As Long, _ ByVal Arg1 As Long, ByVal Arg2 As Long, Cancel As Boolean) If ElementID = xlFloor Then Cancel = True MsgBox "このアイテムでの書式設定は制限されています。" End If End Sub ***************** この使用例は、印刷される前に、アクティブ ブックのすべてのワークシートを再計算 します。 Private Sub Workbook_BeforePrint(Cancel As Boolean) For Each wk in Worksheets wk.Calculate Next End Sub ***************** この使用例は、ブックが保存される前に、ユーザーに保存するかどうかの確認を要求し ます。 Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, _ Cancel as Boolean) a = MsgBox("ブックを本当に保存してよろしいでしょうか。", vbYesNo) If a = vbNo Then Cancel = True End Sub **************** この使用例は、ワークシートが再計算されると、必ず A 列から F 列までのサイズを調 整します。 Private Sub Worksheet_Calculate() Columns("A:F").AutoFit End Sub *************** この使用例は、変更するセルの色を青色にします。 Private Sub Worksheet_Change(ByVal Target as Range) Target.Font.ColorIndex = 5 End Sub *************** この使用例は、グラフにドラッグされたセル範囲のアドレスを表示します。 Private Sub Chart_DragOver() MsgBox Selection.Address End Sub ************** この使用例は、グラフにセル範囲がドラッグ アンド ドロップされると、グラフの種類 を折れ線グラフに変更します。 Private Sub Chart_DragPlot() Chart.ChartType = xlLine End Sub ************** この使用例は、新しいシートをブックの最後に移動します。 Private Sub Workbook_NewSheet(ByVal Sh as Object) Sh.Move After:= Sheets(Sheets.Count) End Sub ************** この使用例は、新しいブックが作成されると、開いているウィンドウを調整します。 Private Sub App_NewWorkbook(ByVal Wb As Workbook) Application.Windows.Arrange xlArrangeStyleTiled End Sub ************** 次の使用例は、ブックが開かれると、[Excel] ウィンドウを最大化します。 Private Sub Workbook_Open() Application.WindowState = xlMaximized End Sub ************** 次の使用例は、グラフのサイズが変更されても、グラフの左上隅を定位置に保持しま す。 Private Sub myChartClass_Resize() With ActiveChart.Parent .Left = 100 .Top = 150 End With End Sub ************* 次の使用例は、ユーザーによってグラフのタイトルが選択されると、メッセージを表示 します。 Private Sub Chart_Select(ByVal ElementID As Long, _ ByVal Arg1 As Long, ByVal Arg2 As Long) If ElementId = xlChartTitle Then MsgBox "グラフのタイトルを変更しないでください。" End If End Sub ************* 次の使用例は、選択範囲がウィンドウの左上隅になるまで、ブックのウィンドウをスク ロールします。 Private Sub Worksheet_SelectionChange(ByVal Target As Range) With ActiveWindow .ScrollRow = Target.Row .ScrollColumn = Target.Column End With End Sub ************ この使用例は、アクティブになったシート名を表示します。 Private Sub Workbook_SheetActivate(ByVal Sh As Object) MsgBox Sh.Name End Sub ************ この使用例は、ブックのシートが計算されると、ワークシート 1 のセル範囲 A1:A100 を並べ替えます。 Private Sub Workbook_SheetCalculate(ByVal Sh As Object) With Worksheets(1) .Range("a1:a100").Sort Key1:=.Range("a1") End With End Sub ********** 次の使用例は、選択範囲のシート名とアドレスをステータス バーに表示します。 Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, _ ByVal Target As Excel.Range) Application.StatusBar = Sh.Name & ":" & Target.Address End Sub ********** 次の使用例は、ブックがアクティブにされると、必ずウィンドウを最大化します。 Private Sub Workbook_WindowActivate(ByVal Wn As Excel.Window) Wn.WindowState = xlMaximized End Sub *********** 次の使用例は、ブックが非アクティブにされるとウィンドウを最小化します。 Private Sub Workbook_WindowDeactivate(ByVal Wn As Excel.Window) Wn.WindowState = xlMinimized End Sub *********** 次の使用例は、ブック ウィンドウのサイズが変更されると実行します。 Private Sub Workbook_WindowResize(ByVal Wn As Excel.Window) Application.StatusBar = Wn.Caption & " のサイズを変更しました。" End Sub *********** この使用例は、ブックが閉じられる前に、ユーザーに閉じてもよいかどうかの確認を要 求します。 Private Sub App_WorkbookBeforeClose(ByVal Wb as Workbook, _ Cancel as Boolean) a = MsgBox("ブックを本当に閉じてよろしいでしょうか。", vbYesNo) If a = vbNo Then Cancel = True End Sub *********** この使用例は、印刷される前にブックのすべてのワークシートを再計算します。 Private Sub App_WorkbookBeforePrint(ByVal Wb As Workbook, _ Cancel As Boolean) For Each wk in Wb.Worksheets wk.Calculate Next End Sub *********** この使用例は、ブックが保存される前に、ユーザーに保存してもよいかどうかの確認を 要求します。 Private Sub App_WorkbookBeforeSave(ByVal Wb As Workbook, _ ByVal SaveAsUI As Boolean, Cancel as Boolean) a = MsgBox("ブックを本当に保存してよろしいでしょうか。", vbYesNo) If a = vbNo Then Cancel = True End Sub *********** この使用例は、新しく作成したシートをブックの最後に移動します。 Private Sub App_WorkbookNewSheet(ByVal Wb As Workbook, _ ByVal Sh As Object) Sh.Move After:=Wb.Sheets(Wb.Sheets.Count) End Sub *********** Do...Loop ステートメントの使い方 関連項目 アプリケーション情報 Do...Loop ステートメントを使用すると、ステートメント ブロックを繰り返し実行で きます。ステートメントは条件が真 (True) である間、または条件が真 (True) になる まで、繰り返し実行されます。 ステートメントの繰り返し - 条件が真 (True) の間 キーワード While を使って、Do...Loop ステートメントの条件を調べる方法には 2 つ あります。ループに入る前に条件を調べる方法と、少なくとも 1 回はループを実行し た後で条件を調べる方法があります。 ChkFirstWhile プロシージャの中で変数 myNum の値を 20 から 9 に変えて設定した場 合、ループ内部のステートメントは 1 回も実行されません。ChkLastWhile プロシージ ャの中で、条件が既に偽 (False) の場合、ループ内部のステートメントを 1 回だけ実 行します。 Sub ChkFirstWhile() counter = 0 myNum = 20 Do While myNum > 10 myNum = myNum - 1 counter = counter + 1 Loop MsgBox "このループは " & counter & " 回繰り返されました。" End Sub Sub ChkLastWhile() counter = 0 myNum = 9 Do myNum = myNum - 1 counter = counter + 1 Loop While myNum > 10 MsgBox "このループは " & counter & " 回繰り返されました。" End Sub ステートメントの繰り返し - 条件が真 (True) になるまで キーワード Until を使って、Do...Loop ステートメントを調べる方法には 2 つありま す。ループに入る前に条件を調べる方法 (ChkFirstUntil プロシージャ) と、少なくと も 1 回はループを実行した後で条件を調べる方法 (ChkLastUntil プロシージャ) があ ります。条件が偽 (False) である間、ループが続行されます。 Sub ChkFirstUntil() counter = 0 myNum = 20 Do Until myNum = 10 myNum = myNum - 1 counter = counter + 1 Loop MsgBox "このループは " & counter & " 回繰り返されました。" End Sub Sub ChkLastUntil() counter = 0 myNum = 1 Do myNum = myNum + 1 counter = counter + 1 Loop Until myNum = 10 MsgBox "このループは " & counter & " 回繰り返されました。" End Sub ループ内での Do...Loop ステートメントの終了 Do...Loop ステートメントを終了するには、Exit Do ステートメントを使います。無限 ループを避けるためなど、ある条件でのみ処理を終了させたい場合には、If...Then...E lse ステートメントの真 (True) のステートメント ブロックの中で Exit Do ステート メントを使います。条件が偽 (False) の場合は、通常どおりループを実行します。 次の例では、変数 myNum に無限ループを発生させる値が代入されています。If...Then. ..Else ステートメントはこの条件を調べ、プログラムの実行を終了し、無限ループか ら抜け出します。 Sub ExitExample() counter = 0 myNum = 9 Do Until myNum = 10 myNum = myNum - 1 counter = counter + 1 If myNum < 10 Then Exit Do Loop MsgBox "このループは " & counter & " 回繰り返されました。" End Sub メモ 無限ループを停止するには、Esc キーまたは Ctrl + Break キーを押します。 For Each...Next ステートメントの使い方 関連項目 アプリケーション情報 For Each...Next ステートメントは、コレクションの各オブジェクトまたは配列の各要 素に対して、一連のステートメント ブロックを繰り返し実行します。Visual Basic で は、ループを実行するごとに、自動的に変数を設定します。たとえば、次のプロシージ ャは、実行中のプロシージャに含まれるフォームを除き、すべてのフォームを閉じます 。 Sub CloseForms() For Each frm In Application.Forms If frm.Caption <> Screen. ActiveForm.Caption Then frm.Close Next End Sub 次のコードは、配列の各要素をループし、各要素の値をインデックス変数 I に設定し ます。 Dim TestArray(10) As Integer, I As Variant For Each I In TestArray TestArray(I) = I Next I セルの範囲内でのループの実行 For Each...Next ループを使って指定した範囲のセルをループします。次のプロシージ ャは、Sheet1 の A1:D10 の範囲でループを実行し、絶対値が 0.01 より小さい数値を 0 に設定します。 Sub RoundToZero() For Each myObject in myCollection If Abs(myObject.Value) < 0.01 Then myObject.Value = 0 Next End Sub For Each...Next ループの終了 For Each...Next ステートメントを終了するには、Exit For ステートメントを使いま す。たとえば、エラーが発生する場合、特定のエラーを調べるために、If...Then...Els e ステートメントまたは Select Case ステートメントの真 (True) ステートメント ブ ロック中で Exit For ステートメントを使います。エラーが発生せず、If...Then...Els e ステートメントが偽 (False) の場合、ループは通常どおりに続行されます。 次の例は、セル範囲 A1:B5 で数値を含まないセルがあるかどうかを調べます。そのよ うなセルが見つかるとメッセージが表示され、Exit For ステートメントによってルー プが終了します。 Sub TestForNumbers() For Each myObject In MyCollection If IsNumeric(myObject.Value) = False Then MsgBox "オブジェクトに数値以外の値が含まれています。" Exit For End If Next End Sub For...Next ステートメントの使い方 関連項目 アプリケーション情報 For...Next ステートメントは、指定した回数分のステートメント ブロックを実行する ときに使います。For ループでは、繰り返したループに応じて値が増減するカウンタ変 数が使われます。 次のプロシージャは、コンピュータの警告音を 50 回に設定します。For ステートメン トには、カウンタ変数 x と、その開始値および終了値を指定しています。Next ステー トメントは、カウンタ変数を 1 ずつ増加させます。 Sub Beeps() For x = 1 To 50 Beep Next x End Sub キーワード Step を使用すると、指定した値でカウンタ変数を増減できます。次の例で は、ループを繰り返すごとにカウンタ変数 j は 2 ずつ加算されます。ループが終了す ると、変数 total は 2、4、6、8、および 10 を合計した値になります。 Sub TwosTotal() For j = 2 To 10 Step 2 total = total + j Next j MsgBox "合計値 " & total End Sub カウンタ変数を減少させるには、キーワード Step に負の値を使います。その場合は、 開始値より小さい値を終了値に指定しなければなりません。次の例では、カウンタ変数 myNum は、ループを繰り返すごとに 2 ずつ減算されます。ループが終了すると、変数 t otal は 16、14、12、10、8、6、4、および 2 を合計した値になります。 Sub NewTotal() For myNum = 16 To 2 Step -2 total = total + myNum Next myNum MsgBox "合計値 " & total End Sub メモ Next ステートメントの後にカウンタ変数名を指定する必要はありません。前の 例では、わかりやすくするためにカウンタ変数名を指定しています。 Exit For ステートメントを使用すると、カウンタが終了値に達する前に、For...Next ステートメントを終了できます。たとえば、エラーが発生する場合、特定のエラーをチ ェックするために、If...Then...Else ステートメントまたは Select Case ステートメ ントの真 (True) のステートメント ブロックで、Exit For ステートメントを使います 。エラーが発生せず、If...Then...Else ステートメントが偽 (False) の場合は、通常 どおりループを実行します。 For...Next ループの高速化 関連項目 アプリケーション情報 整数型 (Integer) は、バリアント型 (Variant) よりも使用するメモリが少ないだけで なく、演算処理も少し速くなります。この違いはわずかですが、大量の処理を行うよう な場合、この差は大きくなります。次に例を示します。 Dim CountFaster As Integer ' 整数型を使用する例。 For CountFaster = 0 to 32766 Next CountFaster Dim CountSlower As Variant ' バリアント型を使用する例。 For CountSlower = 0 to 32766 Next CountSlower 最初の例は、2 番目の例に比べて少しだけ速く実行されます。ただし、CountFaster の 値が 32,767 を超えるとエラーが発生します。この問題を解決するには、CountFaster のデータ型を、実際によりも値の範囲が広い長整数型 (Long) に変更します。一般に サイズの小さなデータ型ほど、演算処理に必要な時間が少なくて済みます。バリアント 型 (Variant) は、他のデータ型と比べて演算処理速度が少し遅くなります。 Function プロシージャの記述方法 関連項目 アプリケーション情報 Function プロシージャは、Function ステートメントおよび End Function ステートメ ントで囲まれた Visual Basic の一連のステートメントです。Function プロシージャ は Sub プロシージャと似ていますが、Function プロシージャは値を返すこともできま す。 Function プロシージャは、呼び出したプロシージャを通じて定数、変数、式などの引 数を取得できます。Function プロシージャが引数を持たない場合、その Function ス テートメントには空のかっこを指定する必要があります。関数はプロシージャ内の 1 つまたは複数のステートメントでプロシージャ名に値を代入することにより、値を返し ます。 次の使用例では、Celsius 関数は、温度を華氏から摂氏に変換します。この関数を Main プロシージャから呼び出すと、引数値を含む変数が関数に渡されます。計算結果は、 呼び出したプロシージャに返され、メッセージ ボックスに表示されます。 Sub Main() temp = Application.InputBox(Prompt:= _ "華氏で温度を入力してください。", Type:=1) MsgBox "温度は摂氏 " & Celsius(temp) & " 度です。" End Sub Function Celsius(fDegrees) Celsius = (fDegrees - 32) * 5 / 9 End Function If...Then...Else ステートメントの使い方 関連項目 アプリケーション情報 If...Then...Else ステートメントを使用すると、条件の値に応じて特定のステートメ ントまたはステートメント ブロックを実行できます。If...Then...Else ステートメン トは、必要なレベルまでネスト (入れ子) 構造にすることができます。ただし、複数の レベルのネスト構造を持つ If...Then...Else ステートメントよりも、Select Case ス テートメントを使用する方が、コードは読みやすくなります。 条件が真 (True) の場合のステートメントの実行 条件が真 (True) の場合に 1 つのステートメントだけを実行するときは、If...Then... Else ステートメントの 1 行の構文を使います。次の例は、キーワード Else を省略し た 1 行の構文を示しています。 Sub FixDate() myDate = #95/2/13# If myDate < Now Then myDate = Now End Sub 複数行のコードを実行するには、複数行の構文を使用する必要があります。この構文に は、次の例のように End If ステートメントが含まれます。 Sub AlertUser(value as Long) If value = 0 Then AlertLabel.ForeColor = "Red" AlertLabel.Font.Bold = True AlertLabel.Font.Italic = True End If End Sub 条件に応じたステートメントの実行 条件に応じて、実行可能な 2 つのブロックのステートメントを定義する場合には、If.. .Then...Else ステートメントを使います。条件が真 (True) の場合には、あるブロッ クが実行され、偽 (False) の場合には、別のブロックが実行されます。 Sub AlertUser(value as Long) If value = 0 Then AlertLabel.ForeColor = vbRed AlertLabel.Font.Bold = True AlertLabel.Font.Italic = True Else AlertLabel.Forecolor = vbBlack AlertLabel.Font.Bold = False AlertLabel.Font.Italic = False End If End Sub 2 番目の条件のテスト If...Then...Else ステートメントに ElseIf ステートメントを追加して、最初の条件 が偽 (False) の場合に 2 番目の条件をテストすることができます。たとえば、次の例 の Function プロシージャは、仕事別にボーナスを計算します。Else ステートメント の後のステートメントは、If ステートメントおよび ElseIf ステートメントの条件が すべて偽 (False) の場合に実行されます。 Function Bonus(performance, salary) If performance = 1 Then Bonus = salary * 0.1 ElseIf performance = 2 Then Bonus = salary * 0.09 ElseIf performance = 3 Then Bonus = salary * 0.07 Else Bonus = 0 End If End Function Property プロシージャの記述方法 関連項目 アプリケーション情報 Property プロシージャは、プログラマが独自のプロパティを作成し、処理するための V isual Basic の一連のステートメントです。 Property プロシージャを使用すると、フォーム、標準モジュール、およびク ラス モジュールの取得専用のプロパティを作成することができます。 プロパティの値が設定されている場合に実行しなければならないコードでは、 パブリック変数の代わりに Property プロシージャを使うことをお勧めします。 パブリック変数と異なり、Property プロシージャには、オブジェクト ブラウザで指定 したヘルプのコンテキスト文字列を設定することができます。 Property プロシージャを作成した場合、そのプロシージャは定義されたモジュールの プロパティになります。Property プロシージャには、次の 3 種類があります。 プロシージャ 内容 Property Let プロパティに値を設定するプロシージャ Property Get プロパティの値を取得するプロシージャ Property Set オブジェクトへの参照を設定するプロシージャ Property プロシージャを宣言する構文は次のとおりです。 [Public | Private] [Static] Property {Get | Let | Set} propertyname_ [(argument s)] [As type] statements End Property 通常、Property プロシージャは 2 つ 1 組で使います。この組み合わせは、Property L et プロシージャと Property Get プロシージャ、または Property Set プロシージャと Property Get プロシージャのいずれかです。Property Get プロシージャだけを宣言 した場合は、値の取得のみ可能なプロパティが作成されます。また、3 種類の Property プロシージャをすべて組み合わせて使うこともできます。この場合は、バリアント型 ( Variant) 変数を使用すると便利です。オブジェクトまたは他のデータ型の情報を格納 することができるのは、バリアント型 (Variant) だけです。Property Set プロシージ ャはオブジェクトを対象としていますが、Property Let プロシージャはオブジェクト を対象としていません。 Property プロシージャを宣言する場合の引数の指定方法は、次の表に示すとおりです。 プロシージャ 宣言の構文 Property Get Property Get propname(1, ..., n) As type Property Let Property Let propname(1, ...,,,, n, n+1) Property Set Property Set propname(1, ..., n, n+1) 同じ名前の Property プロシージャの宣言では、1 番目の引数から、最後から 2 番目 の引数まで (1, ..., n)、それぞれ同じ名前とデータ型を使う必要があります。 Property Get プロシージャの宣言では、Property Let プロシージャまたは Property S et プロシージャの宣言よりも 1 つ少ない引数を指定します。Property Get プロシージャのデータ型は、関連する Property Let プロシージャまたは Property Se t プロシージャの宣言の最後の引数 (n+1 番目の引数) と同じデータ型にしてください 。たとえば、次のような Property Let プロシージャを宣言する場合、Property Get プロシージャの宣言では、Property Let プロシージャの引数と同じ名前とデータ型を 持つ引数を指定する必要があります。 Property Let Names(intX As Integer, intY As Integer, varZ As Variant) ' ステートメント End Property Property Get Names(intX As Integer, intY As Integer) As Variant ' ステートメント End Property Property Set プロシージャを宣言する場合、最後の引数のデータ型は、オブジェクト型 (Object) またはバリアント型 (Variant) でなければなりません。 Select Case ステートメントの使い方 関連項目 アプリケーション情報 1 つの条件式の値と複数のステートメント ブロックごとに異なる値を比較する場合、If ...Then...Else ステートメントの ElseIf ステートメントを使用する代わりに、Select Case ステートメントを使います。If...Then...Else ステートメントは、ElseIf ステート メントごとに異なる条件式を記述しますが、Select Case ステートメントは、実行する ステートメント ブロックの先頭で、1 つの条件式を記述します。 次の例では、Select Case ステートメントはプロシージャに渡される引数 performance と各 Case ステートメントの値を比較します。各 Case ステートメントには、複数の 値、範囲指定した値、または値と比較演算子を組み合わせて指定できます。省略可能な Case Else ステートメントは、Select Case ステートメントがいずれの Case ステート メントの値とも一致しない場合に実行されます。 Function Bonus(performance, salary) Select Case performance Case 1 Bonus = salary * 0.1 Case 2, 3 Bonus = salary * 0.09 Case 4 To 6 Bonus = salary * 0.07 Case Is > 8 Bonus = 100 Case Else Bonus = 0 End Select End Function Sub プロシージャと Function プロシージャの呼び出し 関連項目 アプリケーション情報 Sub プロシージャを別のプロシージャから呼び出すには、プロシージャ名を入力し、必 要な引数の値を指定します。Call ステートメントは必要ありませんが、Call ステート メントを記述する場合は、引数をかっこで囲まなければなりません。 Sub プロシージャを使って、複数のプロシージャをまとめて記述することにより、コー ドを理解しやすく、簡単にデバッグできるようにすることが可能です。次のコード例で は、 Sub プロシージャ Main は Sub プロシージャ MultiBeep を呼び出し、引数として値 56 を引き渡します。MultiBeep が実行されると、制御は Main に戻り、Main は、 Sub プロシージャ Message を呼び出します。Message は、メッセージ ボックスを表示 します。ユーザーが [OK] をクリックすると、制御は Main に戻り、Main は終了しま す。 Sub Main() MultiBeep 56 Message End Sub Sub MultiBeep(numbeeps) For counter = 1 To numbeeps Beep Next counter End Sub Sub Message() MsgBox "休憩の時間です。" End Sub 複数の引数を持つ Sub プロシージャの呼び出し 次のコード例は、複数の引数を持つ Sub プロシージャを呼び出す方法として、2 つの 方法を示しています。2 度目に HouseCalc を呼び出すときは、Call ステートメントを 使用するので、引数をかっこで囲む必要があります。 Sub Main() HouseCalc 99800, 43100 Call HouseCalc(380950, 49500) End Sub Sub HouseCalc(price As Single, wage As Single) If 2.5 * wage <= 0.8 * price Then MsgBox "この家は購入不可能です。" Else MsgBox "この家は購入可能です。" End If End Sub Function プロシージャ呼び出し時のかっこの使い方 関数の戻り値を使用するには、次のコード例のように、式の中で関数を変数に代入して 、引数をかっこで囲みます。 Answer3 = MsgBox("現在の給与に満足していますか ?", 4, "質問 3") また、関数の戻り値が不要の場合は、Sub プロシージャを呼び出すときと同じ方法で関 数を呼び出すことができます。次のコード例のように、かっこを省略して引数リストを 指定し、関数を変数に代入しないように記述します。 MsgBox "作業が完了しました。", 0, "作業ボックス" 注意 このコード例で、引数をかっこで囲むと、構文エラーになります。 名前付き引数の引き渡し Sub プロシージャおよび Function プロシージャのステートメントは、名前付き引数を 使って、呼び出すプロシージャに値を引き渡すことができます。名前付き引数を使う場 合、構文で決まっている記述順序に関係なく、任意の順序で指定できます。名前付き引 数に値を代入するには、引数名、コロンと等号 (:=)、引数に代入する値の順で記述し ます。 次の例は、名前付き引数を使って MsgBox 関数を呼び出します。戻り値は無視します。 MsgBox Title:="作業ボックス", Prompt:="作業が完了しました。" 次の例は、名前付き引数を使って MsgBox 関数を呼び出します。戻り値は、変数 answer 3 に代入されます。 answer3 = MsgBox(Title:="質問 3", _ Prompt:="現在の給与に満足していますか ?", Buttons:=4) Sub プロシージャの記述方法 関連項目 アプリケーション情報 Sub プロシージャは、Sub ステートメントと End Sub ステートメントの間の、Visual B asic の一連のステートメントです。Sub プロシージャは、処理を実行するだけで値は 返しません。Sub プロシージャは、呼び出したプロシージャを通じて定数、変数、また は式などの引数を取得できます。Sub プロシージャが引数を持たない場合、その Sub ステートメントには空のかっこを指定する必要があります。 次の Sub プロシージャは、各行を説明するコメントを指定します。 ' GetInfo という名前のプロシージャを宣言します。 ' この Sub プロシージャは引数を持ちません。 Sub GetInfo() ' answer という名前の文字列変数を宣言します。 Dim answer As String ' InputBox function の戻り値を answer に代入します。 answer = InputBox(Prompt:="名前を入力してください。") ' 条件付きの If...Then...Else ステートメント If answer = Empty Then ' MsgBox 関数を呼び出します。 MsgBox Prompt:="名前が入力されていません。" Else ' MsgBox 関数は変数と連結しました。 MsgBox Prompt:="あなたの名前は " & answer & " です。" ' If...Then...Else ステートメントを終了します。 End If ' Sub プロシージャを終了します。 End Sub Visual Basic ステートメントの作成 関連項目 アプリケーション情報 Visual Basic 内のステートメントは、1 つの完結した命令です。ステートメントには 、キーワード、演算子、変数、定数、および式を指定できます。各ステートメントは、 次のいずれかに分類されます。 宣言ステートメント。変数、定数、またはプロシージャに名前を付け、データ 型も指定できます。 宣言ステートメントの記述方法 代入ステートメント。変数または定数に値や式を代入します。 代入ステートメントの記述方法 実行可能なステートメント。処理を起動します。このステートメントは、メソッドまた は関数を実行し、コードのブロック間をループしたり分岐することができます。実行可 能なステートメントには、通常算術演算子や条件演算子が含まれます。 実行可能なステートメントの記述方法 複数行のステートメントの作成 ステートメントは、通常、1 行に記述できますが、行継続文字を使用してステートメン トを次の行に続けることができます。次の例では、MsgBox 関数を 3 行に継続して記述 しています。 Sub DemoBox() 'このプロシージャは文字列を宣言し、 ' 値 Claudia を代入し、 ' 次に連結メッセージを表示します。 Dim myVar As String myVar = "Hanako" MsgBox Prompt:="こんにちは " & myVar, _ Title:="グリーティング ボックス", _ Buttons:=vbExclamation End Sub コメントの記述 コメントはコードを見る人に、プロシージャや特定の命令についての説明を提供します 。Visual Basic はプロシージャを実行するときに、コメントを無視します。コメント 行は、先頭にクォーテーション (') または Rem ステートメントのいずれかと、その後 ろにスペースを挿入することにより、プロシージャの任意の場所に記述できます。コメ ントをステートメントと同じ行に記述するには、ステートメントの後にクォーテーショ ンを挿入し、コメントを記述します。特に指定しない限り、コメントは緑色の文字列で 表示されます。 構文エラーの調査 コード行を入力した後、Enter キーを押したときにその行が赤で表示されたり、エラー メッセージが表示された場合、ステートメントの誤りを見つけ、訂正する必要があり ます。 Visual Basic の構文の概要 関連項目 アプリケーション情報 Visual Basic ヘルプ トピックのメソッド、ステートメント、または関数の構文は、メ ソッド、ステートメント、または関数を正しく使用するために必要なすべての要素を示 しています。トピックの例では、最も一般的な構文要素の参照方法を示しています。 Activate メソッドの構文 object.Activate Activate メソッドの構文の斜体文字 "object" は、ユーザーが指定する情報のプレー スホルダです。この場合は、オブジェクトを返すコードを指定します。太字の文字は、 記述どおりに入力しなければなりません。たとえば、次のプロシージャは、現在作業中 の文書で 2 つ目のウィンドウをアクティブにします。 Sub MakeActive() Windows(2).Activate End Sub MsgBox 関数の構文 MsgBox(prompt[, buttons] [, title] [, helpfile, context]) MsgBox 関数の構文の中の各斜体文字は、関数の名前付き引数です。角かっこで囲まれ た引数は、省略可能です。Visual Basic のコードを記述するときには、この角かっこ を付けないでください。この MsgBox 関数の構文で必ず指定しなければならない引数は 、prompt プロンプトの文字列だけです。 関数やメソッドの引数は、位置または名前によってコードに指定します。引数を位置で 指定するには、構文で決められた指定順序に従い、次の例のように各引数をカンマで区 切って指定します。 MsgBox "答えは正解です。",0,"Answer Box" 引数を名前で指定するには、引数名、コロンと等号 (:=)、引数に代入する値の順で記 述します。名前付き引数の場合、次の例のように任意の順序で指定できます。 MsgBox Title:="解答ボックス", Prompt:="答えは正解です。" 関数およびいくつかのメソッドの構文では、引数をかっこで囲んで指定します。こうし た関数やメソッドは値を返すので、引数をかっこで囲み、値を変数に代入する必要があ ります。戻り値を無視したり、引数を渡さない場合は、引数をかっこで囲まないでくだ さい。値を返さないメソッドは、引数をかっこで囲む必要はありません。この表記規則 は、位置で指定する引数または名前付き引数のどちらを使用する場合にも適用されます 。 次の例では、MsgBox 関数は、変数 myVar に格納される選択ボタンの番号を返します。 戻り値が使用されるため、引数をかっこで囲む必要があります。別のメッセージ ボッ クスは、変数の値を表示します。 Sub Question() myVar = MsgBox(Prompt:="私は自分の仕事を楽しんでいます。", _ Title:="解答ボックス", Buttons:="4") MsgBox myVar End Sub Option ステートメントの構文 Option Compare {Binary | Text | Database} Option Compare ステートメントの構文では、中かっこ ({}) と垂直線 (|) によって 3 つの項目から必ず 1 つを選択しなければならないことを示します。Visual Basic の コードを記述するときには、この中かっこを付けないでください。たとえば、次のステ ートメントは、モジュール内の文字列を大文字小文字を区別しない並べ替え順序で比較 することを指定します。 Option Compare Text Dim ステートメントの構文 Dim varname[([subscripts])] [As type] [, varname[([subscripts])] [As type]] . . . Dim ステートメント構文では、Dim は必ず指定しなければならないキーワードです。要 素の中で必ず指定しなければならない要素は、varname (変数名) だけです。たとえば 、次のステートメントは 3 つの変数 myVar、nextVar、および thirdVar を作成します 。これらの変数は、自動的にバリアント型 (Variant) 変数として宣言されます。 Dim myVar, nextVar, thirdVar 次の例は、変数を文字列型 (String) の変数として宣言します。特定のデータ型を指定 すると、メモリを節約できます。また、コード中のエラーも見つけやすくなります。 Dim myAnswer As String 1 つのステートメントで複数の変数を宣言するには、各変数のデータ型を指定します。 データ型を指定しない変数は、自動的にバリアント型 (Variant) として宣言されます。 Dim x As Integer, y As Integer, z As Integer 次のステートメントでは、変数 x と変数 y は、バリアント型 (Variant) として宣言 されます。変数 z だけが、整数型 (Integer) として指定されています。 Dim x, y, z As Integer 配列変数を宣言する場合は、かっこを付ける必要があります。インデックス番号は省略 可能です。次のステートメントは、動的配列 myArray を宣言します。 Dim myArray() With ステートメントの使い方 関連項目 アプリケーション情報 With ステートメントを使用すると、一度指定したオブジェクトやユーザー定義型に対 してオブジェクト名の再指定を省略して、一連のステートメントを実行できます。With ステートメントを実行すると、プロシージャの実行速度が向上します。また、オブジ ェクトを繰り返し入力をする必要がありません。 次の例は、セル範囲に数値 30 を入力し、書式を太字に設定します。また、内部の色を 黄色に設定します。 Sub FormatRange() With Worksheets("Sheet1").Range("A1:C10") .Value = 30 .Font.Bold = True .Interior.Color = RGB(255, 255, 0) End With End Sub 処理効率を高めるために、With ステートメントをネスト (入れ子) 構造にすることが できます。次の例は、セル A1 に数式を挿入し、次にフォントの書式を設定します。 Sub MyInput() With Workbooks("Book1").Worksheets("Sheet1").Cells(1, 1) .Formula = "=SQRT(50)" With .Font .Name = "Arial" .Bold = True .Size = 8 End With End With End Sub オブジェクト、プロパティ、メソッド、およびイベントの概要 関連項目 アプリケーション情報 オブジェクトは、ワークシート、セル、グラフ、フォーム、レポートなど、アプリケー ションの要素を表します。Visual Basic コードでは、オブジェクトのメソッドの 1 つ を使ったり、プロパティのいずれかの値を変更する前に、対象となるオブジェクトを識 別する必要があります。 コレクションは、通常、中に複数の異なる種類のオブジェクトを含むオブジェクトです 。ただし、常に異なる種類のオブジェクトを含んでいるとは限りません。たとえば、Mic rosoft Excel では、Workbooks コレクションは開いているすべての Workbook オブジ ェクトを含みます。Visual Basic では、Forms コレクションはアプリケーションのす べての Form オブジェクトを含みます。 コレクションの要素は、数値または名前で識別できます。たとえば、次のプロシージャ では、Workbooks(1) は、1 番目の開いている Workbook オブジェクトを識別します。 Sub CloseFirst() Workbooks(1).Close End Sub 次のプロシージャは、文字列として指定した名前を使って Form オブジェクトを識別し ます。 Sub CloseForm() Forms("MyForm.frm").Close End Sub オブジェクトが共通のメソッドを共有している場合、オブジェクトのコレクション全体 を処理することもできます。たとえば、次のプロシージャは、開いているフォームをす べて閉じます。 Sub CloseAll() Forms.Close End Sub メソッドを使うと、コントロール内のオブジェクトが行う動作を操作することができま す。たとえば、次の例で示す Add メソッドは、コンボ ボックスに新しい項目を追加す るための、ComboBox オブジェクトのメソッドです。 次のプロシージャは、Add メソッドを使ってコンボ ボックス (ComboBox) コントロー ルに新しい項目を追加します。 Sub AddEntry(newEntry as String) Combo1.Add newEntry End Sub プロパティは、サイズ、色、画面の位置などオブジェクトの特徴や、使用可能または表 示/非表示などの動作を定義する属性です。オブジェクトの特徴を変更するには、その プロパティ値を変更します。 プロパティに値を設定するには、対象となるオブジェクトの後ろに、ピリオド、プロパ ティ名、等号 (=)、新しいプロパティ値の順で記述します。たとえば、次のプロシージ ャは、 Caption プロパティを設定して Visual Basic フォームのキャプションを変更します。 Sub ChangeName(newTitle) myForm.Caption = newTitle End Sub プロパティによっては、設定できないものがあります。各プロパティのヘルプ トピッ クを参照すると、そのプロパティが値の取得および設定が共に可能であるか、取得のみ 可能であるか、または設定のみ可能であるかがわかります。 オブジェクトのプロパティのいずれかの値を取得することで、オブジェクトに関する情 報を取得できます。次のプロシージャは、メッセージ ボックスを使って、現在アクテ ィブなフォームの一番上に配置されているタイトルを表示します。 Sub GetFormName() formName = Screen.ActiveForm.Caption MsgBox formName End Sub マウスのクリックや、キーを押すなど、オブジェクトで認識される動作をイベントと呼 びます。これらのイベントに対し、どのような処理を実行するかをコードで記述できま す。ユーザーの操作やプログラム コードの結果に対してイベントを発生させたり、シ ステムでイベントを発生させることもできます。 オブジェクトの取得 すべてのアプリケーションは、それに含まれるオブジェクトを返す方法を備えています 。ただし、その方法はオブジェクトにより異なるため、アプリケーションで使っている オブジェクトまたはコレクションのヘルプ トピックを参照し、オブジェクトを返す方 法を確認してください。 パラメータ配列の概要 関連項目 アプリケーション情報 パラメータ配列を使用すると、引数の配列をプロシージャに渡すことができます。プロ シージャを定義するときに、配列内の要素数が不明でも問題ありません。 パラメータ配列を示すには、キーワード ParamArray を使います。この配列は、バリア ント型 (Variant) の配列として宣言し、プロシージャの定義では、最後の引数として 指定する必要があります。 次の例は、パラメータ配列を持つプロシージャの定義方法を示しています。 Sub AnyNumberArgs(strName As String, ParamArray intScores() As Variant) Dim intI As Integer Debug.Print strName; " 点" ' UBound 関数を使用して、配列の上限を決定します。 For intI = 0 To UBound(intScores()) Debug.Print " "; intScores(intI) Next intI End Sub 次の例は、このプロシージャの呼び出し方法を示しています。 AnyNumberArgs "Jamie", 10, 26, 32, 15, 22, 24, 16 AnyNumberArgs "Kelly", "高", "低", "平均", "高" 実行可能なステートメントの記述方法 関連項目 アプリケーション 実行可能なステートメントは、処理を起動します。このステートメントは、メソッドま たは関数を実行し、コードのブロック間をループしたり分岐することができます。実行 可能なステートメントには、通常、算術演算子や条件演算子が含まれます。 次の例は、For Each...Next ステートメントを使用して、アクティブな Microsoft Exce l のブックの Sheet1 の MyRange という名前の範囲の各セルに対して操作を繰り返し ます。変数 c は、MyRange に含まれるセルのコレクション内の 1 つのセルです。 Sub ApplyFormat() Const limit As Integer = 33 For Each c In Worksheets("Sheet1").Range("MyRange").Cells If c.Value > limit Then With c.Font .Bold = True .Italic = True End With End If Next c MsgBox "All done!" End Sub 上記の例の If...Then...Else ステートメントは、セルの値を調べます。セルの値が 33 よりも大きい場合、With ステートメントはそのセルに、Font オブジェクトの Bold プロパティと Italic プロパティを設定します。If...Then...Else ステートメントは、 End If ステートメントで終了します。 With ステートメントで指定したステートメントは、キーワード With の後のオブジェ クトで自動的に実行されるため、オブジェクト名の記述を省略できます。 Next ステートメントは、範囲 MyRange に含まれるセルのコレクション内の次のセルを 呼び出します。 MsgBox 関数は Visual Basic の組み込みのダイアログ ボックスを表示して、Sub プロ シージャが終了したことを示すメッセージを表示します。 代入ステートメントの記述方法 関連項目 アプリケーション情報 代入ステートメントは、値または式を変数や定数に代入します。代入ステートメントに は、必ず等号 (=) が含まれます。次の例は、InputBox 関数の戻り値を変数 yourName に代入します。 Sub Question() Dim yourName As String yourName = InputBox("名前を入力してください。") MsgBox "あなたの名前は " & answer & " です。" End Sub Let ステートメントは省略可能で、通常省略されます。たとえば、上記の代入ステート メントは、次のようにも記述できます。 Let yourName = InputBox("名前を入力してください。") Set ステートメントは、オブジェクトとして宣言された変数にオブジェクトを代入しま す。キーワード Set は必ず指定します。次の例では、Set ステートメントはオブジェ クト変数 myCell に Sheet1 の範囲を代入します。 Sub ApplyFormat() Dim myCell As Range Set myCell = Worksheets("Sheet1").Range("A1") With myCell.Font .Bold = True .Italic = True End With End Sub プロパティ値を設定するステートメントも、代入ステートメントです。次の例は、アク ティブ セルに Font オブジェクトの Bold プロパティを設定します。 ActiveCell.Font.Bold = True インターネットスタートページ 鈴木維一郎 石橋三重子

         
               
                   

©2000 kg-group Inc.