VB文法 2

関数

種類

Function,Subの2種類だと思う.

Sub

Public Sub Hoge()
  [処理]
End Sub

モジュール内で使う場合,Publicとして定義する.デフォなので省略可.
マクロとして使える.


Private Sub Hoge()
  [処理]
End Sub

スライド内のみの場合,Privateとして定義する.
マクロには使えない.

Function

Function func() As Type
  func = "return"
End Function

戻り値を返せる(Typeの部分に型を指定する).
As Typeの指定がなくても可能.
関数名に代入する形で戻り値を取得できる..

呼び方

func x
func (x)
func x, y, z
Call func (x, y)
hoge = func (x)

変数に代入しない場合,ブラケットなしでも呼べる.
ただし,複数の変数をブラケットをつけ呼ぶなら,"Call" をつけないとダメ.
変数に代入する場合,ブラケットが必要.
引数不要のものを呼び出す場合,ブラケットはエラー.

同ディレクトリの別モジュールから呼び出す

Module.hoge

Publicのものだけ.



引数の設定

Sub func(ByRef arg1 As String, ByVal arg2 As String, Optional arg2 As String = "Default Value")
End Sub

型の指定は省略可能.Optinal以外ならユーザ定義型も指定可能.

参照渡し

ByRef.デフォなので,なくても可能.

値渡し

ByValとすると,中身が渡される.


オプショナル引数

Optionalをつける.
これ以降は全てOptionalでないとダメ.
この場合のみ,デフォルト値を指定できる.
ただし,Object型の場合はNothingのみ.

キーワード引数

最後の引数でのみ.任意の数の引数を取れる.
ByRef,ByVal,Optionalとの併用不可.

配列を引数にする場合

Sub func(Numbers() As Long)

配列はval() のように()をつけること。



基本的な関数

文字を出力する

Debug.Print "name: "; shp.Name, "  id: "; shp.id

セミコロンで区切るって複数出力できる.
コロンだとタブが入る.

変数の型名・種類を出力

TypeName(varname)
VarType(varname)

returns:

String,vbVarType
vbVarType: 合計が返される.
空 (未初期化):vbEmpty (0)
Null (有効なデータではない):vbNull (1)
Integer:vbInteger (2)
長整数:vbLong (3)
単精度浮動小数点数:vbSingle (4)
倍精度浮動小数点数:vbDouble (5)
通貨値:vbCurrency (6)
日付値:vbDate (7)
String:vbString (8)
Object:vbObject (9)
エラー値:vbError (10)
ブール値:vbBoolean (11)
バリアント型 ( Variant ) (バリアントの 配列でのみ使用される):vbVariant (12)
データ アクセス オブジェクト:vbDataObject (13)
10 進値:vbDecimal (14)
バイト値:vbByte (17)
LongLong 整数 (64 ビット プラットフォームでのみ有効):vbLongLong (20)
ユーザー定義型を含むバリアント:vbUserDefinedType (36)
配列 (この関数によって返される場合は常に別の定数に追加されます):vbArray (8192)



3項演算

式の評価によって、いずれかの値を返却するもの。

https://learn.microsoft.com/ja-jp/office/vba/language/reference/user-interface-help/iif-function

IIF(expr, truepart, falsepart)


truepartとfalsepartは両方とも評価される。

平方根,対数,指数

Sqr,Log,Exp

絶対値

Abs

三角関数

Sin(num), Cos(num)
Tan,ATan

num:

ラジアン

※ 円周率はPI()で取得できそう。

符号

符号

床関数と,負の場合だけ天井関数

Int,Fix

疑似乱数

Rnd



四捨五入

Round(expression, numdecimalplaces=0)

numdecimalplaces:

小数点以下桁数.




ループ

ループに関しては、以下の文法がある。
Do...Loop
For...Next
For Each...Next
While...Wend、With

For..Next

https://learn.microsoft.com/ja-jp/office/vba/language/reference/user-interface-help/fornext-statement

For counter = start To end [ Step step ]
  [ statements ]
  [ Exit For ]
  [ statements ]
Next [ counter ]


step (= 0)

counterに加算されていく。(0だと一般的なforループのように+1されていく。0, 1同等?)
step >= 0の場合、counter <= endのときに実行される。
step < 0の場合、counter >= endのときに実行される。




For Each..Next

For Each element In group
  [ statements ]
  [ Exit For ]
  [ statements ]
Next [ element ]


group

ユーザ定義型はNG




ファイル

パターンに一致するファイル,ディレクトリを取得する

Dir(pathname="", attributes=0)

pathname As String:

絶対パスで.
複数文字ワイルドカード:*
1文字ワイルドカード:?
初めてpathnameを指定せずにDirを呼び出すとエラー.
空文字の後にpathnameを指定せずにDirを呼び出すとエラー.

atributes As 定数 or 数式(合計):

属性なし:vbNormal (0)
属性なしファイル,読み取り専用ファイル:vbReadOnly (1)
属性なしファイル,隠しファイル:vbHidden (2)
属性なしシステムファイル(Mac無理):vbSystem (4)
ボリューム(Mac無理):vbVolume (8)(他の属性を指定したらこれは無視される)
属性なしファイル,ディレクトリ:vbDirectory (16)
エアリアス(Macのみ):vbAlias (64)

returns:

一致するファイル名(一つ).
次のファイルを取得するには,再度DIrを呼び出す.
一致するファイルがなくなった場合,空文字("")を返却する.

例:ディレクトリにある.pngファイル名を出力

dir_path = "/to/dir/"
img_suffix = "*.png"

Dim img_name As String

img_name = Dir(dir_path & img_suffix)
If img_name = "" Then
  Debug.Print "no img"
  Exit Sub
End If

Do Until img_name = ""
  Debug.Print img_name
  img_name = Dir
Loop




正規表現

外部ライブラリを参照する必要がある。


例: 正規表現で表した文字列を含むかの判定

Sub TestRegularExpression()
    Dim regex As Object
    Set regex = CreateObject("VBScript.RegExp")

    ' 正規表現パターンを設定
    regex.Pattern = "\d+"  ' 例: 数字にマッチするパターン

    ' テスト対象の文字列
    Dim testString As String
    testString = "12345"

    ' マッチング実行
    If regex.Test(testString) Then
        MsgBox "マッチしました"
    Else
        MsgBox "マッチしませんでした"
    End If
End Sub


regexのTextメソッドは真偽値のみを返却し、その詳細は取得しない。
詳細が必要な場合、Executeコマンドを使用する(Matchオブジェクトが戻り値)。Executeによって、1つ目のマッチを取得できる。複数行いたい場合は


基本的に貪欲マッチらしい。(chatGPT談)

RegExpのメンバ

regex.Execute()
regex.Replace()
regex.Test()
regex.Global
regex.IgnoreCase
regex.Multline
regex.Pattern


先読み

抜き出したい文字列の後ろの文字列を指定できる。

後ろに"hoge"がある、{"h", "o", "g", "e"}からなる4文字の文字列。

[geho]{4}(?=hoge)