Excel VBA質問箱 IV

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

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


4172 / 13644 ツリー ←次へ | 前へ→

【58000】ダイアログBOXの表示位置 パトラッシュ 08/9/26(金) 22:55 質問[未読]
【58002】Re:ダイアログBOXの表示位置 neptune 08/9/26(金) 23:28 回答[未読]
【58008】Re:ダイアログBOXの表示位置 パトラッシュ 08/9/27(土) 10:35 質問[未読]
【58011】Re:ダイアログBOXの表示位置 neptune 08/9/27(土) 14:27 回答[未読]
【58012】Re:ダイアログBOXの表示 パトラッシュ 08/9/27(土) 16:56 質問[未読]
【58014】Re:ダイアログBOXの表示 neptune 08/9/27(土) 17:15 回答[未読]
【58016】Re:ダイアログBOXの表示 neptune 08/9/27(土) 20:06 回答[未読]
【58030】Re:ダイアログBOXの表示 パトラッシュ 08/9/28(日) 11:11 お礼[未読]
【58032】Re:ダイアログBOXの表示 熊谷隆史 08/9/28(日) 11:23 発言[未読]
【58033】Re:ダイアログBOXの表示 neptune 08/9/28(日) 14:55 発言[未読]
【58040】Re:ダイアログBOXの表示 Yuki 08/9/29(月) 7:17 発言[未読]
【58044】Re:ダイアログBOXの表示 neptune 08/9/29(月) 12:01 質問[未読]
【58046】Re:ダイアログBOXの表示 Yuki 08/9/29(月) 13:47 発言[未読]
【58047】Re:ダイアログBOXの表示 neptune 08/9/29(月) 15:11 お礼[未読]
【58054】ダイアログBOXのファイル名リスト パトラッシュ 08/9/30(火) 2:00 質問[未読]
【58057】Re:ダイアログBOXのファイル名リスト 熊谷隆史 08/9/30(火) 10:59 発言[未読]
【58058】Re:ダイアログBOXのファイル名リスト neptune 08/9/30(火) 11:25 発言[未読]
【58061】Re:ダイアログBOXのファイル名リスト 熊谷隆史 08/9/30(火) 18:10 発言[未読]
【58065】Re:ダイアログBOXのファイル名リスト neptune 08/9/30(火) 22:08 発言[未読]
【58070】Re:ダイアログBOXのファイル名リスト 熊谷隆史 08/10/1(水) 11:10 発言[未読]

【58000】ダイアログBOXの表示位置
質問  パトラッシュ  - 08/9/26(金) 22:55 -

引用なし
パスワード
   ht tp://www.vbalab.net/vbaqa/c-board.cgi?cmd=one;no=99;id=FAQ
↑上記のサイトを参考にさせていただいている者ですが,
記載のままマクロを実行させると「ファイルを開く」ダイアログBOXがディスプレイの左上に表示されてしまいます。
これを,中央に表示させる方法はありますでしょうか?

また,ダイアログの形態も
Application.GetOpenFilename
で得られるものと若干異なっておりますが,これらのカスタマイズも可能なものなのでしょうか?(例えば,ダイアログBOX下部の「読み取り専用で開く」のチェックBOXのあり,なしなど。)

すみません。マクロ初心者でわからないことも多々あるのですが教えていただけますでしょうか?
よろしくお願いいたします。

【58002】Re:ダイアログBOXの表示位置
回答  neptune  - 08/9/26(金) 23:28 -

引用なし
パスワード
   ▼パトラッシュ さん:
こんにちは
>これらのカスタマイズも可能なものなのでしょうか?
>(例えば,ダイアログBOX下部の「読み取り専用で開く」のチェックBOXのあり,なしなど。)

お分かりかと思いますが、例えば上記の↑は表示されるだけでその機能の実装
は自分でやらなければなりません。

ht tp://www.red.oit-net.jp/tatsuya/vb/FileDialog.htm
に定数の日本語解説がありますのでこれを組み合わせてください。

