さて、このところ更新を怠っていたワレコのサイトであるが、熱烈な読者の方からEXCEL VBAプログラミング記事に関して質問を頂いた。
この記事だ。
その質問内容は以下の通り。
康村 より:
2018年12月22日 11:11 AM(編集)
こんにちは。今会社内でPC言語に強くならないといけなくなった一社員です。色々見てるうちにこちらのサイトにたどり着き、内容を見ながら自分でもやってみていたのですが躓いておりますのでご教示いただければ大変うれしゅうございます。
1.1のところで全く式は同じだと思うのですが、マクロを実行すると「オブジェクトはこのプロパティまたはメソッドをサポートしていません。」と出ます。
解決策はお分かりになりますでしょうか。
ちなみにPCは今月購入したばかりのWin10の64bit、H&B2016です。
関係ないかもしれませんが念のためお知らせしておきます。
太字で示したエラーが出るらしい。
う~ん、原因が分からん。
どこでこのエラーが出ているのか、それも不明だ。
早速調査してみた。
「EXCEL VBAのFor Nextループをマスターする」の解説
まずは、上で示した「初心者向け EXCEL VBA (3/10) – EXCEL VBAのFor Nextループをマスターする」と言う記事の「1.1のところ」手順を詳細に解説してみる。
ワテのEXCEL環境
ワテの場合は、EXCELの実行環境は
- Windows10 (64)
- EXCEL 2013 (32) Office 2013 Professionalに入っているやつ
だ。
VBAの実行に関してはEXCELの32bit版でも64bit版でも、普通にVBAを実行する場合はどちらのバージョンを使っても良いだろう。
64bit版のメリットは、32bit版に比べて大量のメモリを扱えるので大量のデータを処理したい場合などにメリットがある。
ただし、64bit版は以下の制限事項があるので、その場合は32bit版を使う必要がある。
- 代替の 64 ビット版のない 32 ビット COM アドインの場合
- 代替の 64 ビット版のない 32 ビット版のコントロールを使用している場合。
- まれなケースですが、Declare で動作しない 64 ビット API があります。
引用元 https://support.office.com/ja-jp/article/64-ビット版または-32-ビット版の-office-を選択する-2dee7807-8f95-4d0c-b5fe-6c6f49b8d261
従って、ワテがEXCEL2013(Office2013)をインストールした2013年頃は、特に理由が無ければ32bit版のインストールが推奨されていた。
2018年現在も多分似た様な状況だとは思うが、Office2019辺りが出れば、いよいよ64bit版を使ってみるかなあと思っている。
さて、本題に戻って、康村さんのお問い合わせに対する解説を始めたい。
まずEXCELを起動する
図 EXCEL 2013の起動直後の画面
開発タブをクリックしてVisual Basic Editorを開く
下図のように[開発]タブをクリックして、Visual Basic Editorを開く。
もし[開発]タブが見付からない場合には、
ファイル
オプション
リボンのユーザー設定
で、リボンに[開発]を追加すれば良い。
図 Visual Basic Editorアイコンをクリックする前
上図でVisual Basic Editorアイコンをクリックすると下図が出る。
標準モジュールを追加する
下図のようにVisual Basic Editorが開くので、「標準モジュール」を追加する。
図 標準モジュールを追加する方法
標準モジュールを追加するには、上図のように、
Microsoft Excel Objects
の上で右クリックして、
挿入
標準モジュール
を選択すれば良い。
無事に標準モジュールが追加されると、下図のようになる。
図 標準モジュールを追加した直後の画面
VBAのソースコードをコピーペーストで貼り付ける
この記事の第1.1章、
にある以下のVBAソースコードをコピーする。
図 二次元領域をループするサンプルVBAコード
そのVBAコードを、下図に示すように貼り付ける。
図 VBAコードを貼り付けた直後の状態
念のためにそのVBAコードを以下に示す。
Sub test1_二次元領域をループする()
Dim r As Long ' 行(row)ループカウンター
Dim c As Long ' 列(col)ループカウンター
Const rsta As Long = 5 ' 行(row)開始番号
Const csta As Long = 5 ' 列(col)開始番号
Const rend As Long = 25 ' 行(row)終了番号
Const cend As Long = 15 ' 列(col)終了番号
For r = rsta To rend
For c = csta To cend
ActiveSheet.Cells(r, c) = "R" + CStr(r) + ":C" + CStr(c) ' 文字列連結は + か &
'ActiveSheet.Cells(r, c) = "R" & CStr(r) & ":C" & CStr(c) ' なのでこれでも良い
'ActiveSheet.Cells(r, c).FormulaR1C1 = "=RC[-2]+RC[-1]" '計算式も入れられる
Next c
Next r
End Sub
このVBAコードは、https://www.wareko.jp/blog/post-17279 の第1.1章のコードと同じだ。
VBAコード早速実行してみる。
VBAコードを実行する
まず、下図の赤い四角■で示すように、今貼り付けたVBAコードのどこでも良いので、Sub関数の中のどこかをマウスでクリックしてカーソルが点滅している状態にしておく。
図 マウスカーソルをsubの中に置いて、実行▶をクリックした直後の状態
上図のようにマウスカーソルをsubの中に置いて、実行▶をクリックすると、Sub関数
test1_二次元領域をループする()
が実行される。
その結果、EXCELのアクティブシートにこんなデータが書き込まれれば成功だ。
R5:C5 | R5:C6 | R5:C7 | R5:C8 | R5:C9 | R5:C10 | R5:C11 | R5:C12 | R5:C13 | R5:C14 | R5:C15 |
R6:C5 | R6:C6 | R6:C7 | R6:C8 | R6:C9 | R6:C10 | R6:C11 | R6:C12 | R6:C13 | R6:C14 | R6:C15 |
R7:C5 | R7:C6 | R7:C7 | R7:C8 | R7:C9 | R7:C10 | R7:C11 | R7:C12 | R7:C13 | R7:C14 | R7:C15 |
R8:C5 | R8:C6 | R8:C7 | R8:C8 | R8:C9 | R8:C10 | R8:C11 | R8:C12 | R8:C13 | R8:C14 | R8:C15 |
R9:C5 | R9:C6 | R9:C7 | R9:C8 | R9:C9 | R9:C10 | R9:C11 | R9:C12 | R9:C13 | R9:C14 | R9:C15 |
R10:C5 | R10:C6 | R10:C7 | R10:C8 | R10:C9 | R10:C10 | R10:C11 | R10:C12 | R10:C13 | R10:C14 | R10:C15 |
R11:C5 | R11:C6 | R11:C7 | R11:C8 | R11:C9 | R11:C10 | R11:C11 | R11:C12 | R11:C13 | R11:C14 | R11:C15 |
R12:C5 | R12:C6 | R12:C7 | R12:C8 | R12:C9 | R12:C10 | R12:C11 | R12:C12 | R12:C13 | R12:C14 | R12:C15 |
R13:C5 | R13:C6 | R13:C7 | R13:C8 | R13:C9 | R13:C10 | R13:C11 | R13:C12 | R13:C13 | R13:C14 | R13:C15 |
R14:C5 | R14:C6 | R14:C7 | R14:C8 | R14:C9 | R14:C10 | R14:C11 | R14:C12 | R14:C13 | R14:C14 | R14:C15 |
R15:C5 | R15:C6 | R15:C7 | R15:C8 | R15:C9 | R15:C10 | R15:C11 | R15:C12 | R15:C13 | R15:C14 | R15:C15 |
R16:C5 | R16:C6 | R16:C7 | R16:C8 | R16:C9 | R16:C10 | R16:C11 | R16:C12 | R16:C13 | R16:C14 | R16:C15 |
R17:C5 | R17:C6 | R17:C7 | R17:C8 | R17:C9 | R17:C10 | R17:C11 | R17:C12 | R17:C13 | R17:C14 | R17:C15 |
R18:C5 | R18:C6 | R18:C7 | R18:C8 | R18:C9 | R18:C10 | R18:C11 | R18:C12 | R18:C13 | R18:C14 | R18:C15 |
R19:C5 | R19:C6 | R19:C7 | R19:C8 | R19:C9 | R19:C10 | R19:C11 | R19:C12 | R19:C13 | R19:C14 | R19:C15 |
R20:C5 | R20:C6 | R20:C7 | R20:C8 | R20:C9 | R20:C10 | R20:C11 | R20:C12 | R20:C13 | R20:C14 | R20:C15 |
R21:C5 | R21:C6 | R21:C7 | R21:C8 | R21:C9 | R21:C10 | R21:C11 | R21:C12 | R21:C13 | R21:C14 | R21:C15 |
R22:C5 | R22:C6 | R22:C7 | R22:C8 | R22:C9 | R22:C10 | R22:C11 | R22:C12 | R22:C13 | R22:C14 | R22:C15 |
R23:C5 | R23:C6 | R23:C7 | R23:C8 | R23:C9 | R23:C10 | R23:C11 | R23:C12 | R23:C13 | R23:C14 | R23:C15 |
R24:C5 | R24:C6 | R24:C7 | R24:C8 | R24:C9 | R24:C10 | R24:C11 | R24:C12 | R24:C13 | R24:C14 | R24:C15 |
R25:C5 | R25:C6 | R25:C7 | R25:C8 | R25:C9 | R25:C10 | R25:C11 | R25:C12 | R25:C13 | R25:C14 | R25:C15 |
表 VBAコードの実行結果
単に、EXCELシート上の長方形領域に文字列データを書き込んだだけの処理である。
まあ、このように行(row)と列(col)の二重のforループを使えば、データを書き込んだり、逆にデータを読み取ったりする事が可能だ。
あとは、読み取ったデータを自分の必要な形式に加工する、
あるいは、加工データの書き出し先を別のシートにする、
などいろいろ工夫すれば、EXCELのデータを自由自在に加工出来るだろう。
まとめ
さて、当記事は、読者の康村さんからお寄せ頂いた質問に対する解説記事として作成した。
康村 より:
1.1のところで全く式は同じだと思うのですが、マクロを実行すると「オブジェクトはこのプロパティまたはメソッドをサポートしていません。」と出ます。
康村さんが報告されている、
「オブジェクトはこのプロパティまたはメソッドをサポートしていません。」
がどの部分で出たのかが不明であるが、少なくともこの解説記事の手順で実行して頂ければ、問題無く実行出来ると思うのだが。
この記事を参考に康村さんに再テストして頂いて、その実行結果を待ちたい。
まあ、この記事を機会にワテももう少し頻繁に記事を更新して行きたい。
コメント