Excel VBA 基本文法

Excel VBA のトップに戻る
Excel VBA 目次

Select Case ステートメントを使った分岐

ブックを開いた時に実行(イベント)
MouseMove イベント
2種類のボタン
「フォーム」の「オプション・ボタン」を使う
連続数を配列に割り当てるための算術
戻り値が複数の関数を作る(ユーザ定義型)
 ・「ファイルを開くダイアログ」で指定
 ・Excelのセルをポイントして指定

索引

Select Case ステートメントを使った分岐

 条件式の値に従って、複数のステートメント ブロックのいずれかを実行させるフロー制御では、If Then 以外に Select Caseステートメントが有ります。
 これを使うと、コードが簡単になる場合が多々あるので、ぜひ頭に入れておきましょう。
 下の例は、Select Case を入れ子(nest)にして使っています。
 このExcel を、ダウンロードできます。→select.xls


Option Explicit

    Dim 行 As Integer
    Dim 集計配列(2, 3)
    Dim 乱数 As Integer


Sub 分類()

    '男女、身長分類のカウント
    Dim クラス As String
    Dim 性別 As String
    Dim 身長 As Single
    
    Randomize '乱数の初期化
    
    Call 配列初期化
    
    クラス = Range("A2").Value 'クラスの変わり目を検出するための変数
    
    For 行 = 2 To Cells(ActiveSheet.Rows.Count, 1).End(xlUp).Row

        If クラス <> Range("A1").Cells(行, 1).Value Then
        'クラスが変わった都度、集計結果を出力する。
            Call 集計出力
            クラス = Range("A1").Cells(行, 1).Value
        End If
        
        性別 = Range("C1").Cells(行, 1).Value
        身長 = Range("D1").Cells(行, 1).Value
    
        Select Case 性別
            Case "男"
                Select Case 身長
                    Case Is < 125
                        集計配列(1, 1) = 集計配列(1, 1) + 1
                    
                    Case Is < 135
                        集計配列(1, 2) = 集計配列(1, 2) + 1
                    
                    Case Is >= 135
                        集計配列(1, 3) = 集計配列(1, 3) + 1
                  
                End Select
                
            Case "女"
                Select Case 身長
                    Case Is < 130
                        集計配列(2, 1) = 集計配列(2, 1) + 1
                    
                    Case Is < 140
                        集計配列(2, 2) = 集計配列(2, 2) + 1
                    
                    Case Is >= 140
                        集計配列(2, 3) = 集計配列(2, 3) + 1
                        
                End Select
        End Select
                    
    Next 行 '一列目のデータの最後まで
    
    Call 集計出力 '最後のクラスの結果を出力

End Sub

Private Sub 配列初期化()

    Erase 集計配列   '配列の初期化

    集計配列(1, 0) = "男"
    集計配列(2, 0) = "女"
    集計配列(0, 1) = "小"
    集計配列(0, 2) = "中"
    集計配列(0, 3) = "大"

End Sub

Private Sub 集計出力()

    Range("F1").Cells(行 - 3, 1).Resize(3, 4).Value = 集計配列
    '結果の配列を一気にセルに書き出します
    
    乱数 = Int(Rnd * 50)  '余興で、背景色を乱数で決めます
    Range("E1").Cells(行 - 3, 1).Value = "色:" & 乱数
    Range("E1").Cells(行 - 3, 1).HorizontalAlignment = xlCenter
    
    Range("F1").Cells(行 - 3, 1).Resize(3, 4).Interior.ColorIndex = 乱数
    
    Call 配列初期化

End Sub

 解説:
 Select Case ステートメントの構文は、次の指定項目から構成されます。
 引数 testexpression が Case 節の引数 expressionlist のいずれかの式に一致すると、Case 節の次のステートメントがその次の Case 節まで実行されます。
 Case 節が最後の節の場合は、End Select まで実行されます。
 ブロックの実行が終わると、制御は End Select の次のステートメントに移ります。
 引数 testexpression が複数の Case 節に一致するときは、最初に一致した Case 節に続くステートメントだけが実行されます。

 構文
