参照設定のお話 オブジェクトの作成 フォルダーの選択を解説
[VBA系メニューへ]
[質問掲示板]
[バックナンバー目次]
こんにちは、三流プログラマーKen3です。
今回は、
参照設定のお話を少し、
軽く書きたいと思います。
普通に使用しているとあまり関係無いので、
へぇ〜、そうなんだぁ程度に、気楽に読んでください。
昔、愚痴系で書いてた(はじめは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 ←画像付き
と
参照設定のエラー、
<Access97 標準関数Midなどが使えない>
http://www.ken3.org/backno/hosoku/e032/index.html
もヨロシクです。
/*
* 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でした。
質問・感想を送る
三流君のHP主な飛び先
VBA系のメルマガで書いた解説を項目ごとにまとめてます
[VBAでAccessを操作(一般)]
[VBAでAccessのレポートを操作]
[VBAでAccessのUserForm/サブフォームを操作]
[VBA Access から Excel 連携]
[VBA でExcel オブジェクト/プロパティ/メソッド/一般]
[VBA でExcel UserForm(ユーザーフォーム)を操作する]
[VBA ExcelからAccessを操作する]
[VBA Outlookの操作]
[VBA IEの操作]
[VBA テキストファイル(*.txt,*.html,*.csv)の操作]
[VBA標準関数関係とその他解説]
ASP系の解説を項目ごとにまとめてみました
[ASP Form等を使用したデータのやり取り]
[ASP その他処理サンプル]
[ASP テキストファイル処理]
[ASP VBScript関数関係の説明]
[ASP ADOでMdbファイルを使う]
[ASP ADOでExcelと接続してみた]
分類別
[アクセスランキング]
[サイトマップ]
[リンク先・相互リンク先など]
Ken3の日記(weblog) --
[広告・副収入系]
[プログラマー業務の愚痴]
[VBA系の話題]
[ASP系の話題]
[コンビニ系ネタ]
[その他]
その他、宣伝ページです
・[
アンケート/ポイント]などで月500円を必死に稼いでます(笑)
・[
SOHO/在宅プログラマー/派遣]の話題、Webエントリー後の反応など
・[
ネットで小金を稼げるか?]実験中だが成果は無し
※あとは、[パソコン関係の書籍]や[ゲームソフト]、
[パソコンパーツ]
をバナーから売ろうとするけど、
なかなかうまくはいかないよね(笑)