どうも。つじけ(tsujikenzo)です。今日は2020年11月から受講していたノンプロ研VBA初級講座3期の卒業LTで発表したことをまとめます。今回でこのシリーズとしては最終回になります。(実際にはブログを書きながらアウトライン作成したりスライドを作成する作業を同時にやってます。ブログおススメです。)
GAS初級講座7期と並行開催
実は、全く同時期に裏でGAS初級講座7期の講師をやっていました。(GAS講師の裏でVBA初級を受けていたのかは定かでありませんが💦)
しかし、タカハシさんのスタイルは一貫していて、どの言語を学ぶにしても、カリキュラムはほとんど同じです。
【VBA】
Day1 はじめてのVBA、変数、演算、データ型
Day2 制御構文
Day3 プロシージャ、関数
Day4 オブジェクト、コレクション
Day5 Rangeオブジェクト
Day6 セル・シート・ブックの操作
Day7 卒業ライトニングトーク大会
【GAS】
Day1 はじめてのGAS, 変数、演算、データ型
Day2 制御構文
Day3 関数、配列
Day4 オブジェクト
Day5 スプレッドシート・シート・セルの操作
Day6 スプレッドシートの操作 (実践編)
Day7 卒業ライトニングトーク大会
【Python】
Day1 はじめてのPython、変数、演算、データ型
Day2 制御構文、関数
Day3 リスト、タプル、辞書
Day4 組み込み関数、オブジェクト
Day5 スクレイピング基礎
Day6 スクレイピング実践
Day7 卒業ライトニングトーク大会
これって実はすごいことだと思っていて、タカハシさんはプロのプログラマーでもなく、学校でプログラミング言語設計を学んでいたわけでもないのに、このように体系的にプログラミング言語を捉えたのはある種の発明だと思います。
少し脱線しましたが、年末で忙しくなるだろうし申し込む前はかなり躊躇しましたが、上記の通りカリキュラムはほとんど同じですから実は「GAS初級講座の講師をやりながら、VBA初級を受講する」のは理にかなっているのです。
受講開始時と卒業LTについて
自己紹介でこのように書きまして、VBAのツールを一つでも作ろうと思いましたが、実際に作り始めるとGASでクラウド化した方が効率が良く、結局VBAは1行も書いてません💦(私の師匠もそうだったみたいで安心しましたw)
引き続き中級を受講しますので、その際にテーブルやソルバーを触りたいと思います。なので今回の卒業LTは「VBAとGASの違い」について考察したことを発表します。
VBAとGASの違い
データ型
言語の歴史からVBAは細かく型が設定されていますが、細かいところを上げるとキリがありませんがGASもだいたい同じ(と言えるでしょう)です。
VBA
GAS
ただし、VBAは厳密に型を宣言してから実行するのが特徴的です。
Dim i As Long: i = 1
関数の引数や戻り値に対しても型を宣言するのは非常に硬派だと感じました。
Function Square2(x As Long) As Long
Square2 = x ^ 2
End Function
制御構文
VBAのif文はThenとEnd Ifを使うのが特徴的です。ワンライナーで書くとEnd Ifが省略できます。三項演算子的な書き方は少しハードルが高いのでインストールしませんでしたw
If 条件式 Then
‘処理1
Else
‘処理2
End If
if 条件式 Then 処理1
for文とDo While文も王道です。
Dim i As Long
For i = 1 To 10
Debug.Print "iの値は:" & i
Next i
Do While文
Dim x As Long: x = 1
Do While x < 100
x = x + x
Debug.Print "xの値は:" & x
Loop
GASがブロックを使って条件式やスコープを表現するのと違いがありました。
for (条件式){
if (条件式){//処理}
}
プロシージャとVBA関数
VBAには5種類のプロシージャがあるそうですが、難しそうなので💦「戻り値を持つプロシージャをFunctionプロシージャと呼んで区別してる」ことを理解しました。戻り値を持つプロシージャと言えばPythonのdef宣言ですね。GASは実行単位がFunctionなので、環境の差が出てくる場面だと思います。
Function Square2(x As Long) As Long
Square2 = x ^ 2
End Function
セルの値の処理などでみんな使うでしょ?ということで、これらのFunctionは予めVBAに組み込まれていて、私たちは呼び出すだけで使えますよというのがVBA関数です。
VBA関数はVBAライブラリの各モジュールに格納されています。「モジュール」とはプロシージャを記述する場所です。「モジュール」は非オブジェクト指向の色が出るVBAの特徴的な仕様だそうなので、中級でもガッツリやると思うので、今回は深掘りはしません💦
Rangeオブジェクト
VBAではセルの値をRangeオブジェクトを取得して、半角スペースの後に貼り付け先を記述することでコピペできましたよね。ワンライナーで書けます。
Sheet1.Range("A1").Copy Sheet2.Range("A1")
この時はワンライナーで書きましたが、コピーとペーストのタイミングを分けるなら、GASとPythonでメモリのこととか勉強してきた私としては、変数(メモリ領域をね)を用意して代入しておきたいです。
Dim cp As Range
cp = Sheet1.Range("A1").Value
そしてメソッドに引数を渡して貼付けを行うかと思いましたが、
Sheet2.Range("A1").Paste(cp)
そうではありません。。。💦(引数で渡すことができません)
コピーとペーストのタイミングを分けるというのは、こうなります。
Sheet1.Range("A1").Copy
Sheet2.Range("A1").Paste
では、どこに保存しているのかというと『クリップボード』です。不思議ですよね。これまでExcelの操作を学んできましたが、クリップボードはExcel外の操作のような気がします。そもそもVBAとは何なのでしょうか。。。。
VBAとは
Visual Basic
VBAの前身は、1970年代〜1980年代に開発されていたMicrosoft BASICです。BASICは私が中学時代に習ったプログラミング言語だった覚えがあります。
Visual Basicがリリースされる前は、MS-DOSでWindowsアプリを開発しておりコストも高かったようです。VBAはVisual Basic for Applicationsの略です。ここで言うApplicationとは私たちにお馴染みのMicrosoft Officeやその他アプリケーションのことで、Windowsのアプリケーションを操作(開発)することが目的です。
Visual Basic (ヴィジュアル ベーシック)はマイクロソフトが1990年代に開発していたプログラミング言語およびその処理系。通常はVisual BasicまたはVBと呼ぶ。Visual Studioに組み込まれ、さまざまな種類のアプリケーション開発に用いられる。
Windows API
Windows上で動作するアプリケーションにとって、Windows APIはWindowsの各機能にアクセスするための接点である。
Windows上で動くアプリケーションプログラムの実行順序は、キーボード操作などのユーザーの操作によって変わります。なんらかのイベントがされた時にだけプログラムの特定ブロックが実行されるので、イベントドリブン方式といいます。
Visual Basic は開発手法そのものを Windows API をまったく意識しない形式へと変化させました。
つまり、VBAはVisual Basicがベースとなっており、Windowsを操作するイベント(から派生する指令・コマンド)を意識することなく、アプリケーションを操作できるとも言えます。正にその代表的な例が「クリップボードへの保管」ではないでしょうか。
[おまけ]VBAにおけるプロパティ[考察できなかった]
もう一つGASとの違いで分からないことがあります。
[GAS]
rangeA1 = SpreadsheetApp.getActiveSheet().getRange('A1');
console.log(rangeA1.getValue()); //A1たい
rangeA1.setValue('A1です');
console.log(rangeA1.getValue()); //A1です
[VBA]
Dim A1 As Range
Set A1 = Sheet1.Range("A1")
Debug.Print A1.value 'A1たい
A1.value = "A1です"
Debug.Print A1.value 'A1です
このように、GASはRangeやValueの状態・属性を表すプロパティがなく、メソッドで処理するのに対し、VBAはRangeプロパティやValueプロパティで値を取得したり設定します。
取得・設定 | VBA | GAS |
Rangeオブジェクト | ・WorksheetクラスのRangeプロパティ他、下記表 ・SelectionプロパティからRangeプロパティ | ・SheetクラスのgetRange()メソッド 他 |
Value | ・各Valueプロパティ | ・Rangeクラスのget/set value(s)メソッド |
VBAのプロパティには、値の設定・取得をするものと、オブジェクトを返すプロパティがあるというのがGASとの最大の違いかもしれません。
言語的な違い
Visual BasicはMicrosoftによって開発されたオブジェクト指向プログラミング言語です。(モジュールのように非オブジェクト指向の色を残している部分もあるのが厄介です💦)
オブジェクト指向言語は、クラスベース、プロトタイプベース、メッセージ構文ベースの三タイプに分類されるのが一般的である。クラスベースでは「C++」「Java」「C#」が代表的である。プロトタイプベースでは「Python」「JavaScript」「Ruby」が有名である。メッセージ構文ベースでは「Smalltalk」「Objective-C」「Self」などがある。
VBAはクラスベースのようです。VBAがGASと違ってプロパティに、値の設定・取得をするものと、 オブジェクトを返すプロパティ(Rangeプロパティなど)があるのは、プロトタイプベースとの最大の違いなのかな?と予想していますが、今回はそこまでの考察はできませんでした。。。。
まとめ
さて、長くなってしまいましたが、以上がVBA初級講座3期の卒業LTで準備した資料です。実際のLTでは時間の都合で内容をそぎ落としました。
VBAの基本的な構文の書き方は、VBAを触り始めれば自然と覚えるものです。書き方なので忘れてもメモを見直せば問題ありません。しかしVBAの「オブジェクト変数」とGASの「変数」がどう違うのか別々に記憶するのはコストが掛かります。。。
なのでVBAで「オブジェクト変数」という名前が付けられているのは、GASやPythonがプロトタイプベース(元になるオブジェクトが存在していて、インスタンスはその複製を生成する)のクラスを採用しているために敢えて「オブジェクト変数」と言わないから、と理解すると効率が良さそうです。
しかしながら初級者の私がこのような(間違ってるかもしれない)考察を発表できる機会を頂きまして、いつもノンプロ研には大変感謝しています。
引き続き、VBA中級講座でよろしくお願いいたします。