Select Case testexpression
[Case expressionlist-n
[statements-n]] ...
[Case Else
[elsestatements]]

End Select

testexpression 任意の数式または文字列式を、必ず指定します。
expressionlist-n Case 節がある場合は、必ず指定します。次の形式で指定します。また、複数指定するときは、カンマ (,) で区切ります。
expression
expression To expression
Is comparisonoperator expression

 引数 expression には数式または文字列を、引数 comparisonoperator には比較演算子を指定します。
 キーワード To は、値の範囲を指定するキーワードです。キーワード To を使って値の範囲を指定するときは、小さい方の値を先 (左側) に指定してください。
 キーワード Is は、値の範囲を指定するキーワードで、Is 演算子と Like 演算子以外の比較演算子と共に使われます。キーワード Is は指定しなくても自動的に設定されます。

statements-n 引数 testexpression が引数 expressionlist-n のいずれかと一致するとき、一致した引数 statements-n のステートメントが実行されます。
elsestatements 引数 testexpression が Case 節のいずれとも一致しないとき、引数 elsestatements のステートメントが実行されます。

 補足1:
 Case Else 節を使用して引数 testexpression がどの Case 節の引数 expressionlist にも一致しなかったときに実行する引数 elsestatements を指定します。
 Case Else ステートメントは必ずしも必要ではありませんが、予測できない引数 testexpression の値を処理するために、Select Case ブロックに Case Else ステートメントを記述することをお勧めします。
 どの Case 節の引数 expressionlist も引数 testexpression と一致しない場合に Case Else ステートメントが存在しないと、End Select の次のステートメントまで実行が継続します。

 補足2:
Case 節には複数の式や範囲を指定できます。次の例を参照下さい。
Case 1 To 4, 7 To 9, 11, 13, Is > MaxNumber

 また、文字列の範囲や複数の文字列式を指定することもできます。次に示す Case 節では、"everything" と、アルファベット順に並んだ "nuts" から "soup" の間にある文字列、TestItem の現在の値のいずれかに等しい文字列が一致します。
Case "everything", "nuts" To "soup", TestItem


この種類の目次に戻る↑ 索引へ↓ トップページに戻る


ブックを開いた時に実行(イベント)

 Excelのブックを開いたときに、メッセージを表示する事例です。
 このプログラムは、「ThisWorkbook」クラスモジュールに登録します。
標準モジュールに登録しても動きません。

「ThisWorkbook」クラスモジュールにイベントを登録

Option Explicit
Private Sub Workbook_Open()

    MsgBox "「品目指定」のシートに、" _
    & vbCr & "一つの品目番号、一つの地域を登録して、" _
    & vbCr & "マクロを走らせます。"
End Sub

 解説:
 ブック オブジェクトのイベントは、ブックの変更、ブックのシートの変更、アドインの変更、およびピボットテーブルの変更によって発生します。既定でこれらのイベントは有効となっています。
 ブックのイベント プロシージャを表示するには、元のサイズに戻されたり、最小化されたブック ウィンドウのタイトル バーを右クリックし、ショートカット メニューの [コードの表示] をクリックします。[プロシージャ] ボックスからイベント名をクリックします。

次の使用例は、ブックが開かれると、必ずウィンドウを最大化します。

Sub Workbook_Open()
    Application.WindowState = xlMaximized
End Sub

 ワークシート上のセル選択の変更や、セル内容の変更をイベントで検出する場合は、各ワークシートのコードページに、イベントを記述します。

この種類の目次に戻る↑ 索引へ↓ トップページに戻る

ブックを閉じる時に実行(イベント)

 BeforeClose イベントは、ブックを閉じる前に発生します。ブックが変更された場合、ユーザーに変更内容の保存を要求する前に、このイベントが発生します。
 このプログラムは、「ThisWorkbook」クラスモジュールに登録します。

Private Sub Workbook_BeforeClose(Cancel As Boolean)

Cancel   イベントが発生すると、False が渡されます。イベント プロシージャでこの引数に True を設定すると、閉じる操作が停止し、ブックは開いたままとなります。

 使用例
 次の例は、ブックが変更されたときは必ずその内容を保存します。