>ht tp://www.vbalab.net/vbaqa/c-board.cgi?cmd=one;no=99;id=FAQ
>↑上記のサイトを参考にさせていただいている者ですが,
>記載のままマクロを実行させると「ファイルを開く」ダイアログBOXがディスプレイの左上に表示されてしまいます。
>これを,中央に表示させる方法はありますでしょうか?
あるにはありますが、メッセージフックという手法が必要なため、
これは実行ファイル化できないVBAでは実用になりません。

最悪Excelか、OSがお亡くなりになる可能性がないとはいえませんので。
・・・といってサンプルがWeb上で見たような気もしますので、危険は承知で、
どうしてもというなら探してみて下さい。(お勧めはしません)

【58008】Re:ダイアログBOXの表示位置
質問  パトラッシュ  - 08/9/27(土) 10:35 -

引用なし
パスワード
   ▼neptune さん:
>ht tp://www.red.oit-net.jp/tatsuya/vb/FileDialog.htm
>に定数の日本語解説がありますのでこれを組み合わせてください。

ありがとうございます。
VBAの知識不足ですみません、1点教えてください。
Public Const OFN_HIDEREADONLY = &H4 '読み取り専用のチェックボックスを非表示
はどこにどのように組み込んだらいいのでしょうか?

【58011】Re:ダイアログBOXの表示位置
回答  neptune  - 08/9/27(土) 14:27 -

引用なし
パスワード
   ▼パトラッシュ さん:
こんにちは

OPENFILENAME構造体のFlags 引数に加えます。
Flags を設定してない場合
Flags = OFN_HIDEREADONLY
している場合
Flags =既に設定している定数 or OFN_HIDEREADONLY

ht tp://hp.vector.co.jp/authors/VA023539/tips/dialog/004.htm
に構造体の説明がされていますので目を通しておいてください。
・・・日本語で書かれているところがあったんですね。。。

本家はここ
getopenfilename
ht tp://msdn.microsoft.com/ja-jp/library/cc364716.aspx
ここにOFNHookProc に付いてかかれてますが、位置を任意のところに持って
いくにはこれを使用します。

OPENFILENAME
ht tp://msdn.microsoft.com/ja-jp/library/ms646839(en-us).aspx

【58012】Re:ダイアログBOXの表示
質問  パトラッシュ  - 08/9/27(土) 16:56 -

引用なし
パスワード
   ▼neptune さん:ご回答ありがとうございます。
>OPENFILENAME構造体のFlags 引数に加えます。
>Flags を設定してない場合
>Flags = OFN_HIDEREADONLY
>している場合
>Flags =既に設定している定数 or OFN_HIDEREADONLY

例えば、以下のようなことですよね?
すみません、難しくてよくわからなくなっているのですが,以下では読み取り専用チェックボックスは非表示にはなりませんでした。
・・・・・・
・・・・・・
'
Private Function GetFile(ByVal Filt As String, FiltName As String, MsgTitle As String) As String
  Dim retc As Long
  Dim filn As OPENFILENAME
  Dim Tmpfile As String
  Dim TmpFileTitle As String
  Dim fileToOpen As String
  Dim STIME As Integer
  '
  Tmpfile = String(256, 0)
  TmpFileTitle = String(256, 0)
  '設定いろいろ
  With filn
   .Flags = OFN_HIDEREADONLY     ←←←
  End With
  '

【58014】Re:ダイアログBOXの表示
回答  neptune  - 08/9/27(土) 17:15 -

引用なし
パスワード
   ▼パトラッシュ さん:
りんさんのサンプルソースですよね?

>以下では読み取り専用チェックボックスは非表示にはなりませんでした。
ん?どの様になりました?

OFN_HIDEREADONLY の定数宣言してます?

今どの様に書いているんでしょう?りんさんのサンプルソースに
.Flags = OFN_HIDEREADONLY     ←←←
を追加しただけですか?

#風邪気味不調なんで返事遅れるかもしれません。。。

【58016】Re:ダイアログBOXの表示
回答  neptune  - 08/9/27(土) 20:06 -

引用なし
パスワード
   ▼パトラッシュ さん:
検証しました

.flags = OFN_HIDEREADONLY
で間違いありません。

【58030】Re:ダイアログBOXの表示
お礼  パトラッシュ  - 08/9/28(日) 11:11 -

