KAIHATSUGIKEN GROUP

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








   To be continue.......  



   To be continue.......