Private Sub Workbook_BeforeClose(Cancel as Boolean)
    If Me.Saved = False Then Me.Save
End Sub

 次の例は、ブックを終了するとき、TaskClean を使って、起動中の BrMousNT を終了させます。

Private Sub Workbook_BeforeClose(Cancel As Boolean)
   Dim TaskClean起動 As Variant
   TaskClean起動 = Shell("C:\tool\TaskClean\TaskClean.exe -pc BrMousNT.exe")

End Sub

この種類の目次に戻る↑ 索引へ↓ トップページに戻る

MouseMove イベント

 MouseMove イベントは、マウス ポインタの位置を変更したときに発生します。

 Private Sub object_MouseMove(ByVal Button As Long, ByVal Shift As Long, ByVal X As Long, ByVal Y As Long)
 object Chart オブジェクト(埋め込みグラフ)でイベントを使用できます。
 Button 押したマウス ボタンが渡されます。使用できる定数は、XlMouseButton クラスの xlNoButton、xlPrimaryButton、xlSecondaryButton、xlMiddleButton のいずれかです。
 Shift イベントが発生したときの Shift キー、Ctrl キー、および Alt キーの状態が渡されます。次の値のいずれか 1 つまたは合計値が渡されます。
内容
0 (ゼロ)どのボタンも押されていません。
1Shift キーが押されました。
2Ctrl キーが押されました。
4Alt キーが押されました。

 X グラフ オブジェクト クライアント座標のマウス ポインタの x 座標値が渡されます。
 Y グラフ オブジェクト クライアント座標のマウス ポインタの y 座標値が渡されます。

 Declare ステートメントは、ダイナミック リンク ライブラリ (DLL) の外部プロシージャへの参照を宣言します。モジュール レベルで使います。
構文 1
 [Public | Private] Declare Sub name Lib "libname" [Alias "aliasname"] [([arglist])]

