● Access2000VBA・Excel2000VBA独学~VBAプログラミングとはどんなプログラミング方式なのか?~その2(詳細版:巷では意外と分類・整理・説明されていないこと)
※ご注意!! 以下の記事をお読みになってから、こちらの記事をお読みになってみてください。
『Access2000VBA・Excel2000VBA独学~VBAプログラミングとはどんなプログラミング方式なのか?(簡易版)』
※2018/09/28 追記
新しく、更に詳しく、図式化・一覧にしてみました。近いうちに記事にもします。
こちらの一覧で、まずは「プログラミングとは、どんなプログラミング言語であっても、”変数”と呼ばれるものを動かすことで”自動化”を実現する作業である・・・」ということを知っていただけたらと思います。
そしてVBAの場合は、その”変数”を動かす方法には2つあって、「一般データと一般変数」を操作する方法と、「オブジェクトとオブジェクト変数」を操作する方法、があるということ、それから「実際にはその混合形がほとんど」、ということを感じ取っていただけたら幸いです。
================
以下本文です。
★ はじめに
上記の記事にて、VBAプログラミングとはどんなプログラミング方式なのか?について書きましたがもう少し、実際の状況にも照らし合わせてご説明したいと思います。
★ 「オブジェクト」の実際~その1:簡易説明
VBAプログラミングは、(厳密には違うのかどうなのかわかりませんが一応)「オブジェクト指向プログラミング」の一種だそうですが、「オブジェクト」という言葉について先に少しご説明しておきます。
「オブジェクト」とは、例えばExcelの場合であれば、「セル、シート、ブック、ピボットテーブル、各種グラフ、オートシェイプ、テキストボックス、コマンドボタン、リストボックス、ダイアログ画面の機能、エラー管理機能、VBE管理機能、MicrosoftQuery機能、ADOやDAO機能、」等々をさします。(ADOやDAO機能、MicrosoftQuery機能はWordやAccessからも利用できる、Excelからは独立した別個の機能・ユニットですが・・・)
Excel、Word、Access、Outlook、PowerPoint、すべてひっくるめてで言うと、「何らかの機能をもったユニット・道具・ツール」のことをさします。
これは、目に見える・見えない・大きい・小さいに関係なく、「”ユニットと化した”各種の機能・メニューコマンド・ツールたち」のことをさします。
「”ユニットと化した”」とは、「単一の機能だけではなく、複数の機能をもったユニット・複数の色んな機能が集まったユニット」という意味で捉えてもらってよいと思います。
前述の「セル、シート、ブック、ピボットテーブル、各種グラフ、オートシェイプ、テキストボックス、コマンドボタン、リストボックス、ダイアログ画面の機能、」等々、目に見えるものだけでも見てみてください。
どれも複数の機能を持っていますよね。
そして、それぞれ大なり小なり「ユニット」という感じで捉えることができるものばかりだと思います。
また、メニューコマンドにしても複数の機能を持っているものもあります。
(なお、ExcelにはExcel独自の、AccessにはAccess独自の、WordにはWord独自の、PowerPointにはPowerPoint独自の、それぞれ、「オブジェクト」があります。)
後半でも説明しています。
ちょっと脱線しますが、WindowsOS上での「オブジェクト」という言葉は、「アイコンとしての”絵のかたち”になってはいるけど、でも、ファイルやフォルダじゃない。」という感じです。デスクトップに最初からあるアイコンやコントロールパネルの中にあるアイコン、タスクバーの上にあるアイコンなどです。
ファイルやフォルダじゃないというなら何?と聞かれると困るけど、「機能」とでも言いましょうか・・・
ある意味、VBAのオブジェクトと同じ解釈ですね。
「機能、複数の機能を持ったユニット」です。
ファイルじゃないので、ユーザーが何かデータを書き換えたり、コピペや削除はできません。設定を変えることができるだけです。
「コントロールパネル」や「設定」の各項目などは「オブジェクト」の集合体とも言えますね。
「オブジェクト」はそのように「機能」なので、削除できません。
「機能」をどんどんと削除してしまったら、すぐにWindowsが動かなくなってしまいます。
デスクトップのマイコンピュータアイコン、コントロールパネルアイコン、マイネットワークアイコン、も、ユーザーが自由に書き換え出ない「オブジェクト・機能・複数機能を持ったユニット」なので削除できません。
「ファイルじゃない」ので削除はできません。「機能」なので削除はできません。
(アイコン表示を消すだけのことはできる場合もありますが、それを「削除」と呼ぶかもしれません。)
★ おさらい「VBAプログラミングとは?」
では、今一度、VBAプログラミングとはどんなプログラミング方式なのか?についてですが、VBAプログラミングは以下のようなプログラミングです。
まずは短く・・・。
VBAプログラミングは、
「オブジェクト」に、
「プロパティ」を与え、
そのオブジェクトを、「メソッド」 や「関数」、「ステートメント」等々の「命令語たち」にて動かします。
そして各プログラムを自動実行させるタイミングについては、「イベント」というものを使います。
そういうプログラミング方式です。
(※ オブジェクトを操作することが多いですけど、もちろん操作せず文字操作などだけで終わることも多いです。)
さらにもう少し具体的に書きますと・・・
・「オブジェクト」に「プロパティ設定」をすることによって、
・「オブジェクト」に性質や動作特性または動作上の制約等を与え、そのあと、
・その「オブジェクト」の場合なら、「メソッド」や「ステートメント」「列挙(Enum)」「定数」といった命令語たちを使って・・・、
・また、「文字列や数値」の場合なら、「関数」や「ステートメント」「各種演算子」といった命令語たちを使って・・・、
・思い通りに動かす・・・、
・そういうプログラミング方式・・・。
(大雑把なイメージとしては、「動かす対象」は「オブジェクト」か「文字列や数値」かのいずれか、というイメージです。)
そんな感じでしょうか。
補足をつけて長ったらしく書いてしまいますと・・・
「オブジェクト(何らかの機能・黒子の機能の集合体・ユニット)」に、
「プロパティ」を与え(性質、特質、特性、状態、などを設定し)、
そのオブジェクトを、
「メソッド
(命令の一種)
特定のオブジェクト専用の命令です。
特定のオブジェクトと紐付いた、そのオブジェクト独自・専用の命令です。
そのオブジェクトでしか使えない、命令、です。
(文字や数値は直接は動かせません。それは次の「関数」でやります。)」 や
「関数
(こちらも命令の一種。
「命令群」という感じ)。
組み込み関数や自作関数があります。
特定のオブジェクトに特化してはいません。
基本、オブジェクトは動かせません
(オブジェクトのプロパティのようなものを取得だけのことはできます。)
ただ、メソッドのように「動かす」ことはできません。
どちらかというと「文字や数値」を動かす
(=加工・操作・判定等々をする)ためのものです。
文字列の自動操作や自動計算、各オブジェクトのことを調べる、
フォームやレポートでの自動処理、といった命令があります。」、
「ステートメント
(こちらも命令の一種。
定型基本命令構文、という感じ。)
例えば、メニューバーやリボンで言うと、
「ファイル、ホーム、編集、表示、・・・」といった雰囲気の
共用の命令だったり、あるいは、OS寄りの命令だったり、
スタート・ストップ・繰り返し・呼び出し・などの、
基本構文的な共用命令・制御文だったり、です。
こちらも特定のオブジェクトに特化してはいません。共用です。
http://officetanaka.net/excel/vba/statement/index.htm 参照。)」
等々にて動かします。
このとき、
「オブジェクト」は、基本的には「メソッド」や「ステートメント」で動かし、
「文字列や数値」は、基本的には「関数」やこれまた「ステートメント」で動かします。
(基本的には、「関数」ではオブジェクトを動かせません。同様に、「メソッド」では文字列や数値を切ったり貼ったり具体計算したり、といったことはできません。「ステートメント」は公用的な感じで、「分岐や繰り返し・停止・始動・エラー発生時の分岐処理、変数設定、等々」といった感じの命令なので、両方に使えます。)
(大雑把なイメージとしては、「動かす対象」は「オブジェクト」か「文字列や数値」かのいずれか、というイメージです。)
そして各プログラムを自動実行させるタイミングについては、「イベント」を使います。
(「イベント」という、ある意味、最初から、「ある定められたタイミング」で実行させます。例えば、「ボタンを押した」「何かをダブルクリックした」「フォーカスを移動した」などのあらかじめ決められたタイミングです。「あらかじめ決められたタイミング」、には、エンドユーザーがマウスやキーボードで何かした「目に見える」タイミングや、ExcelやAccessが内部で黒子のように何かを自動動作させたときの「目には見えない内部的な」タイミングがあります。)
そういうプログラミング方式です。
(※ オブジェクトを操作することが多いですけど、もちろん操作せず文字操作などだけで終わることも多いです。)
★ VBAプログラミングで実際に「取り扱うもの・操作するもの」は大きくは2つ
今さら、かもしれませんが、意外と明確に述べられていませんので、ここで一応述べておきたいとおもいます。
VBAプログラミングの中で、実際に取り扱うもの・操作するものは大きくは2つです。
「オブジェクト」
と
「文字列・数値・日付・等の生データ」
の
2つです。
これは、AccessやExcel、Wordで扱うようなVBAプログラミング、とりわけ、「ビジネスにおける定型・一般の事務処理」では顕著です。
逆に言うと、VBAプログラミングでは・・・、とりわけ「ビジネス定型・一般の事務処理」では・・・、その動かす「対象物」としては・・・、
「オブジェクト」
と
「文字列・数値・日付・等の生データ」
の
2つ
くらいしか「出てきません」・・・
・・・といってもいいくらいです。
※この2つほかに何かあるのかもしれませんけど・・・。もしそうだったらごめんなさい!
Excelでゲームプログラミングとかシュミレーションプログラミングとかしたことないもんですから・・・。でも、本当に一般的なビジネス事務処理ではほとんどこの2つばっかりです。
VBAに限らず、「オブジェクト指向プログラミング」は、多くはこんな感じだと思います。
★ 「メソッド」という命令語句と「関数」という命令語句の違いについて
専門家の方が言うには違うのかもしれませんが、でも、初心者の方がはじめてVBAを覚える段階では、「メソッド」も「関数」も「命令」の一種、と思ってくださって大丈夫です。
ただ、それぞれ、「動かすモノ」や「使う場面」が異なります。
前項の「オブジェクト」と「文字列・数値・日付・等の生データ」、という話と大きく関係があります。
まず、「メソッド」は、「オブジェクト」を操作するときだけしか使えません。
(「メソッド」は「特定のオブジェクト」だけに紐付いた、「そのオブジェクト独自の」命令だからです。参考記事→『用語:VBAプログラミングでの「メソッド」 について』)
逆に、「関数」は基本、「文字列・数値・日付・等の生データ」を操作するときにしか使いません。「文字列・数値・日付・等の生データ」をぶった切ったり、つなげたり、細かい計算をしたり、ということです。
逆に言うと、メソッドのように特定のオブジェクトに結びついている命令語句ではなく、「文字列・数値・日付・等の生データをぶった切ったり、つなげたり、細かい計算をしたり」、をすることがメインの命令語句なので、基本、オブジェクトの操作は「できません」。
※中学の時に習う「関数」似てるようで違うようで・・・とりあえず中学で習う関数のことは忘れてください。
関数には「ExcelやWordではなく」、「WindowsなどOSのオブジェクト」の持つ「なんらかの設定値を知る・参照する・あるいは設定する」ということはできることもあろうかと思いますので、なんとなく「オブジェクトを動かせる」ように見えてしまうかもしれませんが、でも、OS寄りのオブジェクトに対して何かはできても、「ExcelやWordやAccess・PowerPoint・Outlookなどの各オブジェクト」には何もできず、つまりは「動かせない」はずです。(もしかしたら動かせる関数があるかもしれませんが・・・。もしそうだったら僕の無知です。すみません。)
以上のような感じなので・・・、
「オブジェクト」は「メソッド」と「ステートメント」で動かす
「文字列・数値・日付・等の生データ」は「関数」と「ステートメント」で動かす
・・・という感じになってきます。
※さらに・・・補足・・・。
Excelの関数には、「数式」内だけでしか動かない「ワークシート関数」と、VBAプログラムでしか使えない「VBA関数」の2種類があります。「IF」はワークシート関数で「IIF」はVBA関数・・・、みたいな感じで、似た文言や動作で種類が違うことがあるので注意してください。「数式」内でVBA関数を使っても動かないし、逆に、VBA内でワークシート関数を使ってもエラーになりますので・・・。
ただ、VBAプログラム内で、ワークシート関数を無理やり使うことはできます。が、その場合は「WorksheetFunctionプロパティ」というものを使います。
逆に、「数式」内でVBA関数を使いたいなら、何らかの自作関数を作り、その中にVBA関数を含めるかたちになります。
★ ここまでと今後の説明をふまえた小さな「まとめ」
VBAとは、『 主に「オブジェクト」と「文字列・数値・日付・等の生データ」、を各種の命令語句で操作するプログラミングである 』と言えます。
VBAプログラミングで動かすものは、ほぼ、主に「オブジェクト」と「文字列・数値・日付・等の生データ」の2つだけ、と思っていただいて結構です。(特にビジネス定型”事務”処理では、この傾向が顕著です。)
そして
「オブジェクト」は「メソッド」と「ステートメント」で操作する、
「文字列・数値・日付・等の生データ」は「関数」と「ステートメント」で操作する、
そして、プログラムを実行させるタイミングは「イベント」と呼ばれる「あらかじめ決められたタイミング・シーン」です。そのシーン・タイミングで「自動実行」されるようにセットします。(セットには「イベントプロシージャ」というプログラムのかたまりを使います。)
そういうプログラミングです。
なお「操作する」とは「動かす」「設定する」「値を加工・集計する」というような意味です。
「オブジェクト」の場合の「操作」では、「メソッド・・・例えば、開く、閉じる、印刷する、移動する、最大化・最小化する、コピペする、・・・などのメニュー化された命令やその他の命令」を使って、まさに「動かす」ことをしたり、あるいは、「プロパティ(色や大きさなどの”性質”)」というものの設定値を変更することで、あたかも動いているように見させる・・・という処理をすることが多いです。
「文字列・数値・日付・等の生データ」の「操作」では、オブジェクト(例えばExcelならセルやテキストボックス、ワードなら白紙など)に入力された「文字列・数値・日付・等の生データ」や、「オブジェクトのプロパティ(色や大きさなどの”性質”)」の設定値などを、「関数」を使って「切り出し、挿入、結合、分解、部分削除、入れ替え、四則演算、集計、等々」といった処理をすることが多いです。
もちろん、1つのプログラムの中では、両者はお互いに存在し合い、いろいろに組み合わされてプログラミングされていきます。「どちらかだけ」ばっかりが存在する・・・、ということは・・・あるにはありますが(特に文字列・数値・日付データ操作のほう)、プログラム全体からするとその割合は少なめです。
また、いずれの「操作」も「変数の宣言(定義)、変数への代入、条件分岐、繰り返し、繰り返しからの離脱、ストップアンドゴー、エラー対策」といった「ステートメント」と呼ばれる、「命令構文」「制御文」を使って、細かい動きを決定していきます。
ちなみにですが、「If・・・Then・・・else・・・End if」というのもステートメントのひとつですが、ビジネス定型事務処理の場合、(初心者のうちは)このステートメントさえ知っていれば、7~8割くらい、カバーできてしまいます。
そういうプログラミングです。
★ 「オブジェクト」の実際~その2:別の視点での「オブジェクトとは?」について
※絶対にこちらも読んでおいてください!! ↓↓↓
★★★★★★★★★★★★★★★★ 超重要!!必読!!ExcelVBAが上達するかどうかの最初の分かれ道!オブジェクトとオブジェクト式について~★★★★★★★★★★★★★★★★
少し詳しく、でもそこそこまとめた記事です。
「オブジェクト」には大きく分けて2種類があります。
(01)明らかに動作(メニュー・メソッド)を持つ(ように見える)もの
と
(02)動作(メニュー・メソッド)を持たない(ように見える)けど、設定値だけは持つ(ように見える)もの
の
2つです。
(01)は、「開く」「閉じる(×ボタン)」「最小化・最大化」「印刷する」「移動」といった、何らかのメニュー(=動作=「メソッド」)が目立って「目に見える」ものです。
例えばExcelの場合は、ファイル、シート、ピボットテーブル、各種のグラフ、Microsoft Query、DAOオブジェクト、ADOオブジェクト、などです。大きさとして言えば結構大きめなもの、「でっかいユニット・機能」ですね。
DAOオブジェクト、ADOオブジェクト、などは目には見えませんが(かつExcel独自ではなくAccessやWordなどからも使える汎用のオブジェクトですが)、「開く」「閉じる(×ボタン)」「移動」といった、何らかの「メニュー」的なものを持っています。
(02)の場合は、「開く」「閉じる(×ボタン)」「最小化・最大化」「印刷する」「移動」といった、何らかの「メニュー」は目に見えません。ですが、「設定値」を設定することで「動いている」ように見えるモノです。また(目には見えてきにくいですが)実は、ちゃんと「メソッド」も持っています。
こちらはExcelの場合、セル、オートシェイプ、テキストボックス、コマンドボタン、テキストボックス(文字入力欄)、ドロップダウンメニュー(コンボボックス)、リスト、などです。「部品めいたもの」とか「ミニミニ機能」って感じでしょうか。
いずれにしましても、(01)も(02)も、すべて、「オブジェクト」です。
★ 「オブジェクト」は絶対に「プロパティ(各種の設定値)」を持ちます
「オブジェクト」は「メソッド」を必ず持ちます。
でも、メソッドを持っているのかいないのか、自分が初心者の時はなかなかわかりません。
でも、「プロパティ(各種の設定値)」を持っていることは絶対に初心者の方でもわかります。
なので、VBAプログラミンの場合、ExcelでもWeodでもAccessでも「プロパティ」を持っているものは「オブジェクトだ」と思っていただいてOKです。
基本、「プロパティ」を持つものはかならず「メソッド」も持っていますので。(最初のうちはメソッドというものをとらえにくいかもしれませんが、でもそう思っていただいてまず間違いはないです。そう覚えちゃってください。)
そして、万が一(たぶん無いとは思うんですが)、「プロパティを持つものがメソッドを持っていなかった」としても、「プロパティ(各種の設定値)」を変えることで「動いているように見える」です。
例えば「コマンドボタン」や「テキストボックス」は、「押す」とか「入力する」ということしかできないように見えがちですが、そうでもありません。
「××の数値が××以上になったら、ボタンの文字の色を自動的に赤にして、××以下なら自動的に青にする」(あるいはグレーアウトさせて押せないようにさせる、とか)
とか、
「××の数値が××以上になったら、テキストボックスの位置を、画面の100×200の位置から、200×300の位置に移動させる」
とか、
そういったことができます。
色を変えるときは「×× Coler」プロパティの設定値を変えますし、位置を移動させるには、「Top」とか「Left」といったプロパティの設定値を変えます。
テキストボックスやボタンだけでなく、オートシェイプ(四角、丸、星型、などの図形)も「Top」とか「Left」といったプロパティの設定値を変えると動いているように見えます。
テキストボックスや
ちなみにですが、「オブジェクト」には、メソッドやプロパティを持たないものはありませんが、「イベント」を持たないものはあります。
※ 参考サイト
以下のサイトの画面左側の「オブジェクト モデル」のところをクリックすると、各オブジェクト名が出てきますので、それをクリックすると、右側に「プロパティ」や「メソッド」が出てきます。
イベントをもつオブジェクトなら、イベントも表示されます。
Excelのオブジェクトがもつメソッドやプロパティ、イベントを調べる
『オブジェクト モデル (Excel VBA リファレンス)』
Accessのオブジェクトがもつメソッドやプロパティ、イベントを調べる
『オブジェクト モデル (Access VBA リファレンス)』
Wordのオブジェクトがもつメソッドやプロパティ、イベントを調べる
『オブジェクト モデル (Word VBA リファレンス)』
Outlookのオブジェクトがもつメソッドやプロパティ、イベントを調べる
『オブジェクト モデル (Outlook VBA リファレンス)』
PowerPointのオブジェクトがもつメソッドやプロパティ、イベントを調べる
『オブジェクト モデル (PowerPoint VBA リファレンス)』
ADOやDAO
『Access デスクトップ データベース リファレンス』
『Microsoft データ アクセス オブジェクト (DAO)リファレンス』
★ 「コントロール」と「オブジェクト」
「コントロール」=「部品」「パーツ」みたいな感じです。
機能としては大きくはないですが、「コントロール」も「オブジェクト」の一種です。
「フォーム」と呼ばれる「自作の画面」の中に配置する部品のことを言います。
(ExcelやWordだと「ユーザーフォーム」。AccessやVisualBasicだと単に「フォーム」。)
テキストボックス、ラベル、リストボックス、コンボボックス、コマンドボタン、トグルボタン、フレーム、など、のことを言います。
「ActiveXコントロール」と呼ばれることもあります。
「部品」なんですけれども、全部、「オブジェクト」です。
「コントロール」にも、すべて、「プロパティ」があり(少ないですけど)「メソッド」があります。
★ 「オブジェクト」の操作の実際~「オブジェクトを動かす」とは?
前述もしましたが、「オブジェクトを動かす」とは・・・、
「メソッド」で動かす
あるいは、
「プロパティ」を何らかの条件で変えていくことによって「あたかも動いているように見させる」
・・・ということになってくると思います。
★ 「文字列・数値・日付・等の生データ」の操作の実際
※関連記事
● 「オブジェクト」について
用語:VBAプログラミングでの「オブジェクト」 について
● 「プロパティ」について
用語:VBAプログラミングでの「プロパティ」 について
● 「メソッド」について
用語:VBAプログラミングでの「メソッド」 について
● その他
[★ AccessやExcel等のVBAの独学に超重要!!] とりあえず Access2000 テキストボックスやフォーム、サブフォーム、レポート、サブレポート、その他、等々を参照したいときのコードの書き方(参照方法)と重要注意事項
=====================