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)
キャスト
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