[三流君(ken3.org)]/ [VBA(TOP)]/ [F1でヘルプを見る]/ [Debug.Printを使い値の確認]/ [ウォッチ式とSTOP]/ [デバッグ方法ほか]

VBA 参照設定のお話 参照設定してから組み始めてね

こんにちは、三流プログラマーKen3です。

今回は、参照設定のお話を少し、軽く書きたいと思います。

普通に使用しているとあまり関係無いので、
へぇ〜、そうなんだぁ程度に、気楽に読んでください。

昔、愚痴系で書いてた(はじめはVBAもここでやってた)
[Dim objExcel As New Excel.Application を後輩に教わる] ←解説(実力と年齢関係ない)

参照設定のエラー、[Access97 標準関数Midなどが使えない] もヨロシクです。

参照設定のお話 オブジェクトの作成 フォルダーの選択を解説

/*
 * 1.今回のキッカケ
*/

AccessからExcelのApplication.GetOpenFilenameを使用して、
ファイル名を取得する解説を
No.47 Excel Application.GetOpenFilenameでファイル名取得
http://www.ken3.org/backno/backno_vba10.html#47
でやりました。
サンプルファイルは、
http://www.ken3.org/vba/lzh/vba047.lzh
にtest047-book.xls, db047.mdbが保存されています。
(Excel97,Access97)

ポイントは、
CreateObject("Excel.Application")
で、頼もしいExcel君を参照して、
---
Private Sub btnExcelを開く_Click()

    Dim oApp As Object
    Set oApp = CreateObject("Excel.Application")
    oApp.Visible = True
    oApp.UserControl = True

    Dim strFNAME As String  'ファイル名
    strFNAME = oApp.Application.GetOpenFilename("画像 ,*.jpg; *.gif; *.bmp")
    MsgBox "選択されたファイル名は" & strFNAME

End Sub
---
Application.GetOpenFilename を使っただけでした。

読者より、下記のメールをいただく(しょうもさんどうもです)

In message "ファイル名を取りたくて",
しょうもさん wrote...
 >[VBAで楽しくプログラミング No.047]
 ><Excel Application.GetOpenFilenameでファイル名取得>について
 >
 >ご指摘の通りExcelのGetOpenFilename メソッドって便利ですよね。
 >私はWordを使っている時間の方が長いのですがWordの組み込みダイアログ
 >は正直使いにくいです。
 >
 >ChDrive "C"
 >ChDir "C:\My Documents"
 >Dialogs(wdDialogFileOpen).Display
 >
 >なんてしても、反映されません。
 >いちいち
 >
 >Options.DefaultFilePath(wdDocumentsPath) = "C:\My Documents"
 >
 >などと既定フォルダの変更をしないといけないのです。
 >
 >そこでちょっと前までWord2000使っていたときはExcelを呼び出して
 >GetOpenFilename メソッド使っていたのですけれど
 >Office XP にしてからは、FileDialog オブジェクトを使うようにしています。
 >
 >「FileDialog オブジェクトの使用」
 >http://www.microsoft.com/japan/msdn/officedev/officexp/odc_filedlgobjs.asp
 >
 >Accessで使えるのかどうかは未確認です。
 >当方のOutlookではエラーが発生します。
 >
 >あと、フォルダの選択だけでしたらShellバージョンにもよりますが
 >Dir 関数使ってファイルを総当りするときはShell32使うことが多いです。
 >
 >「Microsoft Shell Controls And Automation」参照設定で
 >
 >    Dim objShell As New Shell
 >    Dim objFolder As Shell32.Folder
 >    Const strTitle = "フォルダを選択してください。"
 >    'フォルダー参照に設定
 >    Const lngRef = &H1
 >    'ルートフォルダーをデスクトップに設定
 >    '5でMy Documents、6でFavoritesなど
 >    Const fldRoot = &H0
 >    
 >    Set objFolder = _
 >            objShell.BrowseForFolder(0, _
 >                strTitle, lngRef, fldRoot)
 >    Set objShell = Nothing
 >    If objFolder Is Nothing Then Exit Sub
 >    Debug.Print objFolder.Self.Path
---

ワードのVBAかぁ、アンケートの中にも少数意見でやってよとあったなぁ。
っと、今回は「FileDialog オブジェクトの使用」も気になるけど、
「Microsoft Shell Controls And Automation」
にチャレンジしてみたいと思います。

/*
 * 2.まず、参照設定を設定する (フォルダー選択のテスト)
*/

送ってもらった、ソースを元に作成するとして(おいおい、コピーだろ)
まず、参照設定をいじります。

「Microsoft Shell Controls And Automation」
を
設定したいので、

Excel を 開いて、Alt+F11でVBAのエディターを開いてと、
(私のメイン環境、Win98 Excel97で実行)
ツールの参照設定を選択、
  ←メニューから参照設定を選択

「Microsoft Shell Controls And Automation」
を探して、チェックを付けます。
  ←レのチェックをつける

