2016年12月29日木曜日

Excel VBA入門

引き続きドットインストールのお世話になります。
Excel VBAを書く機会が近々ありそうなので、ドットインストールで復習です。
手元に製品版のエクセルがない(Win版があるけどWinPCがめっさ重い)ため、
動作確認はできてません。復讐のため可とします。


メモ

リファレンス
マイクロソフトのものはオススメしない
Office 田中がオススメ
テストセンターのOdyseyが運営しているmoug
あとはググれば大抵の問題は解決できます。書籍もたくさん出ているので適当に。

コメント
’シングルクォートです。

エディター・IDE
VBE
開発タブ(リボン)を表示させないと出てこないアレ

用語
ワークブック
ワークシート
セル
オブジェクト:操作の対象
プロパティ:属性
メソッド:振る舞い

よく使うウィンドウ
プロジェクトウィンドウ
プロパティウィンドウ

プロシージャのテンプレート
Sub WriteHello()
  MsgBox ("hello")
End Sub
Sub:プロシージャの始まりを宣言
MsgBox:ポップアップでメッセージを表示するメソッド
End Sub:プロシージャの終わり
改行:行の終わりを示す(;セミコロンじゃない)
 _(スペースとアンダーバー):行の途中で改行
最初の一文字:キーワードやメソッド、プロパティはだいたい最初の一文字は大文字(確かVBEが補正してくれたはず)

セルの操作・値の代入
Worksheets("Sheet1").Range("A1").Value = "Hey"
Range("A2").Value = "Hey"
Cells(3,1).Value = "Hey"
Cells(3.1).Offset(1,0).Value = "Hey"
上記の例では、A1 - A4にそれぞれHeyと入力される。
シートの指定がなければ、アクティブなシートに対して実行される。
また、最後のValueについては、セルの標準プロパティでもあるので、省略することが可能です。
実行速度も、省略してもしなくても差はないそうです。参照:Office 田中
Rangeはセル番地を文字列として指定するのに対し、CellsはCells(行番号、列番号)と数値で指定します。
僕は”行列”という言葉で順番を覚えています。Offsetは指定した行数と列数分、セルの指定をずらします。
数が増えるほど、右下に移ります。

複数のセルの操作
Range("A1","C3").Value = "Hey"
Range("A1:C3").Value = "Hey"
どちらも、A1からC3までのセル範囲の全てのセルに、Heyと入力します。
下の書き方は変数入れづらかったような気がする。
Range("A:A").Value = "Hey"
Range("1:1").Value = "Hey"
上はA列全てのセルに、下は1行目全てのセルに、Heyと入力します。

Cells.Clear
全セルの内容と書式の消去です。
内容のみ:ClearContents
書式のみ:ClearFormats
コメント:ClearComments
アウトライン:ClearOutline 

With
対象をEnd Withまで操作対象を省略できる
Range("A1").Value = "Hey"
Range("A1").Font.Bold = True
Range("A1").Font.Size = 16
Range("A1").Interior.Color = vbRed
            ↓
With Range("A1")
  .Value = "Hey"
  .Font.Bold = True
  .Font.Size = 16
  .Interior.Color = vbRed
もしフォントの操作の2行だけなら、With Range("A1").Fontって書いてもOKです。
あと、Endブロックを入れ子にしてもオッケーです。

Range("B2").Delete shift:=xlShiftLeft
セルの削除。
shift:はオプション
セルB2を削除して左に詰める

Worksheets.Add after:=Worksheets("Sheet1"), Count:=2
ワークシートの追加
複数のオプションが設定可能で、2個目以降のオプションはカンマで区切る
例の操作は、Sheet1のあとに2枚ワークシートを追加する。

マクロの記憶
この機能のおかげで、全部を覚える必要はないため、助かる。
ただし、無駄な記録を削るのに少し調べる必要があったりする。

Dim 変数 As データ型
変数の宣言。
VBAでは変数宣言は必須ではないが、見つけづらい文法エラーになるので、常に変数宣言したほうがいい。
モジュールの頭に(つまり、Subの宣言より上に)Option Explicitと書くと、変数の型を明示しろっていうオプションが付く。
これが付いていると変数を宣言せずに使うとエラーが発生する。

変数宣言しない怖さはOffice田中をご参照ください。

Debug.Print 変数
イミディエイトウィンドウに変数の値を表示する

数値演算
あまり:mod
べき乗:^

変数の型
Integer
Double
Data:"yyyy/mm/dd"
Variant
Boolean:True/False
Range:初期化時はSetをつける(Set ran = Range("A1")

Excelの日付の扱い
シリアル値(連続した値)として内部的に保持している。
1900/1/1 0:00が内部値「1」で、1日ずつ「1」増えていきます。
これはVBAでも同じらしく 日付に「+1」すれば1日後の値となります。

配列
Excel VBAで配列を使うには、下記2つの方法があります。
Dim fruits(3) As String
fruits(0) = "Apple"
fruits(1) = "Banana"
fruits(2) = "Orange"
Dim fruits As Variant
fruits = Array("Apple", "Banana", "Orange")
他の言語同様、添字はゼロ始まり。

条件分岐If
If Range("a1").Value = "Apple" Then
  MsgBox ("Apple")
End if

Select
他言語のswitch相当
Select Case fruit
Case "apple"
  xxx
Case "banana"
  xxx
Case Else
  xxx
End select

Loop処理
Dim i As Integer
i = 1

Do While i < 10
  Cells(i, 1).Value = i
  i = i + 1
Loop
Dim i As Integer
For i = 1 To 9 Step 1
  Cells(i, 1).Value = i
Next i
最近VBA書いてなかったから、懐かしい。。。

Foreach
Dim fruits As Variant
fruits = Array("apple", "banana", "orange")

For Each fruit In fruits
  MsgBox (fruit)
Next

プロシージャの種類
Subプロシージャ:戻り値を持たない Functionプロシージャ:値を戻す

引数の受け取り
Sub Greet(ByVal name As String)
値渡しだとByVal
参照渡しだとByRef

引数の受け取り
Sub Greet(ByVal name As String)
値渡しだとByVal
参照渡しだとByRef

判定式
等しい:=
等しくない:<>

0 件のコメント:

コメントを投稿