引用なし
パスワード
   ▼neptune さん:ご回答ありがとうございます。
別のPCで試してみたところうまくいきました。
何か別の問題だったのかもしれません。
いろいろとお手数をおかけし申し訳ありませんでした。
ご丁寧にご対応いただき、ありがとうございました。

【58032】Re:ダイアログBOXの表示
発言  熊谷隆史  - 08/9/28(日) 11:23 -

引用なし
パスワード
   ▼パトラッシュ さん:
# 解決された様なので余談として。

> (お勧めはしません)
neptuneさんもこう書かれてるので
私もお勧めはしませんが。

.flags に OFN_ENABLEHOOKフラグ(OFN_EXPLORERも)を立てて、
.lpfnHook に OFNHookProc(フックプロシージャ)の
ポインタ(VBAなのでアドレスとでも言うべきか)を
渡してやります。

フックプロシージャにて、
通知されてくるhDlgの親(GetParentで)のウィンドウハンドルを
SetWindowPosやMoveWindowに指定して、移動させますが
タイミング的にWM_INITDIALOGでは早すぎるので
何かひと工夫が必要でしょうね。
(昔、他サイト(Moug)で見かけましたが)
http://msdn.microsoft.com/en-us/library/ms646931(VS.85).aspx

# AccessならTimerイベントで安定して移動出来るのですが。

【58033】Re:ダイアログBOXの表示
発言  neptune  - 08/9/28(日) 14:55 -

引用なし
パスワード
   ▼熊谷隆史 さん:
こんにちは

>タイミング的にWM_INITDIALOGでは早すぎるので
>何かひと工夫が必要でしょうね。
「OFNHookProc」
ht p://msdn.microsoft.com/ja-jp/library/cc410977.aspx
に書かれていますが、
WM_INITDIALOGでイニシャライズが終わったら、
「フックプロシージャに CDN_INITDONE 通知メッセージが送信されます。」
のでそのタイミングでWindowの位置を調整してやればよいのでは?
WM_NOTIFYの中に含まれて送られてきたような
・・・記憶があるようなないような。ですが。

【58040】Re:ダイアログBOXの表示
発言  Yuki  - 08/9/29(月) 7:17 -

引用なし
パスワード
   ▼熊谷隆史 さん:
>
>フックプロシージャにて、
>通知されてくるhDlgの親(GetParentで)のウィンドウハンドルを
>SetWindowPosやMoveWindowに指定して、移動させますが
>タイミング的にWM_INITDIALOGでは早すぎるので

WM_NOTIFYでよろしいですよ。
こんな感じで

' コモンダイアログのフックプロシージャ
Private Function OFNHookProc(ByVal hdlg As Long, _
               ByVal uMsg As Long, _
               ByVal wParam As Long, _
               ByVal lParam As Long) As Long
  Static DefaultView As Long
  Dim pProc    As Long
  Dim h      As Long
  Dim OFN     As OFNOTIFY ' OFNOTIFY構造体
  Dim RC     As RECT   ' RECT構造体
  Dim lngTop   As Long   ' ダイアログ上位置
  Dim lngLeft   As Long   ' ダイアログ左位置
  Dim lngWidth  As Long   ' ダイアログ幅
  Dim lngHeight  As Long   ' ダイアログ高さ
  Dim lngDTWidth As Long   ' デスクトップ幅
  Dim lngDTHeight As Long   ' デスクトップ高さ

  Select Case uMsg
    Case WM_INITDIALOG
      OFNHookProc = True
    Case WM_NOTIFY
      If lParam = 0 Then Exit Function
      CopyMemory OFN, ByVal lParam, Len(OFN)
      With OFN
        Select Case .hdr.code
          Case CDN_INITDONE
            ' ここで、ダイアログの初期表示位置を設定しています。
            Call GetWindowRect(GetParent(hdlg), RC)
            lngWidth = RC.Right - RC.Left
            lngHeight = RC.Bottom - RC.Top
            Call GetWindowRect(GetDesktopWindow, RC)
            lngDTWidth = RC.Right - RC.Left
            lngDTHeight = RC.Bottom - RC.Top
            Select Case m_Posi
              Case 0 ' 画面中央
                lngTop = (lngDTHeight - lngHeight) \ 2
                lngLeft = (lngDTWidth - lngWidth) \ 2
              Case 1 ' 左上
                lngTop = 0: lngLeft = 0
              Case 2 ' 左下
                lngTop = lngDTHeight - lngHeight
                lngLeft = 0
              Case 3 ' 右上
                lngTop = 0
                lngLeft = lngDTWidth - lngWidth
              Case 4 ' 右下
                lngTop = lngDTHeight - lngHeight
                lngLeft = lngDTWidth - lngWidth
            End Select
            Call SetWindowPos(GetParent(hdlg), 0, lngLeft, lngTop, 0, 0, SWP_NOSIZE Or SWP_NOZORDER)
          Case CDN_FOLDERCHANGE
        End Select
      End With
  End Select