作成したテストプログラム
( http://www.ken3.org/vba/lzh/folder-test.lzh に folder-test.xls 保存 )

Sub test()

    Dim objShell As New Shell
    Dim objFolder As Shell32.Folder
    Const strTitle = "フォルダを選択してください。"
    'フォルダー参照に設定
    Const lngRef = &H1
    'ルートフォルダーをデスクトップに設定
    '5でMy Documents、6でFavoritesなど
    Const fldRoot = &H0
    
    Set objFolder = _
            objShell.BrowseForFolder(0, _
                strTitle, lngRef, fldRoot)
    Set objShell = Nothing
    
    'フォルダー名を取出す
    Dim strMSG
    If objFolder Is Nothing Then 'キャンセルチェック
        strMSG = "キャンセル押しやがって、えっキャンセル押されたらのテスト?"
    Else
        If objFolder.ParentFolder Is Nothing Then
            strMSG = "選択されたのは[ルート(デスクトップ)]です"
        Else
            strMSG = "選択されたのは[" & objFolder.Items.Item.Path & "]です"
        End If
    End If
    MsgBox strMSG

End Sub

テストで、実行してと、OKできました。やりぃ。(と喜ぶKen3)
  ←実行時画面
  ←実行結果msgbox

チョット、アンタ今日、解説しないつもり?
あっ、そっか(笑)

えっと、まず、参照設定が必要な理由ですが、
    Dim objShell  As New Shell
    Dim objFolder As Shell32.Folder
と、ここで、
「Microsoft Shell Controls And Automation」
で定義されているオブジェクトを使用するためだったんです。

さっぱり、何言ってんだかわからないんだけど?
う〜ん、なんて説明しようかなぁ。。。

/*
 * 3.As New でオブジェクトの作成
*/

今日は、キレがないから、昔の自分に頼ってと(最近多いよね他所に飛ばすの)

昔、愚痴系で書いてた(はじめはVBAもここでやってた)
[Dim objExcel As New Excel.Application を後輩に教わる]
http://www.ken3.org/backno/backno_guchi06.html#26 ←解説(実力と年齢関係ない)
http://www.ken3.org/backno/hosoku/026/index.html  ←画像付き
を見てもらうと、
AccessでExcelのオブジェクトを参照設定して、
Dim objExcel As New Excel.Application
と、オブジェクト変数を定義して使用してます。

このように書くと、
Dim objExcel As Object
Set objExcel = CreateObject("Excel.Application")
とやらなくて済むのと、
oApp.とピリオドを打った時点でオブジェクトのメンバーが自動に表示されます。
 ←参考画像

なぜか、それは、オブジェクトを参照設定後に、
Dim objExcel As New Excel.Application
この変数objExcelはExcel.Application型(オブジェクト)ですよ
と指定してるからなんです。
*言われてみると普通のような、でもなれないと?だよね。

/*
 * 4.環境の違いで参照オブジェクトが無い時、や正しく参照されない時
*/

参照設定、便利なんだけど、注意事項がひとつ
当たり前の話、
開発したマシーンで
オブジェクトを参照設定、
Dim objExcel As New Excel.Application
でオブジェクト参照する変数を作成。
なんてやっても、
実行マシーンにExcelが入ってないと使えません。
*普通の話か(笑)

あと、あるのが、バージョンの違いで、参照できなかったりする場合があります。
Office2000が出た時、流行ったトラブルはチョット違うけど、
参照不可のエラーで動かないパターンでした。

<Access97 標準関数Midなどが使えない>
http://www.ken3.org/backno/hosoku/e032/index.html
で、設定エラーについて軽く書いてます(また、飛ばすの?好きだねぇ)

しょうもさんも書いてますが、
 >あと、フォルダの選択だけでしたらShellバージョンにもよりますが
 >Dir 関数使ってファイルを総当りするときはShell32使うことが多いです。
---
例えば、OSのバージョンによって、
Shellバージョン、オブジェクトが微妙に変化していて
ローカルバージョンに依存したプロパティやメソッド使っていると、
動かない場合があります。

/*
 * 5.おわりの挨拶
*/

今回は、
・参照設定の話
・As New XXXXXX の宣言
・参照不可などのトラブルについて
でした。

なんか、フォルダー選択で発行したほうが正しいタイトルみたいだけど(笑)
作成したフォルダーのテストプログラム
http://www.ken3.org/vba/lzh/folder-test.lzh
にfolder-test.xlsで保存してます。
サンプルはExcelですが、
Access,Word(そろそろ1つは書きたいね)のVBAから使えると思います。
*参照設定だけ忘れないでね(注意事項も)

何か素朴な疑問などあったら、メール、掲示板に気軽に書いてください。

拾い読みして、
1つでも何かの参考となれば幸いです。

Excel/Access大好き、三流プログラマーKen3でした。

#IE IE Web Browser を使う場合の参照設定

IE Web Browser を使う場合の参照設定

IE操作のプログラムを組む前に まずは、参照設定かなぁ。
コードを書くとき、探る時、参照設定しておくと .ドットをタイプした時にメソッドやプロパティが表示されるので便利です。下記 私が操作した参照設定の方法です。

ツール の 参照設定から、
下記の2つにチェック(レ)を入れてください。

□ Microsoft HTML Object Library

□ Microsoft Internet Controls
(※見つからない場合は、Microsoft Browser Helpersにチェックを入れてください。)

チェックを入れると、
Dim IE As InternetExplorer

Dim oBODY As HTMLBody
などが使えるようになります。

IE Web Browser 操作 参照設定をしましょうね。

ツールの参照設定からやってもいいし、WebBrowser を Excel UserFormに貼って使う、そんな方法もあります。
↓Dim ie As InternetExplorer を 使いたい時

(大きな動画で見る↑)
↓UserFormに Web(IE) を貼って操作する場合

(大きな動画で見る↑)
最近の記事:[No.180 IE操作 .parentElement で親のタグを参照?]
関連項目:
[WebBrowser を Excel UserFormに貼り使用したサンプル]
※はじめの一歩として、参照設定してくださいね。(コードはキレイに読みやすく?)

IE操作に興味を持ったら、[VBAからIEを自動操作 CreateObject(" InternetExplorer.application" )]・・・VBAでIEを操作するサンプルを見てください。


質問や要望、クレームを送る(三流君に連絡する 連絡方法)

質問や要望など連絡方法でお互い確認が取りやすく、便利なのが掲示板なのですが、私の対応のまずさから不定期で荒れてしまい、掲示板は現在封鎖中です。(反省しなきゃ)
感想や質問・要望・苦情など 三流君へメッセージを送る。
時間的余裕のある要望・質問・苦情の場合は、下記のフォームからメッセージを送ることができます。
あなたのお名前(ニックネーム):さん
返信は?: 不用(HP更新を待つ) , E-mail→ アドレス:に返事をもらいたい

(感想や質問・要望・苦情はHPで記事に載せることがあります。)

急ぎで連絡がほしい、そんな時は:[三流君連絡先]に連絡してください。


分類別に記事を紹介

分類別といっても、あまり分類別にまとまっていないのですが、、、↓

よく使う操作方法

F1でヘルプを見たり、デバック時にDebug.Print使ったり、イミディエイト ウインドウで簡単な確認したり。
なれると当たり前に操作している方法が↓かなぁ。
[プロパティ、メソッドを探る方法]・・・基本のF1を押してヘルプを見る方法など
[実行時エラー、あわてないでデバックを押す]・・・デバッグの流れを簡単に(ハマった時はツライけど)
[イミディエイト ウインドウ と Debug.Print]・・・プログラム作成時に便利なイミディエイト ウインドウ
[VBA ウォッチ式とSTOP]・・・STOPで止め、ウォッチ式でオブジェクトの中身を確認する方法など
[参照設定のお話]・・・設定すると便利な(設定しないと使えない)、参照設定のお話
[サンプル 実行方法]・・・Alt+F11 や ツール--マクロ から VBAの編集画面を開き F5で実行?

仕様書のお話(XXX設計書)

イロイロな仕様書・設計書を各工程で使っていくのですが、その一部を書きました。
[基本設計書/仕様書のお話]・・・仕様書・設計書を書いてますか?簡単な流れを書きました。
[テスト仕様書のお話]・・・テストデータ XXXXを入力したら、YYYYになる ほか
[バグの連絡票とテストケース]・・・バグ・不具合の連絡を受けたら 原因を書き 処置する。
[関数仕様書のお話]・・・仕様書は頭の中にありますでいいの?かよ?
[作業の流れ 入力・処理・出力ほか]・・・フォルダー選択を例に仕様書と流れを解説

プログラムのお話

[作成時 Ctrl+C Ctrl+Vの前によく考えよう]・・・コピープログラムの落とし穴?
[関数に汎用性を持たせる、共通に使える関数作り]・・・共通に使える関数(財産)を作りましょう

Access関係:アクセス側からのアプローチ

[AccessのUserForm/サブフォームを操作]・・・アクセスでフォームを使ったサンプルです
[Accessのレポートを操作]・・・レポートを操作してみました
[Access クエリー関係やその他関数]・・・あまりまとまってませんが、スポット的な単体関数の解説です

Excel関係:エクセル側からのアプローチ

[Excel UserForm(ユーザーフォーム)を操作する]・・・エクセルでユーザーフォームを作成して入力などを行ってます
[ExcelからAccessを操作する]・・・ExcelからAccessのマクロを起動してみました、
[Excel関係 関数、その他]・・・その他Excel関係です

その他:VBAの共通関数やテキストファイルの操作など

[VBAでテキストファイル(*.txt,*.html,*.csv)の操作]・・・テキストファイルを使ったサンプルです
[VBA 標準関数関係とその他解説]・・・その他、グダグタ解説してます

blog:あまり更新していない作業日記 → [三流君の作業日記] と [通販商品の足跡] も よろしくお願いします。



[三流君(Ken3.org)] / [VBAで楽しく] / [VBA バックナンバー]