Access VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


481 / 2272 ツリー ←次へ | 前へ→

【11487】「ファイルを開く」ダイアログのモーダル設定について yoco 10/2/26(金) 12:36 質問[未読]
【11492】Re:「ファイルを開く」ダイアログのモーダ... 小僧 10/2/26(金) 16:03 発言[未読]
【11501】Re:「ファイルを開く」ダイアログのモーダ... yoco 10/3/1(月) 11:21 発言[未読]
【11503】Re:「ファイルを開く」ダイアログのモーダ... YU-TANG 10/3/1(月) 13:11 発言[未読]
【11505】Re:「ファイルを開く」ダイアログのモーダ... yoco 10/3/1(月) 13:26 回答[未読]
【11507】Re:「ファイルを開く」ダイアログのモーダ... YU-TANG 10/3/1(月) 13:43 回答[未読]
【11508】Re:「ファイルを開く」ダイアログのモーダ... yoco 10/3/1(月) 13:50 お礼[未読]
【11504】Re:「ファイルを開く」ダイアログのモーダ... 小僧 10/3/1(月) 13:14 回答[未読]
【11506】Re:「ファイルを開く」ダイアログのモーダ... yoco 10/3/1(月) 13:33 お礼[未読]

【11487】「ファイルを開く」ダイアログのモーダル...
質問  yoco E-MAIL  - 10/2/26(金) 12:36 -

引用なし
パスワード
   お世話になります。

Access初心者です。。。
Access2000(WindowsXP)にて開発しております。

標記の通り、「ファイルを開く」ダイアログをモーダルにて
表示させたいのですが、どのように設定すればいいのか分かりません。

現在、【参照】ボタンを押下すると「ファイルを開く」ダイアログを
表示するようにしているのですが、ダイアログを表示中に再度【参照】ボタンを
押下すると二重に「ファイルを開く」ダイアログが表示されてしまいます。

これを制御したいのです。ご教授お願いします。

【11492】Re:「ファイルを開く」ダイアログのモー...
発言  小僧  - 10/2/26(金) 16:03 -

引用なし
パスワード
   ▼yoco さん:
こんにちは。

> 現在、【参照】ボタンを押下すると「ファイルを開く」ダイアログを
> 表示するようにしている

どの様なコードを書かれているのかにもよりますが、

>Access2000

の場合は Windows API を使う方法が良さそうですね。
(Access2000の動作環境がないのでテストできておりませんが
 Access2003、2007ではモーダルでダイアログが起動します)

また、非公開のオブジェクトなので保障はできませんが
WizHookオブジェクトでも操作はできそうです。

YU-TANG's MS-Access Discovery
[ファイルを開く] ダイアログを表示する方法
h tp://www.f3.dion.ne.jp/~element/msaccess/AcTipsGetFileName.html

ご参考になれば幸いです。

【11501】Re:「ファイルを開く」ダイアログのモー...
発言  yoco E-MAIL  - 10/3/1(月) 11:21 -

引用なし
パスワード
   ▼小僧 さん:

こんにちは。
ご返信ありがとうございます★

>どの様なコードを書かれているのかにもよりますが、

Declare Function GetOpenFileName Lib "comdlg32.dll" Alias _
  "GetOpenFileNameA" (pOpenFileName As OPENFILENAME) As Boolean

Type OPENFILENAME
    lStructSize As Long
    hwndOwner As Long
    hInstance As Long
    lpstrFilter As String
    lpstrCustomFilter As String
    nMaxCustFilter As Long
    nFilterIndex As Long
    lpstrFile As String
    nMaxFile As Long
    lpstrFileTitle As String
    nMaxFileTitle As Long
    lpstrInitialDir As String
    lpstrTitle As String
    Flags As Long
    nFileOffset As Integer
    nFileExtension As Integer
    lpstrDefExt As String
    lCustData As Long
    lpfnHook As Long
    lpTemplateName As String
End Type

↑GetOpenFileNameを呼び出してダイアログを表示させています。


>また、非公開のオブジェクトなので保障はできませんが
>WizHookオブジェクトでも操作はできそうです。

Access初心者なので、動作の保障がないものを使用するのは
ちょっと気が引けています。。。

上記コード内の「OPENFILENAME」にて設定ができないものか
調べてみましたが、分かりませんでした…。

もう少し調べてみます。
ありがとうございました(*・ω・)*_ _)ペコリ

【11503】Re:「ファイルを開く」ダイアログのモー...
発言  YU-TANG  - 10/3/1(月) 13:11 -

引用なし
パスワード
   こんにちは、YU-TANG です。

