shigeの言いたい放題

アクセスカウンタ

zoom RSS VBAにお悩みの方から

<<   作成日時 : 2017/05/18 06:57   >>

トラックバック 0 / コメント 2

ExcelのVBA(Visual Basic for Applications)をお仕事で使っているが、上手く作れない、よくわからないという知り合いから相談を受けました。

「マクロの記録」で生成されるマクロを元に変更して使っていたりはしたことが有るそうなので、Basicの部分はご理解しているようです。

すると、無数にあるオブジェクトとそのプロパティ、メソッドを使いこなせないか、そもそもオブジェクト指向を理解できていない可能性が有ります。

ご本人、オブジェクト指向は苦手とおっしゃるので、その辺でしょうね。

「オブジェクトとは」と検索すると、「世の中の物を抽象化したもの」みたいな説明が出てくると思います。

Excelで言えば、Excelファイルを開いた時に現れる罫線に囲まれた四角がたくさんありますね。
これをセルと言いますが、これもオブジェクトとして扱われます。(Rangeオブジェクトという名前が付いています。)

セルには、そこに入力された数値や文字という「値」を持ちますし、手操作でもセルを選択してコピーしたり、ペーストしたり、セルを削除したりという「操作」をしますよね。

そういう、値や操作を一まとめにしたものが、この例で言えばセルという「オブジェクト」です。

丁度、人間に名前や年齢、住所などの値があり、挨拶や依頼(操作)をすると何かしらの振る舞いを示すのと同じです。
人間は一つのオブジェクトとみなせるわけです。

この、「値」をオブジェクト指向ではプロパティと言い、「操作」をメソッドと言います。

もしかしたら、使用者には見られない値を持っているかもしれませんし、操作をしたときに内部で何が起きているかは使用者の知るところでは有りません。

クルマのボンネットを開けてもチンプンカンプンな人でも、メーター(値、プロパティ)を見ながら、ハンドルやペダル類を操作(メソッドの使用)をすれば、クルマ(オブジェクト)を運転できるのと同じです。

あと、オブジェクトは他のオブジェクトの組み合わせで出来て居る事もあります。

クルマがエンジン、車体、座席などのような部品からできているように。

Excelで言えば、上述のセルというオブジェクトがたくさん集まって、シートができていますね。
シートもWorkcheetというオブジェクトです。
そして、1枚以上のシートが集まって一つのExcelファイルが構成されます。
ExcelファイルもWorkbookというオブジェクトです。

なので、"Book1.xlsm"というファイルの、"Sheet1"と言うシートの"B2"のセルは、丁寧に書くと

Workbooks("Book1.xlsm").Worksheets("Sheet1").Range("B2")

となります。

このセルの値は

Workbooks("Book1.xlsm").Worksheets("Sheet1").Range("B2").Value

です。

Atai = Workbooks("Book1.xlsm").Worksheets("Sheet1").Range("B2").Value

とすれば、変数AtaiにB2のセルの値を代入する事が出来ますし、逆に

Workbooks("Book1.xlsm").Worksheets("Sheet1").Range("B2").Value = "a"

とすれば、B2のセルに"a"という文字を入力する事ができます。

このように階層構造になって居るオブジェクトは多いです。

そんなオブジェクトの階層構造やプロパティ(値)、メソッド(操作)の一覧は

https://msdn.microsoft.com/ja-jp/library/office/ff194068.aspx

に有ります。
マイクロソフトのオフィシャルな情報なので、網羅的で正確です。
セル、シート、ブックと言った、イメージしやすいところから眺めて行って、思いついたことを色々試してみると勉強になると思います。

質問された知り合いはセルの操作の所で悩んでおられたようなので、もう少し書きましょう。

Rangeオブジェクトは、上記のように一つのセルを指定して操作をすることができますが、

Range("A1:H8")

のように記述すれば、複数のセルをまとめて操作する事も出来ます。

また、その時々の場合によって、セルを選択したい場合も有りますよね。
その場合は、Cellsを使うと便利です。

Cells(1,1)

と言うのはA1のセルの事。

Cells(2,1)

はA2のセルの事です。

Cells(行番号,列番号)

という具合です。

ここで、行番号、列番号に定数では無く、変数を指定する事も出来ます。

例えば

For Row = 1 To 9
 For Column = 1 To 9
   Cells(Row, Column) = Row * Column
 Next Column
Next Row

というプログラムを動かせば、九九表が作れます。

また、Rangeと組み合わせて複数のセルの範囲を指定する事も出来ます。

Range(Cells(Row1, Column1), Cells(Row2, Column2))

のように記述すれば、Row1行からRow2行、Column1列からColumn2列に対して値を入れたり、操作をすることができます。


書き出すときりがないので、今回はこの辺までにしておきます。

(注:オブジェクト指向の説明の所で、クラスとオブジェクトをごっちゃにして説明していますが、VBAではクラスを意識する事はほとんどないので、オブジェクトで統一して説明しています。)

ちなみに、私がVBAを勉強し始めたときは、Basicはもちろん、オブジェクト指向の基礎的な知識も有ったので、各オブジェクト、メソッド、プロパティのリファレンスマニュアルが欲しかったので、以下の本を買いました。
当時はマイクロソフトのページのリファレンスマニュアルは英語しかなかったと思うので、この本を買いましたが、今は日本語のリファレンスのページが有るのでネットが使える環境でプログラミングする限りは不要ですね。


2010/2007対応ExcelVBA辞典 (Office2010Dictionary Series)
秀和システム
中村 峻

amazon.co.jpで買う
Amazonアソシエイト by 2010/2007対応ExcelVBA辞典 (Office2010Dictionary Series) の詳しい情報を見る / ウェブリブログ商品ポータル



ブログランキング・にほんブログ村へ
にほんブログ村

テーマ

関連テーマ 一覧


月別リンク

トラックバック(0件)

タイトル (本文) ブログ名/日時

トラックバック用URL help


自分のブログにトラックバック記事作成(会員用) help

タイトル
本 文

コメント(2件)

内 容 ニックネーム/日時
Excelにイルカくんが出てきていたような頃には、Excelのインストールオプションを細かく見てみると、VBAのヘルプファイルがあったりしたのは知られていないでしょうね。(デフォルトはインストールされない)
当時の自分は、インストールオプションを細々と読み尽くす人だったので、VBAのヘルプファイルもインストールして、それを見てVBAを勉強しました。
大昔の懐かしい思い出です。
KAWAI
2017/05/28 17:59
KAWAIさん、ご無沙汰してます。
ほう、だいぶ以前からVBAに慣れ親しんでいらしたのですね。
私は2010年ごろからで、ブランクも結構ありますので、まだまだ若輩者です。
t.shige
2017/05/28 18:08

コメントする help

ニックネーム
本 文
VBAにお悩みの方から shigeの言いたい放題/BIGLOBEウェブリブログ
文字サイズ:       閉じる