vba文法


VBA

ツール -> マクロ -> Visual Basic Editor
PowerPointマクロ有効プレゼンテーション(.pptm)で保存しとく.

基本事項

階層構造になっている

例えば,テキストのオブジェクトは次のような階層になっている.
Applicationオブジェクト
Presentationオブジェクト
Slideオブジェクト
Shapオブジェクト
TextFrameオブジェクト
TextRangeオブジェクト
Textオブジェクト

階層を辿らなくてもいいのもある.
例:
ActivePresentation (Presentationオブジェクト)
Presentations (Presentations コレクション)
ActiveWindow (DocumentWindowオブジェクト)

補完機能

返却値がVariant型,Object型だと補完されない。

オブジェクト

パワポの操作対象はオブジェクトからなる.
オブジェクトには,プロパティ(データ)とメソッド(処理)がある.
全てのオブジェクトに,ApplicationプロパティとParentプロパティがある.

ヘルプはオブジェクトブラウザで調べられる.(後述)
"ローカルウィンドウ"にて,オブジェクトのプロパティを調べられる.
オブジェクトの中身の確認にはこのローカルウィンドウがおすすめ.

拡張子

ver. 2007以降,マクロ有り,無しで拡張子が異なる.
マクロ無:.pptx
マクロ有:.pptm



基本設定

コードを打つウィンドウを表示する.

挿入 -> 標準モジュール
これにコード打てば良い.
モジュール名の変更はプロパティウィンドウからできる.

結果出力するウィンドウ(イミディエイトウィンドウ)の表示

表示 -> イミディエイトウィンドウ (ctrl cmd g)

実行

fn5
実行は,カーソルのある行のプロシージャが実行される.
カーソルがない場合,どれを実行するか聞いてくる.

プロシージャ

プログラムの構成単位.

Subプロシージャ

Sub プロシージャ名()
  処理..
End Sub


イミディエイトウィンドウに出力

Debug.Print "Hallo World"; hoge

セミコロン(;)を使うことで,複数の出力ができる.
カンマ(,)を用いると,タブが出力される.




データ型

https://docs.microsoft.com/en-us/office/vba/language/reference/user-interface-help/data-type-summary

種類

Boolean

True, False

String

"ダブルクォーテーションで囲む"

Byte

0から255

Integer

-32768 から32767

Decimal (小数),Variant型内部でのみ使われる

・小数部分がない場合
+/-79,228,162,514,264,337,593,543,950,335

・小数部分の桁数が28以下の場合 (小数点以下44桁あるんだけど?)
+/-7.9228162514264375935439543955395395395395335

Long

-2147483648から2147483647

Single (単精度浮動小数)

-3.402823E38 から -1.401298E-45 (負の値)
1.401298E-45 から 3.402823E38 (正の値)

Double

-1.79769313486231E308 から -4.94065645841247E-324 (負の値)
4.94065645841247E-324 から 1.79769313486232E308 (正の値)

Date
100年,1月1から9999年12月31日


Object




型宣言

Dim hoge As Integer
Dim h As Integer, o As Integer, g As Integer, e As Integer
Const bla As String = "blabla"
Const b As String = "bla", la As String = "bla"


型宣言文字

一文字でAs以降を表せる

Dim val_int%
Dim val_long&
Dim val_Single!
Dim val_Double#
Dim val_Currency@
Dim val_Longlong^
Dim val_String$

ユーザ定義型(Type)内での宣言には使えないみたい

型宣言を強制する

コード1行目に次の1行を記述.

Option Explicit



型名を調べる

TypeName(valuename)




キャスト

https://docs.microsoft.com/en-us/office/vba/language/concepts/getting-started/type-conversion-functions

Booleanへの変換

CBool(expression)


expression

文字列式,数式.

Integerへの変換

CInt(expression)


expression

-32,768 から 32,767の値.
少数は丸められる。

Longへの変換

CLng(expression)


expression

-2,147,483,648 から 2,147,483,647の値。
小数値は丸められる。

Single型への変換

CSng(expression)

expression:

負の値の場合は -3.402823E38 から -1.401298E-45.
正の値の場合は 1.401298E-45 から 3.402823E38.
(0でもできた.)
文字列からができない.文字列から数値はValを使う

Doubleへの変換

CDbl(expression)

expression:


文字列から数値型(主にDouble)への変換

Val(string)

一文字目が数値でない場合機能しない.$とかも認識されない.
空白やタブは削除される.
8進数(&0),16進数(&H)は10進数に変換される.

Stringに変換

CStr(expression)


expressionと戻り値

expressionの型によって、戻り値が変わってくる。
Boolean → "True", "False"
Date → システム設定の、短い書式設定の日付
Empty → ""
Error → "Error Num." (Num.はエラー番号)
Null → run-error発生。
他の数値型 → その数字。


判定

オブジェクトブラウザのInformationクラスのメンバのうち、"Is"で始まるメソッド。

数値かどうか

IsNumeric