> Access初心者なので、動作の保障がないものを使用するのは
> ちょっと気が引けています。。。

API を意味が分からないままコピペで使うほうがよほど危険な気が
しますが…。
WizHook は Access の内部クラスですから、Office のバージョン
アップに伴って MS がメンテナンスしています。ですから
WizHook.GetFileName は Unicode に対応していますし、今後の
新しい OS 上でも (Office がそれをサポートするのであれば)
問題なく動作するようメンテされることが期待できます。
一方で、yoko さんがお使いの API は ANSI 版の方ですよね。
cp932 にマッピングされない Unicode 文字がファイル名に混入した
場合の対応は、yoko さんが行わなければ他の誰も行ってくれません。
これも一種のリスクに値するのではないかと思いますが、いかが
でしょうか。

> 上記コード内の「OPENFILENAME」にて設定ができないものか
> 調べてみましたが、分かりませんでした…。

どこで何を調べましたか?
MSDN で MS の公式な解説は確認済みでしょうか?

GetOpenFileName 関数
ht tp://msdn.microsoft.com/ja-jp/library/cc364716.aspx

OPENFILENAME Structure ()
ht tp://msdn.microsoft.com/en-us/library/ms646839(VS.85).aspx

非公式の解説は山のようにあります。そちらも確認済みですか?
一例。

OPENFILENAME構造体
ht tp://hp.vector.co.jp/authors/VA023539/tips/dialog/004.htm

上記はすべて「msdn GetOpenFileName」で Google 検索すると、
最初の 1 ページ目に出てくるものです (というか、1 位と 2 位を
拾っただけ)。

で、それを読むと「hwndOwner」の指定がちゃんとされているのかが
最初の確認ポイントになることが分かると思うのですが、指定は
どうなっていますか。

それから、宣言だけ書かれても、実行コードの提示が無いとほとんど
意味がありません。「文字列変換がうまくいかないのですが、何が
いけないのでしょうか」という質問で「Dim s As String」しか書いて
いないのと一緒です。問題点を指摘しようがないので、できれば
実行コードも提示してください。

# 老婆心ながら、メールアドレスは非表示に修正した方がいいです。
# スパムが殺到しますよ。

それでは。

【11504】Re:「ファイルを開く」ダイアログのモー...
回答  小僧  - 10/3/1(月) 13:14 -

引用なし
パスワード
   ▼yoco さん:
こんにちは。

>Declare Function GetOpenFileName Lib "comdlg32.dll" Alias _
>  "GetOpenFileNameA" (pOpenFileName As OPENFILENAME) As Boolean

Windows API を使われてる様ですので、
OPENFILENAME構造体 を定義している箇所で設定できそうです。

オブジェクト名.hWndOwner = Application.hWndAccessApp

の様に、アプリケーションのウィンドウハンドルを渡してみて下さい。

【11505】Re:「ファイルを開く」ダイアログのモー...
回答  yoco  - 10/3/1(月) 13:26 -

引用なし
パスワード
   ▼YU-TANG さん:

こんにちは。
ご指摘ありがとうございます。

>API を意味が分からないままコピペで使うほうがよほど危険な気が
>しますが…。
>WizHook は Access の内部クラスですから、Office のバージョン
>アップに伴って MS がメンテナンスしています。ですから
>WizHook.GetFileName は Unicode に対応していますし、今後の
>新しい OS 上でも (Office がそれをサポートするのであれば)
>問題なく動作するようメンテされることが期待できます。
>一方で、yoko さんがお使いの API は ANSI 版の方ですよね。
>cp932 にマッピングされない Unicode 文字がファイル名に混入した
>場合の対応は、yoko さんが行わなければ他の誰も行ってくれません。
>これも一種のリスクに値するのではないかと思いますが、いかが
>でしょうか。

確かにそうです。。。
上司が作成した関数をただ使用していただけなので
内部については理解しようとしていませんでした…。


>どこで何を調べましたか?
>MSDN で MS の公式な解説は確認済みでしょうか?
>
>GetOpenFileName 関数
>ht tp://msdn.microsoft.com/ja-jp/library/cc364716.aspx
>
>OPENFILENAME Structure ()
>ht tp://msdn.microsoft.com/en-us/library/ms646839(VS.85).aspx
>
>非公式の解説は山のようにあります。そちらも確認済みですか?
>一例。
>
>OPENFILENAME構造体
>ht tp://hp.vector.co.jp/authors/VA023539/tips/dialog/004.htm
>
>上記はすべて「msdn GetOpenFileName」で Google 検索すると、
>最初の 1 ページ目に出てくるものです (というか、1 位と 2 位を
>拾っただけ)。

