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"で始まるメソッド。
数値かどうか
IsNumericIsArray
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
NextLBound,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 FunctionCollection (オブジェクト)
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 CompareASCII, 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] = expressionPublic:
スコープが全てのモジュールの場合.
いずれのモジュールの全てのプロシージャで呼び出せる.
関数(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.Countreturn:
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