[ノンプロ研]VBA初級講座3期卒業LTについて

VBA

どうも。つじけ(tsujikenzo)です。今日は2020年11月から受講していたノンプロ研VBA初級講座3期卒業LTで発表したことをまとめます。今回でこのシリーズとしては最終回になります。(実際にはブログを書きながらアウトライン作成したりスライドを作成する作業を同時にやってます。ブログおススメです。)

GAS初級講座7期と並行開催

実は、全く同時期に裏でGAS初級講座7期の講師をやっていました。(GAS講師の裏でVBA初級を受けていたのかは定かでありませんが💦)

[ノンプロ研]GAS初級講座7期DAY1補講
どうも。つじけ(tsujikenzo)です。今週から始まりましたノンプロ研GAS初級講座7期ですが、このシリーズでは講座中では時間の都合でお伝えできなかったことなどを、全6回+おまけという感じでお届けしたいと思います。いよいよ始まり...

しかし、タカハシさんのスタイルは一貫していて、どの言語を学ぶにしても、カリキュラムはほとんど同じです。

【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文ThenEnd 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の特徴的な仕様だそうなので、中級でもガッツリやると思うので、今回は深掘りはしません💦

Office TANAKA - 変数の使い方[変数の適用範囲]

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は私が中学時代に習ったプログラミング言語だった覚えがあります。

[プログラミング]はじめて学習したプログラミング言語は
どうも。つじけ(tsujikenzo)です。別のことを考察している際に「私が初めて学習したプログラミング言語はなんだったんだろう」と疑問に思うことがありました。恐らくそれは中学時代の技術の授業だったと思いますが、何の言語だったのか全く記憶が...

Visual Basicがリリースされる前は、MS-DOSでWindowsアプリを開発しておりコストも高かったようです。VBAはVisual Basic for Applicationsの略です。ここで言うApplicationとは私たちにお馴染みのMicrosoft Officeやその他アプリケーションのことで、Windowsのアプリケーションを操作(開発)することが目的です。

Visual Basic (ヴィジュアル ベーシック)はマイクロソフトが1990年代に開発していたプログラミング言語およびその処理系。通常はVisual BasicまたはVBと呼ぶ。Visual Studioに組み込まれ、さまざまな種類のアプリケーション開発に用いられる。

Visual Basic - Wikipedia

Windows API

Windows上で動作するアプリケーションにとって、Windows APIはWindowsの各機能にアクセスするための接点である。

Windows API - Wikipedia

Windows上で動くアプリケーションプログラムの実行順序は、キーボード操作などのユーザーの操作によって変わります。なんらかのイベントがされた時にだけプログラムの特定ブロックが実行されるので、イベントドリブン方式といいます。

Windows API/イベントドリブン方式 - Wikibooks

Visual Basic は開発手法そのものを Windows API をまったく意識しない形式へと変化させました。

.NET CLASSROOM

つまり、VBAVisual 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プロパティで値を取得したり設定します。

取得・設定VBAGAS
Rangeオブジェクト・WorksheetクラスのRangeプロパティ他、下記表
・SelectionプロパティからRangeプロパティ
・SheetクラスのgetRange()メソッド
Value・各Valueプロパティ・Rangeクラスのget/set value(s)メソッド

Rangeオブジェクト(RangeとCells)|VBA入門
エクセルの根幹はセルです、セルはRangeオブジェクトになります、このRangeオブジェクトの理解なくしてマクロVBAは理解できません。マクロVBAで自在にセルを扱う為には、このRangeオブジェクトをしっかりと理解する必要があります。セルを表すVBA記述は多数存在します、Range、Cells、Rows、

VBAのプロパティには、値の設定・取得をするものと、オブジェクトを返すプロパティがあるというのがGASとの最大の違いかもしれません。

言語的な違い

Visual BasicはMicrosoftによって開発されたオブジェクト指向プログラミング言語です。(モジュールのように非オブジェクト指向の色を残している部分もあるのが厄介です💦)

オブジェクト指向言語は、クラスベースプロトタイプベースメッセージ構文ベースの三タイプに分類されるのが一般的である。クラスベースでは「C++」「Java」「C#」が代表的である。プロトタイプベースでは「Python」「JavaScript」「Ruby」が有名である。メッセージ構文ベースでは「Smalltalk」「Objective-C」「Self」などがある。

オブジェクト指向プログラミング - Wikipedia

VBAはクラスベースのようです。VBAがGASと違ってプロパティに、値の設定・取得をするものと、 オブジェクトを返すプロパティ(Rangeプロパティなど)があるのは、プロトタイプベースとの最大の違いなのかな?と予想していますが、今回はそこまでの考察はできませんでした。。。。

まとめ

さて、長くなってしまいましたが、以上がVBA初級講座3期の卒業LTで準備した資料です。実際のLTでは時間の都合で内容をそぎ落としました。

VBAの基本的な構文の書き方は、VBAを触り始めれば自然と覚えるものです。書き方なので忘れてもメモを見直せば問題ありません。しかしVBAの「オブジェクト変数」とGASの「変数」がどう違うのか別々に記憶するのはコストが掛かります。。。
なのでVBAで「オブジェクト変数」という名前が付けられているのは、GASやPythonがプロトタイプベース(元になるオブジェクトが存在していて、インスタンスはその複製を生成する)のクラスを採用しているために敢えて「オブジェクト変数」と言わないから、と理解すると効率が良さそうです。

しかしながら初級者の私がこのような(間違ってるかもしれない)考察を発表できる機会を頂きまして、いつもノンプロ研には大変感謝しています。

引き続き、VBA中級講座でよろしくお願いいたします。

このシリーズの目次

  1. [VBA]初級講座受講メモ -Day1とDay2-
  2. [VBA]初級講座受講メモ -Day3とDay4-
  3. [VBA]初級講座受講メモ -Day5‐
  4. [VBA]初級講座受講メモ -Day6‐
  5. [ノンプロ研]VBA初級講座3期卒業LTについて
タイトルとURLをコピーしました