IsArray
IsDate
IsEmpty
IsError
IsMissing
IsNull
IsObject





配列

配列は次のように宣言する。

Dim arr(9) As Integer
Dim month(1 To 12) As Integer
Dim studentsID() As Integer
ReDim studentsID(12)
ReDim NewMonth(1 To 15)


特にしていなければ0基底。arr(9)なら0~9までの10要素。
引数に(1 To N)としてやるば、1基底も可能。
ただし、Nには定数を指定しなければならない。(Constで宣言した変数か、数値のみと思われる。)
また、Constでも同様に定数をしていしなければならないので、Rangeオブジェクトの.Constメソッドは使用できない。

引数を与えると,以降長さを変更できない。
長さを変更する場合は,引数を設定しない。
Integerの場合,宣言時に0が格納されてる?

配列の全ての要素に代入する場合

For i = LBound(hoge_array) To UBound(hoge_array)
  hoge_array(i) = 0
Next

LBound,UBoundで配列の最小値、崔ぢ亜それぞれ次元の最小値,最大値?

a = arry(1,2) + arry(2,1)


初期化

Erase(arraylist1[, arraylist2, ..])

arraylist:

配列

動的な配列(長さを指定しないで宣言した配列)なら,メモリを解放する.
そうでない場合,各要素が以下のようにされる処理がされ,メモリは解放されない.
数値配列:0
文字列型 (可変長):長さ 0 の文字列 ("")
文字列型 (固定長):0(?)
Variant型:Empty
ユーザ定義型:別変数にされる???
オブジェクト型:Nothing

なお,動的配列を再度参照するためには,ReDimで再宣言する必要がある.

Dim NumArray(10) As Integer ' 整数配列
Erase NumArray ' 各要素 0

Dim StrVarArray(10) As String ' 文字列型(可変長)
Erase StrVarArray ' 各要素 ""

Dim StrFixArray(10) As String * 10 ' 文字列型(固定長)(?)
Erase StrFixArray ' 各要素 0. 

Dim VarArray(10) As Variant ' Variant型 
Erase VarArray ' 各要素 Empty

Dim DynamicArray() As Integer ' 動的配列 
ReDim DynamicArray(10) ' メモリ割り当て
Erase DynamicArray ' メモリ解放 


関数の戻り値の配列を代入する

Dim array() as double
array = ReturnArray()

array宣言時に、サイズを指定すると代入できなくなる。

最小インデックスを取得する

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

LBound(array[, dimension])


dimension

次元。1以上。でふぉは1。

配列の長さを取得する

UBound(array) - LBound(array)


配列が空かを判定する関数

Function isArrayEmpty(arr_var As Variant)
    Dim p As Integer

    On Error Resume Next
        p = UBound(arr_var, 1)
    If Err.Number = 0 Then
        isArrayEmpty = False
    Else
        isArrayEmpty = True
    End If
     
End Function




Collection (オブジェクト)

Dim X As New Collection
Set c = New Collection

格納されるデータ型は問わず.
順序保持される.
追加はAddメソッド.
削除はRemoveメソッド.
呼び出しはItemメソッド.


列挙型 Enum

https://learn.microsoft.com/ja-jp/dotnet/visual-basic/language-reference/statements/enum-statement

Enum animal
    bird = 1
    dog = 2
    cat = 3
    human = 4
End Enum

整数のみ.(Byte, Integer,Long etc.)
Integerとして計算可能.
型で鼻ないので,As の後には来れない.

よく使われる列挙型:

Boolean: msoTriState

Boolean型があるのに列挙型もある




独自のプロパティ Type

Type books
    title As String
    publish As Long
    auther As String
    has_read As Boolean
End type

空だとエラー.




String

連結

s = "つなげるには" & "を使う"

大文字 -> 小文字

Dim Upper, Lower
Upper = "HOGEHOGE"
Lower = Lcase(Upper)    ' "hogehoge"


小文字 -> 大文字

Ucase


書式指定

Format


繰り返し文字列

Space
String


文字列長さ

Len


文字の配置

LSet
RSet


指定分だけ取得

Left(string, length)
Right()
Mid()

string:

文字列.
NullならNullを返却.

length:

文字数.
0の場合,"" (空文字)を返却.
文字数以上の場合,文字列全体を返却.

空白削除

Dim MyString, TrimString
MyString = "  hoge  "
LTrimString = LTrim(MyString)    ' 左側空白削除 "hoge  "
RTrimString = RTrim(MyString)    ' 右側空白削除  "  hoge"
LRTrimString = LTrim(RTrim(MyString))    ' 両側空白削除  "hoge".
TrimString = Trim(MyString)    ' 両側空白削除  "hoge".


文字検索

InStr
InStrRev


文字列の比較

StrComp


文字列変換

StrConv(string, conversion[, LCID])

大文字,小文字,一文字目のみ大文字とか.
ひらがな→カタカナ,カタカナ→ひらがなとか.

比較の設定

Option Compare


ASCII, ANSI