End Function

【58044】Re:ダイアログBOXの表示
質問  neptune  - 08/9/29(月) 12:01 -

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

OFNHookProcの戻り値が
OFNHookProc = True
しかないみたいですが、良いんですかね?

それはそうと
   Case WM_INITDIALOG
でTrueを返すのはなんでですか?

【58046】Re:ダイアログBOXの表示
発言  Yuki  - 08/9/29(月) 13:47 -

引用なし
パスワード
   ▼neptune さん:
>▼Yuki さん:
>こんにちは
>
>OFNHookProcの戻り値が
>OFNHookProc = True
>しかないみたいですが、良いんですかね?

Case Else
  OFNHookProc = False
が抜けていますね。

>
>それはそうと
>   Case WM_INITDIALOG
>でTrueを返すのはなんでですか?
テストで使っての消し忘れですね。
チャント確認をしてからUPしないと駄目ですね。
ご指摘有難う御座いました。

【58047】Re:ダイアログBOXの表示
お礼  neptune  - 08/9/29(月) 15:11 -

引用なし
パスワード
   ▼Yuki さん:
ご回答ありがとうございます。
すっきりしました。

【58054】ダイアログBOXのファイル名リスト
質問  パトラッシュ  - 08/9/30(火) 2:00 -

引用なし
パスワード
   もう1点質問させてください。
ここで表示したダイアログBOXの「ファイル名(N)」のリストボックスに最近(過去)に開いたファイル名がフルパスで表示されるのですが

これを
1.フルパスではなく,ファイル名のみを表示
2.リストBOXには過去に開いたファイルは何も表示させない

ことは,可能でしょうか?

【58057】Re:ダイアログBOXのファイル名リスト
発言  熊谷隆史  - 08/9/30(火) 10:59 -

引用なし
パスワード
   neptuneさん、Yukiさん、こんにちは。
> 「フックプロシージャに
> CDN_INITDONE 通知メッセージが送信されます。」
> のでそのタイミングでWindowの位置を調整してやればよいのでは?

何だか私が質問者みたくなってますが、
OFN_EXPLORERが立ってるときの専用のメッセージなのですね。
http://msdn.microsoft.com/en-us/library/ms646863(VS.85).aspx
Yukiさん、実際のコードを載せて頂き、ありがとうございます。


MSDNにありますようにVista(私の環境)では、
IFileDialogが推奨されています。
なので、その影響からか
OFN_EXPLORERの有無に関わらず同じスタイルのものに
なります(左側にプレースバー有り)。

ですが、OFN_ENABLEHOOKを立てると
OFN_EXPLORER有りでプレースバー無しのスタイルに
なり、CDN_INITDONE自体は来ますが、ただ、
このタイプのスタイルならWM_INITDIALOGで、十分間に会います。
OFN_EXPLORER無しでは、更に古いスタイルのものに
なります(適当な説明で失礼)。

頂いた情報は、
いずれ導入したいXP SP3の時のために、覚えておきたいと思います。

> # AccessならTimerイベントで安定して移動出来るのですが。
↑で書いてるこれもExcel VBAでもAPIに依らない
コールバック的な動作をするものなら、可能だと思います。


  ▼パトラッシュ さん:
