関数
種類
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
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)