Axc
Chr


特殊文字

改行文字

vbCrLf


数値か?(Stringに限らず)

IsNumeric(expression)

expression:

数値式,文字列,Variant型.

returns:

Boolean
日付はFalse.vbv


Unicode文字からの変換

ChrW(Val("&H" & "03BC"))

16進数で渡すが,VBAでの16進数は"&H"を接頭文字とする.


文字の検索(場所を返却)

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

InStr([start=1?], string1, string2, [compare=?])

start As 数値型?:

開始位置.0だとエラーだったので1からかも.
compare引数を指定する場合は必須.
デフォは1と思われる.
string2より大きい値だと0を返却する?

string1, string2 As String:

string1のどこにstring2があるかを探す.

returns:

一致が見つかった場所
string1, string2のいずれかがNullだとNullを返却する.
string1の長さが0,string2が見つからない場合は0.
start位置がstring2より大きい値だと0を返却する?
string2が""の場合0.





コメント

`Use a single quat. on linehead to comment








演算子

四則演算

加算: +
減算: -
乗算: *
冪乗: ^
除算: /
商: ¥ (以前は\)
余: a = num1 Mod num2


比較演算子

<, <=
>, >=
=, <>


文字列連結

&



変数・定数

定数の宣言

[Public|Private] Const constname [As type] = expression

Public:

スコープが全てのモジュールの場合.
いずれのモジュールの全てのプロシージャで呼び出せる.
関数(sub, function)内では宣言できない.
デフォルトはPrivate.
クラスモジュールの場合Privateのみ.

Private:

スコープが宣言したモジュール内のみの場合.
関数(sub, function)内では宣言できない.
デフォルトはPrivate.

As type:

型の宣言.
変数ごと個別で宣言する.

Const a As String = "a", b As String = "b"


変数の宣言

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

Dim [WithEvents] varname [([subscripts])] [As [New ]type][,[ WithEvents] varname[([subscripts])] [As [New ]type ] ...

モジュールの最初,関数の最初どちらでも可能.

WithEvents:

クラスモジュールでのみ有効.(ので略す)

subscripts:

配列の次元. MAX60.
[lower To ]upper[, [lower To ]upper]... で指定.
lowerを省略した場合,Option Baseの宣言に従う.(0か1)
Option Baseの宣言がされてない場合,0
なお,これを指定した後にReDimを行うとエラー.

New:

最初に参照した際に,インスタンスが作成されるようになる.
→ Setがいらなくなる.

type:

省略した場合Varient型.
数値型なら0,可変長文字列は"",固定調文字列は"00..",VarientはEmptyとして初期化される.

初期化

Dim num As Long: num = 3


プライベート変数の宣言

Private hoge As Type

モジュールはまたげない.

パブリック変数の定義

Public hoge As Type

モジュールをまたげる.
ディレクトリもまたげそう.



値の代入

Let var = expression

実はLetが省略されている.
基本的に型が違うとエラー.
ただし,Varient型については文字式,数値式を代入できる.
その逆で代入する場合,数値(文字)として解釈できる場合のみ数値型(文字型)に代入できる.

New
Static







クラス

クラスモジュールに作る.一つずつ?

Dim can_eat As Boolean
Dim num_of_lages As Byte
Dim has_tail As Boolean
Dim name As String
Dim category As animal_type    ' animal_typeは別で定義した列挙型

' コンストラクター
Public Sub create_animal(eat As Boolean, legs As Byte, has_tail As Boolean, nam As String, cat As animal_type)
    name = nam
    can_eat = eat
    has_tail = has_t
    category = cat
End Sub

' 属性のゲッター Dimで宣言された変数はprivateだが,ゲッターをpublicにすることで,他から呼び出しは可能
Public Property Get get_can_eat() As Boolean
    get_can_eat = can_eat
End Property

' 属性のセッター
Public Property Let let_can_eat(new_val As Boolean)
    can_eat = new_val
End Property


クラスのインスタンス化

Sub animals()
    Dim anml As AnimalClass
    Set anml = New AnimalClass
    anml.create_animal(True, 2, False, "hoge", bird)
End Sub









コレクションについて

同じ種類の複数のオブジェクトのグループ.
リスト的に扱える.

どのコレクションにもCountプロパティ,Itemメソッドがある.

要素数 Count

Slides.Count

return:

Integer

特定のオブジェクトを返却する Item

Slides.Item(3)
Slides(3)


Itemメソッドは,特定のオブジェクトを返却するメソッド.1から始まる.
Itemメソッドに関しては,省略してもよい.(規定メンバ)
このItemメソッドが必要なのはWith構文を使う場合

Dim i As Long
With ActivePresentation.Slides(1).Shapes
  For i = 1 To .Count
    Debug.Print .Item(i).Name
  Next
End With




1から始まるスライドインデックス(数値)やスライド名(文字列)を引数に取れる.

ActivePresentation.Slides(2).Name
ActivePresentation.Slides("Chart").Path