会社でマクロ組むことになりました。
でも僕の名刺の肩書きはWebデザイナーです。
この会社入って3年くらいですけど、
Webデザインは仕事で2回くらいしかやったことありませんがね。
そんな訳で迷走ついでにVBAVBAさっさとVBAです。ほんと。
VBAっていうのはExcelとかAccessについてるアプリの言語です。
普通に提供されてる機能だけじゃ物足りないからオリジナルで
Excelやaccessの機能実装してやるぜみたいな人の為の言語じゃないかと思います。
しかし物足りなくなるのは多くの場合、自分ではないんですが、
物足りなくなる人は多いようで、詳しい説明が書いてあるサイトは沢山あります。
もしかしたらPHPより多いかもしれないくらい。
やーやー言う人は居ますが、沢山の人に親しまれてる言語なんだなぁと思いました。
というわけで、マクロを組むにあたり、知らないと困るものを書いていきます。
INDEX
変数
とりあえずマクロってどーはじめるのって人は
こちらの記事を読んで頂きたくおもいます。
Dim s AS String
これで変数sが使えるようになります。
このDimはDimensionの略で
As Stringは文字列でAを定義したよって意味です。
定義できる型は
Variant (全データ)
Byte (0~255)
Integer (-32,768~32,767の整数)
Long (-2,147,483,648~2,147,483,647の整数)
Currency (-922,337,203,685,477.5808 ~ 922,337,203,685,477.5807の固定小数点数)
Single (負の値:約-3.4×10(38乗)~-1.4×10(-45乗),正の値:約1.4×10(-45乗)~1.8×10(38乗))
Double (負の値:約-1.8×10(308乗)~-4.0×10(-324乗),正の値:約4.9×10(-324乗)~1.8×10(308乗))
Date (日付:西暦100年1月1日~西暦9999年12月31日)
String (文字列)
Object (オブジェクト)
Boolean (真偽値)
となってます。
整数を入れる場合はIntegerではなくLongが一般的だそうです。
IF
IF文はこうなります。
IF (条件式) then Else (条件式) then Else End If
演算子は
= 等しい
<> 等しくない
And 右辺と左辺の条件両方を満たす
Or 右辺か左辺どちらか一方の条件を満たす
Not 条件式を満たさない
これ以外はよくあるやつです。
配列
配列の定義は
Dim s(10) AS String
ってやれば10個の配列が出来ます。
動的に配列を定義したい場合は
Dim moge() As Long ReDim moge(3) moge(0) = 1 moge(1) = 2 moge(2) = 3
配列に代入する前に再定義してやる必要があります。
連想配列みたいな奴を作りたいなら
Dim setting As Object Set setting = CreateObject("scripting.dictionary") setting.Add "Pref", xx県 setting.Add "City", "xx市" setting.Add "Town", "xx町" setting.Add "Address", "1-12"
こんな感じでやると良いみたいです。
ただscripting.dictionaryを使えるようにする必要があります。
でも大体の場合最初から使えるようになってるので気にしなくても良いでしょう。
で使い終わったら
Set setting = Nothing
開放してあげましょう。
ループ
ForEachしか使ってないのでさっきの連想配列を例にとって
特定の文字列を条件にとって、文字列の変換を行うサンプルを書きます。
For Each c In setting If c = "pref" Then 'Indexがprefで中身が愛知県の場合 If setting(c) = "愛知県" Then 'その配列を削除して setting.Remove c 'もっかい定義する setting.Add c, 1 End If End If Next
PHPなら上書きできたりしますが、
vbaだと出来ないので再定義する必要があるそうです。
subプロシージャとfunctionプロシージャ
要は値を返すか返さないかです。(自分の調べた限り)
functionで猿を鳴かす例
Sub say() Dim say As String say = monkey() Debug.Print (say) End Sub Function monkey() '多分returnの変わりに関数名に代入するんだと思います。 monkey = "ウキッ" End Function
subでゴリラを鳴かす例
Sub main() animal ("ウホ") End Sub Sub animal(say) Debug.Print (say) End Sub
subでゴリラと猿を鳴かす例
Sub main() '引数が二つになるとcallが必要になる。何でかは知らない! Call animal("ウホ", "ウキ") End Sub Sub animal(say, say1) Debug.Print (say) Debug.Print (say1) End Sub
引数が二つになった時に
sub使いたいときはcallってのをつけないとダメみたいです。
エクセルの操作基本
今回はAccessでなくてExcelのマクロ作ったので
簡単なエクセルの操作もやりました。
よく使いそうなのを書いていきます。
指定のsheetを選択(アクティブに)する
ActiveWorkbook.Worksheets("設定").Activate
設定っていうシートをアクティブにしています。
Dim filepath As String filepath = Cells(2, 3) '2行目の3列目なんでCの2が選択されます。 filepath = Cells(1, 1) 'これはAの1です。
ファイルオープン
Workbooks.Open "フルパス"
フルパスで書かないとダメみたいです。
指定のExcelをアクティブにする
Workbooks("ファイル名").Activate
指定のファイルをアクティブにすることもできます。
sheet1のA1~A37をコピーして指定先へコピー
Worksheets("Sheet1").Select Range("A1:A37").Select Selection.Copy Worksheets("月次損益計算書").Select Range("G4:G41").Select ActiveSheet.Paste
ワークブックを保存して確認なしで閉じる
ActiveWorkbook.Save ActiveWorkbook.Close (False)
全部書いてやろと思ったけど、
以外に量があったので、また今度書きたくなったらやりますう。
全体的に駆け足になってしまいましたが、誰かが助かってくれれば幸いです。
Functionは初見だと、ハメられるので、てこずりました・・・。