こんにちは。
> もう1点質問させてください。
> ここで表示したダイアログBOXの「ファイル名(N)」のリストボックスに最近(過去)に開いたファイル名がフルパスで表示されるのですが
>
> これを
> 1.フルパスではなく,ファイル名のみを表示
> 2.リストBOXには過去に開いたファイルは何も表示させない
>
> ことは,可能でしょうか?

可能です。それから、リストボックスではなくて、コンボボックスです。
ただ、これこそフックしないと無理ですね。
# かなり前の事なので忘れました。

【58058】Re:ダイアログBOXのファイル名リスト
発言  neptune  - 08/9/30(火) 11:25 -

引用なし
パスワード
   ▼熊谷隆史 さん:
みなさん、こんにちは。

>MSDNにありますようにVista(私の環境)では、
>IFileDialogが推奨されています。
>なので、その影響からか
>OFN_EXPLORERの有無に関わらず同じスタイルのものに
>なります(左側にプレースバー有り)。
>
>ですが、OFN_ENABLEHOOKを立てると
>OFN_EXPLORER有りでプレースバー無しのスタイルに
>なり、CDN_INITDONE自体は来ますが、ただ、
>このタイプのスタイルならWM_INITDIALOGで、十分間に会います。
>OFN_EXPLORER無しでは、更に古いスタイルのものに
>なります(適当な説明で失礼)。
↑vistaではこうなっているんですね。覚えておきます。

>  ▼パトラッシュ さん:
省略
>> ことは,可能でしょうか?
熊谷さんから既に回答があるので省略。

【58061】Re:ダイアログBOXのファイル名リスト
発言  熊谷隆史  - 08/9/30(火) 18:10 -

引用なし
パスワード
   neptuneさんへのお礼が抜けていました(失礼しました)。
> 省略
> >> ことは,可能でしょうか?
> 熊谷さんから既に回答があるので省略。

回答になっていないのでアレなんですが、
私が以前行ったのはコンボボックスに対して
CB_ADDSTRINGを送信して、項目を設定したので
ただ、どの通知コードの時に処理したかは、思い出せません。
サブクラス化してた気もします。
# こちらも他サイト(Moug)でかなり前に教わったのですが。

↑の誤字訂正。
> 十分間に会います。
十分間に合います。

【58065】Re:ダイアログBOXのファイル名リスト
発言  neptune  - 08/9/30(火) 22:08 -

引用なし
パスワード
   ▼ パトラッシュさん、熊谷隆史 さん:
こんにちは


初期化が終わった段階で(CDN_INITDONE)ComboBoxにCB_RESETCONTENを
送ってやれば恐らくいけるとは思いますが、CommonDialogでやった事はないので
確実な事はやってみないとわかりません。

参考・・・全部英語ですが^ ^;; この手のは日本語がないんですよね。
「Open and Save As Dialog Boxes」これに多分全てのmessageが書いていると思います。
ht tp://msdn.microsoft.com/ja-jp/library/ms646960(en-us,VS.85).aspx

「Combo Box Features」
ht tp://msdn.microsoft.com/ja-jp/library/bb775793(en-us,VS.85).aspx

「CB_RESETCONTENT Message」
Removes all items from the list box and edit control of a combo box.
ht tp://msdn.microsoft.com/ja-jp/library/bb775878(en-us,VS.85).aspx

パトラッシュさんへ
お勧めしているわけではありませんので念の為。
理解しないままHookすると碌な事無いです。

【58070】Re:ダイアログBOXのファイル名リスト
発言  熊谷隆史  - 08/10/1(水) 11:10 -

引用なし
パスワード
   こんにちは。
> 「Open and Save As Dialog Boxes」
> 「Combo Box Features」

このようなページがあったのですね(勉強になります)。
CB_GETLBTEXTと言うメッセージも見つけました。
てっきり、WM_GETTEXTで取るしか無いのかなとか
思ってたので。

只、こちらだとフック出来るのはファイル名欄が、
プルダウンの無いコンボボックス(ComboBoxEx32では無い)なので
確認は、出来ていません。
私は、あまり役立つレスしてないですけど、この辺で。
# neptuneさん、博識ですね。

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