私は「VBA GetOpenFileName モーダル」で Yahoo 検索していました…。
なかなかヒットするものがなく質問に至りました。

>で、それを読むと「hwndOwner」の指定がちゃんとされているのかが
>最初の確認ポイントになることが分かると思うのですが、指定は
>どうなっていますか。
>
>それから、宣言だけ書かれても、実行コードの提示が無いとほとんど
>意味がありません。「文字列変換がうまくいかないのですが、何が
>いけないのでしょうか」という質問で「Dim s As String」しか書いて
>いないのと一緒です。問題点を指摘しようがないので、できれば
>実行コードも提示してください。
>

With LTag
  .lpstrTitle = "タイトル"
  .lStructSize = Len(LTag)
  .hwndOwner = Application.hWndAccessApp
  .lpstrFile = String$(5120, Chr$(0))
  .nMaxFile = 5120
  .lpstrFilter = "圧縮(zip形式)ファイル (*.zip)" & vbNullChar & "*.zip"
  .nFilterIndex = 1
  .Flags = &H4
End With

If GetOpenFileName(LTag) Then
    ' ---* 正常時の処理
Else
  ' ---* キャンセル時の処理
End If

すみません。説明不足でした。
↑実行コードは上記の通りです。


># 老婆心ながら、メールアドレスは非表示に修正した方がいいです。
># スパムが殺到しますよ。

気づきませんでした!
ありがとうございます。

提示していただいたURLを参考に自力でがんばってみます!
ありがとうございました(*・ω・)*_ _)ペコリ

【11506】Re:「ファイルを開く」ダイアログのモー...
お礼  yoco  - 10/3/1(月) 13:33 -

引用なし
パスワード
   ▼小僧 さん:
こんにちわ!
ご回答ありがとうございます。

>オブジェクト名.hWndOwner = Application.hWndAccessApp
>
>の様に、アプリケーションのウィンドウハンドルを渡してみて下さい。

ご丁寧にありがとうございます(*・ω・)*_ _)ペコリ

YU-TANGさんにご指摘いただいたように、実行コードを提示しておりませんで
ご迷惑おかけしています。

OPENFILENAME構造体の定義内容は↓の通りです。

Dim LTag As OPENFILENAME

With LTag
  .lpstrTitle = "タイトル"
  .lStructSize = Len(LTag)
  .hwndOwner = Application.hWndAccessApp
  .lpstrFile = String$(5120, Chr$(0))
  .nMaxFile = 5120
  .lpstrFilter = "圧縮(zip形式)ファイル (*.zip)" & vbNullChar & "*.zip"
  .nFilterIndex = 1
  .Flags = &H4
End With

hWndOwner = Application.hWndAccessApp と設定しているのですが
うまくいきませんでした。

YU-TANGさんに提示していただいたURLを参考に、自分なりに
もう少し調べてみます。

ありがとうございました★

【11507】Re:「ファイルを開く」ダイアログのモー...
回答  YU-TANG  - 10/3/1(月) 13:43 -

引用なし
パスワード
   yoco さん、こんにちは。

>  .hwndOwner = Application.hWndAccessApp

これをどこに書いています?
もしかして、ダイアログモードで開いているフォームのクラスモジュール
でしょうか。
もしそうなら、下記のように修正してみてください。

  .hwndOwner = Me.Hwnd

それでは。

# 横取ってすまん>小僧さん

【11508】Re:「ファイルを開く」ダイアログのモー...
お礼  yoco  - 10/3/1(月) 13:50 -

引用なし
パスワード
   ▼YU-TANG さん:
こんにちわ。
度々のご回答、ありがとうございます。

>  .hwndOwner = Application.hWndAccessApp
>
>これをどこに書いています?
>もしかして、ダイアログモードで開いているフォームのクラスモジュール
>でしょうか。
>もしそうなら、下記のように修正してみてください。
>
>  .hwndOwner = Me.Hwnd

ありがとうございます(*・ω・)*_ _)ペコリ

ご指摘通り、ダイアログモードで開いているフォームの
クラスモジュールに書いておりましたので、早速試してみました!

実現できました!!!

本当にありがとうございました☆

YU-TANGさん、小僧さん。
説明不足でご迷惑をおかけしましたが、懲りずにお付き合いいただき
ありがとうございました。

おかげさまで助かりました(*・ω・)*_ _)ペコリ

481 / 2272 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
1078193
(SS)C-BOARD v3.8 is Free