構文 2
 [Public | Private] Declare Function name Lib "libname" [Alias "aliasname"] [([arglist])] [As type]

 name 必ず指定します。任意の有効なプロシージャ名を指定します。DLL のエントリ ポイントは大文字小文字を区別して指定することに注意してください。
 Lib 必ず指定します。宣言するプロシージャが DLL またはコード リソースに含まれていることを示します。Lib 節は、すべての宣言で必要です。
 libname 必ず指定します。宣言するプロシージャが含まれている DLL またはコード リソースの名前を指定します。
 Alias 省略可能です。呼び出すプロシージャが、DLL の中で別の名前を持っていることを示します。外部プロシージャの名前が Visual Basic のキーワードと同じ場合に役に立ちます。DLL プロシージャの名前が、パブリック変数、パブリック定数、または適用範囲内のほかのプロシージャの名前と同じ場合でも、Alias を使えます。また、Alias は、DLL の名前付け規則に合っていない文字が DLL プロシージャ名に含まれている場合にも使えます。
 aliasname 省略可能です。DLL またはコード リソース内のプロシージャの名前を指定します。先頭の文字がシャープ記号 (#) でない場合、引数 aliasname には DLL 内で定義されているプロシージャのエントリ ポイント名を指定します。先頭の文字がシャープ記号 (#) の場合は、2 文字目以降の文字にはプロシージャのエントリ ポイントの序数を指定します。
 arglist 省略可能です。プロシージャを呼び出すときに、プロシージャに渡す引数を表す変数のリストを指定します。
 type 省略可能です。Function プロシージャの戻り値のデータ型を指定します。バイト型 (Byte)、ブール型 (Boolean)、整数型 (Integer)、長整数型 (Long)、通貨型 (Currency)、単精度浮動小数点数型 (Single)、倍精度浮動小数点数 (Double)、10 進型 (Decimal) (現在はサポートされていません)、日付型 (Date)、文字列型 (String) (可変長のみ)、バリアント型 (Variant)、ユーザー定義型、オブジェクト型のいずれかを指定できます。

引数 arglist は、次の形式で指定します。
 [Optional] [ByVal | ByRef] [ParamArray] varname[( )] [As type]

 Optional 省略可能です。指定した引数が省略可能であることを示します。これを指定した場合は、引数 arglist 内のこれ以降の引数も省略可能でなければならず、すべてキーワード Optional を付けて宣言する必要があります。キーワード ParamArray を使う場合は、どの引数に対してもキーワード Optional は指定できません。
 ByVal 省略可能です。その引数が、値渡しで渡されることを示します。
 ByRef その引数が、参照渡しで渡されることを示します。Visual Basic では、既定値はキーワード ByRef です。
 ParamArray 省略可能です。引数 arglist の最後に指定する引数としてのみ指定でき、その引数がバリアント型の要素を持つ省略可能 (Optional) な配列であることを示します。キーワード ParamArray を使うと、任意の数の引数を渡すことができます。キーワード ParamArray は、ByVal、ByRef、Optional の各キーワードと共に使うことはできません
 varname 必ず指定します。プロシージャに渡す引数を表す変数の名前を指定します。変数の標準的な名前付け規則に従って指定します。
 ( ) 配列変数に対しては、必ず指定します。引数 varname が配列であることを示します。
 type 省略可能です。プロシージャに渡す要素のデータ型を指定します。バイト型 (Byte)、ブール型 (Boolean)、整数型 (Integer)、長整数型 (Long)、通貨型 (Currency)、単精度浮動小数点数型 (Single)、倍精度浮動小数点数型 (Double)、10 進型 (Decimal) (現在はサポートされていません)、日付型 (Date)、文字列型 (String) (可変長のみ)、オブジェクト型 (Object)、バリアント型 (Variant)、ユーザー定義型、オブジェクト型のいずれかを指定できます。

 注意:
 Function プロシージャでは、プロシージャのデータ型が戻り値のデータ型になります。関数の戻り値のデータ型は、引数 arglist の後の As 節で指定します。引数 arglist 内では、As 節を使ってプロシージャに渡す引数のデータ型を指定できます。さらに、引数 arglist 内では、標準のデータ型以外に As Any も指定できます。Any を指定すると、データ型のチェックを抑止し、任意のデータ型をプロシージャに渡せます。
 空のかっこは、Sub プロシージャまたは Function プロシージャに引数がないことを示し、プロシージャには何も渡されません。次の例では、Sub プロシージャ First には引数がありません。引数を指定して First を呼び出すと、エラーが発生します。
Declare Sub First Lib "MyLib" ()

 引数リストを指定すると、プロシージャが呼び出されるたびに引数の個数とデータ型がチェックされます。次の例では、Sub プロシージャ First は長整数型 (Long) の引数を 1 つ受け取ります。
Declare Sub First Lib "MyLib" (X As Long)

 Declare ステートメントの引数リストに固定長文字列を指定することはできません。プロシージャに渡せるのは可変長文字列だけです。プロシージャの引数として固定長文字列を指定すること自体は可能ですが、その固定長文字列は、プロシージャに渡される前に可変長文字列に変換されます。
 値が 0 の文字列を必要とする外部プロシージャを呼び出す場合は、定数 vbNullString を使います。値が 0 の文字列は、長さ 0 の文字列 ("") とは異なります。

 Cursor は、USER32.DLL から読み出しています。
 他に下記のようなものがあります。

IDC_ARROW = 32512&
IDC_WAIT = 32514&
IDC_SIZENESW = 32643&
IDC_SIZENWSE = 32642&
IDC_SIZEALL = 32646&

 詳しくは、下記のサイトを参照下さい。
http://yokohama.cool.ne.jp/chokuto/urawaza/api/LoadCursor.html
http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/jpwinui/html/_win32_loadcursor.asp
http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/jpwinui/html/_win32_setcursor.asp
http://homepage2.nifty.com/DreamyCat/APIpage1.htm

この種類の目次に戻る↑ 索引へ↓ トップページに戻る


2種類のボタン

2種類のボタン  「フォーム」の「ボタン」
 Excel のシートに貼り付けるボタンは、「コントロールツールボックス」の「コマンドボタン」(右図の左側)と、「フォーム」の「ボタン」(右図の右側)の2種類が有ります。

 上のマクロの事例では、「コントロールツールボックス」の「コマンドボタン」を使ったため、マウスポインタを手(指)の形にするのに、イベントを使ってポインタの形を変更しました。

 ところが、「フォーム」の「ボタン」を使えば、初めから手(指)の形になっています。つまり、マウスポインタを手の形にするだけなら、「フォーム」の「ボタン」を利用した方が簡単です。
(^^ゞ
 ただし、VBEでコードは見えません。Excelのシートでボタンを右クリックして、「マクロの登録」で見られるだけです。

この種類の目次に戻る↑ 索引へ↓ トップページに戻る


「フォーム」の「オプション・ボタン」を使う

フォームのオプション・ボタン  「コントロール ツールボックス」の「オプション ボタン」は、プロパティでいろいろ設定できます。
 しかし、「オプション ボタン」は、「フォーム」のツール・バーにも有って、私は、こちらの方が「お手軽」だと思います。ここで、その使い方を紹介します。

 方法は、
1.オプション・ボタンを設置したいところに、マウスでドラッグして設定する。
2.ボタンを、マウス右クリックして、「コントロールの書式設定」を表示する。
3.「コントロール」の「リンクするセル」で、値を表示するセルを指定する。
 ここで指定したセルに、オプション選択結果の値が表示されます。
4.マクロでは、通常のセルの値を読むと同じ方法で、指定セルの値を使います。

注:ボタンを押した結果を、セル上で見せたくないなら、当該セルの文字色を、背景と同じにします。
右の例では、赤文字で「2」となっている部分を、白色にします。
注:チェック・ボックスの場合は、値は、True か False になります。

 ボタンのグループを複数設定したい場合は、ボタン・オブジェクトを、グループ ボックスで囲みます。ボタン・オブジェクトがはみ出さないように、大きく囲みます。

 Be Cool Users グループサイト
http://kokoro.kir.jp/excel/form-optiongroup.html

この種類の目次に戻る↑ 索引へ↓ トップページに戻る


連続数を配列に割り当てるための算術

 連続数を、縦横の行列の番地に割り当てる算法を、VBAで書いてみましょう。

base0  まず、右のような、0から始まる変な階数と部屋番号を持ったアパートを考えます。
 このアパートに、0〜11の、これまた0から始まるb持った12人の住人が、左下から順番に入居します。
 このとき、例えば、11の人は、何階の何号室に入居することになるでしょう?

 この例は、12個の数を、横4列に並べます。
 4列なので、4で割った商と、余りを使えばよい、と思いつくでしょう。
 VBA で表現すると、入居する階と部屋番号は、下記で求められます。

階  =  \ 4
番号 =  mod 4
 ここでは、階数や、部屋番号を、0 から始めている(0 オリジン)ので、簡単な計算式で求められました。
 VBA で、配列の標準が、0始まりなのは、こういう便利さを考えたものです。

base0  0から始まるというのは、やはり気持ちが悪いので、まず住人のb、1〜12 と変えた場合の計算式を考えます。
 住人bェ、上と比較して1増えただけなので、1減数してやればよいことが、分かります。
(減らさないと、4は、1階の 0番になってしまいます。)

階  = ( - 1) \ 4
番号 = ( - 1) mod 4

1始まり  それでは、最後に、現実的に、階数は1階から、部屋番号は1番から始まる場合の計算式はどうなるでしょう。
 今度は、階数の部分と、部屋番号の部分に 1加えればよいですね。  VBA で表現すると、縦横の番地は、下記で求められます。

階  = ( - 1) \ 4 + 1
番号 = ( - 1) mod 4 + 1

 これを使って、1〜100を、セルの横8列に出力するマクロを書いてみると、下のようになります。

Option Explicit

Dim 列 As Integer
Dim  As Integer

Sub セルに配置()

   ThisWorkbook.Worksheets("Sheet1").Activate
   列 = 8
   For  = 1 To 100
      Range("A1").Cells(( - 1) \ 列 + 1, ( - 1) mod 列 + 1).Value = 
   Next 

End Sub
この種類の目次に戻る↑ 索引へ↓ トップページに戻る


戻り値が複数の関数を作る(ユーザ定義型)

「ファイルを開くダイアログ」で指定

 通常、Function プロシージャ(手続き)は、ひとつの戻り値を持ちます。
 しかし、ユーザ定義型(構造体)を使うと、複数の戻り値を持つことができるようになります。

 下の例は、「ファイルを開くダイアログ」で指定したファイルの、複数の情報を取得する関数の例です。
ファイルを指定する別の方法として、InputBox メソッド を使うこともできます。

Option Explicit

Type 属性 'ユーザ定義型(構造体)を宣言
   フルパス As String
   ファイル名 As String
   フォルダパス As String
   上位フォルダパス As String
   拡張子 As String
End Type

Sub マスタ維持()

   Dim マスタ As 属性
   Dim 月間データ As 属性


   '取り扱うファイルを指定
   MsgBox "マスタのファイルを指定します。"
   マスタ = ファイル属性("Excel,*.xls*")

   Debug.Print マスタ.フルパス
   Debug.Print マスタ.ファイル名
   Debug.Print マスタ.フォルダパス
   Debug.Print マスタ.上位フォルダパス
   
   MsgBox "次に、トランザクション・ファイルを指定します。"
   月間データ = ファイル属性("テキスト・ファイル,*.txt;*.csv")

   Debug.Print 月間データ.フルパス
   Debug.Print 月間データ.ファイル名
   Debug.Print 月間データ.フォルダパス
   Debug.Print 月間データ.上位フォルダパス


   '外部のファイルを使う処理・・省略

End Sub


Function ファイル属性(ファイル区分と拡張子 As String) As 属性

   ファイル属性.フルパス = Application.GetOpenFilename(ファイル区分と拡張子)
   If ファイル属性.フルパス = "False" Then End
   ファイル属性.ファイル名 = Dir(ファイル属性.フルパス)
   ファイル属性.フォルダパス = Left(ファイル属性.フルパス, InStrRev(ファイル属性.フルパス, "\") - 1)
   ファイル属性.上位フォルダパス = Left(ファイル属性.フォルダパス, InStrRev(ファイル属性.フォルダパス, "\") - 1)
   ファイル属性.拡張子 = Right(ファイル属性.フルパス, Len(ファイル属性.フルパス) - InStrRev(ファイル属性.フルパス, "."))
   
End Function

 解説:
Type ステートメント は、1 つまたは複数の要素を持つユーザー定義のデータ型 (ユーザー定義型) を宣言します。
 Type ステートメントは、モジュール レベルでのみ使用できます。
Type ステートメントでユーザー定義型を宣言すると、その宣言の適用範囲内であれば、どこからでもその型の変数を宣言できるようになります。
ユーザー定義型の変数の宣言には、DimPrivatePublicReDim、または Static のいずれかのステートメントを使います。

標準モジュールでは、ユーザー定義型は既定でパブリックになり、その適用範囲はキーワード Public で変更できます。
クラス モジュールでは、ユーザー定義型は常にプライベートになり、適用範囲はキーワード Public では変更できません。

 ユーザー定義型は、データ型の異なる多数の関連する要素で構成されるデータ レコードで、よく使われます。

 構文
[Private | Public] Type varname
elementname [([subscripts])] As type
[elementname [([subscripts])] As type]
. . .
End Type

 Type ステートメントの構文は、次の指定項目から構成されます。
指定項目 内容
Public 省略可能です。
すべてのプロジェクトのすべてのモジュールのどのプロシージャからも参照できるユーザー定義型を宣言するときに指定します。
Private 省略可能です。
宣言が行われたモジュール内でのみ参照できるユーザー定義型を宣言するときに指定します。
varname 必ず指定します。
宣言するユーザー定義型の名前です。変数の標準的な名前付け規則に従って指定します。
elementname 必ず指定します。
ユーザー定義型を構成する要素の名前です。
要素名は、変数の標準的な名前付け規則に従って指定します。ただし、キーワードを使うこともできます。
subscripts 省略可能です。
配列の要素の次元を指定します。動的配列を宣言する場合は、かっこだけを指定します。

引数 subscripts の構文は次のとおりです。
[lower To] upper [,[lower To] upper] . . .
引数 lower を省略すると、配列の添字の最小値は Option Base ステートメントによって制御されます。Option Base ステートメントが記述されていない場合は、添字の最小値は 0 になります。
type 必ず指定します。要素のデータ型を指定します。
バイト型 (Byte)、ブール型 (Boolean)、整数型 (Integer)、長整数型 (Long)、通貨型 (Currency)、単精度浮動小数点数型 (Single)、倍精度浮動小数点数型 (Double)、10 進型 (Decimal) (現在はサポートされていません)、日付型 (Date)、文字列型 (String) (可変長の場合は String、固定長の場合は String * length)、オブジェクト型 (Object)、バリアント型 (Variant)、ほかのユーザー定義型、オブジェクトの種類のいずれかを指定できます。

 Type...End Type ブロック内では、行番号と行ラベルは使えません。

 次の例は、ユーザー定義型の中に、固定サイズの配列を含めたものです。
Type StateData
    CityCode (1 To 100) As Integer    ' サイズ固定型 (静的) 配列を宣言します。
    County As String * 30
End Type

Dim Washington(1 To 100) As StateData
 この例では、StateData には固定サイズの配列 CityCode が含まれており、レコード WashingtonStateData と同じ構造になっています。
 ユーザー定義型の中で固定サイズの配列を宣言する場合は、変数ではなく数値リテラルまたは数値定数を使って、次元を宣言する必要があります。

この種類の目次に戻る↑ 索引へ↓ トップページに戻る


Excelのセルをポイントして指定

 これは、関数を使わずに Sub を使う方法です。
ファイルを指定する別の方法として、ファイルを開くダイアログではなく、InputBox メソッド を使っています。


Option Explicit

Type 属性 'ユーザ定義型(構造体)を宣言
      シート名 As String
      ブック名 As String
      フルパス As String
      フォルダパス As String
      上位フォルダパス As String
      拡張子 As String
   End Type

   Dim マスタ As 属性
   
Sub マスタ維持()

   MsgBox "取得対象は「表示」→「ウインドウ」で、シートを選んで下さい。" _
   & vbNewLine & "(対象ブックは、前もって開いてあることが前提です。)"
   
   '取り扱うファイルを指定
   Call Excelブック属性
   
   Debug.Print マスタ.シート名
   Debug.Print マスタ.ブック名
   Debug.Print マスタ.フルパス
   Debug.Print マスタ.フォルダパス
   Debug.Print マスタ.上位フォルダパス

   MsgBox "イミディエイト画面で、取得内容を確認して下さい。"
   '外部のファイルを使う処理・・省略

End Sub


Private Sub Excelブック属性()

   Dim 指定セル As Range

   ' 処理対象シートを選択して、ファイル名を取得

   On Error GoTo キャンセル
   Set 指定セル = Application.InputBox _
       (prompt:="処理するファイルの、一つのシートの適当なセル、を選択してください" _
       , Title:="処理対象ファイルの指定" _
       , Type:=8)  ' 8は、セル参照 (Range オブジェクト)

   ' 指定セルの Range に対して、.Parent で親オブジェクトWorksheets を、
   ' その.Parent で、Workbooks を、取得します。

   If 指定セル.Parent.Parent.Name = ThisWorkbook.Name Then
       MsgBox "指定されたファイルは、このマクロのファイル自身です。" _
       & Chr(13) & "このままマクロを終了します。"
       Exit Sub
   End If
      
   マスタ.シート名 = 指定セル.Parent.Name
   マスタ.ブック名 = 指定セル.Parent.Parent.Name
   マスタ.フォルダパス = 指定セル.Parent.Parent.Path
   マスタ.フルパス = マスタ.フォルダパス & "\" & マスタ.ブック名
   マスタ.上位フォルダパス = Left(マスタ.フォルダパス, InStrRev(マスタ.フォルダパス, "\") - 1)
   
   Exit Sub
   
キャンセル:
   MsgBox "シートを認識できませんでした。終了します。"
   End
End Sub


この種類の目次に戻る↑ 索引へ↓ トップページに戻る

ホームページのトップに戻る