初めまして、VB初心者のkenと申します。
指定したフォルダへアクセスして、そのフォルダ内にある複数のテキストファイルから1つを選択するようなダイアログボックスの表示方法が分かりません。
getopenfilenameメソッドやDialogsプロパティのxlDialogOpenは分かるのですが、選択したいテキストファイルが存在するフォルダへダイレクトにアクセスしたいのです。
そのプログラムをご存知でしたら是非教えてください。よろしくお願いします。
VB6でですか?
VB.NET?
VB6ならコモンダイアログをコントロールに追加して
下さい。ファイルを選択するダイアログですから、要望
されるファイル選択ができますが・・・
以上。
ご返答ありがとうございます。VB6を使っています。コモンダイアログを追加したいのですが、”メニューバーの「プロジェクト」から「コンポーネント」を選択して・・・を実行する”と書いてあるんですが、そのメニューバーがあるvisual basic[デザイン]自体のウィンドウの開き方が分かりません。現状はMicrosoft visual basicというウィンドウが開かれています。どうすれば追加できるでしょうか?ちなみにメニューバーの「ツール」で「その他のコントロール」からMicrosoft common dialog control, version 6.0を選択してuserformに貼り付けようとしても「正式にライセンスされていないため、コントロールを作成することはできません」というメッセージボックスが表示されてしまいます。
編集 削除[Ctrl]+[T]を押してみてください。
コンポーネント追加の画面が表示されます。
吉野さんの言われた通り[Ctrl]+[T]を押してみましたが、コンポーネント追加の画面が表示されましたが、チェックし、OKボタンを押しても何も変わりませんでした。やり方が悪いのでしょうか?
できれば、一番最初に記述したgetopenfilenameメソッドを使用してできないでしょうか?
GetOpenFileNameは自分で設定したパスで開くことはできないみたいです。
それから、
「正式にライセンスされていないため、コントロールを作成することはできません」
と出たコモンダイアログコントロールですが、OCXが壊れているか、
きちんとセットアップされていないのではないかと。
一度VBをセットアップし直すなりしたほうがよいのでは。
そのOCXですが、comdlg32のフォルダ内にあるはずがそのフォルダ自体が存在しませんでした。これはofficeか何かでExcelをインストールしたときに、最低限のインストールをした可能性があるのでしょうか?VBの話からずれてきて申し訳ありません。
編集 削除オフィスとは無関係だと思います。
一度、VBをインストールし直してみてください。
VB6はラーニングエディションをお使いですか?
GetOpenFileNameはComdlg32.dllって
Declare Function GetOpenFileName Lib "comdlg32.dll" _
Alias "GetOpenFileNameA" (lpofn As OPENFILENAME) As Long
と宣言して使う物ですよね。
場所はWin2000なら、WINNT\system32 に入っているはずです。
また、Windowsのdllですから参照設定など必要ないはずです。
OCXでは無いと思いますが。
モジュールで使用してみてください。
動作していたコードの一部をコピーペーストしました。
Private Declare Function GetOpenFileName Lib "comdlg32.dll" Alias "GetOpenFileNameA" (pOpenfilename As OPENFILENAME) As Long
Private 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
Public Type DIALOGINI
strTitle As String 'ダイアログタイトル
strIniDir As String '初期ディレクトリ
strFilter As String 'フィルター
lngFilterIndex As Long 'フィルターのインデックス
strFilePath As String 'パス付きファイル名
strFileName As String 'ファイル名
strDefExt As String
End Type
'**************************************************
'* 関数名 : OpenFileDialog
'* 機 能 : 「ファイルを開く」ダイアログを表示する
'* 引 数 : lngHwnd ウインドウのハンドル
'* Dialog ダイアログ初期設定値
'* 戻り値 : 0以外 正常
'* 0 異常
'* 特記事項 : 複数ファイルを選択できない
'**************************************************
Public Function OpenFileDialog(ByVal lngHwnd As Long, ByRef Dialog As DIALOGINI)
On Error GoTo ErrTrap
Dim OpenFile As OPENFILENAME 'CommonDialogの構造体
Dim strFilter As String 'フィルター
Dim strTemp As String * 260
strFilter = Replace(Dialog.strFilter, "|", Chr$(0)) & Chr$(0)
'ダイアログの設定
With OpenFile
.lStructSize = Len(OpenFile)
.hwndOwner = lngHwnd
.lpstrTitle = Dialog.strTitle
.lpstrInitialDir = Dialog.strIniDir
.nMaxFile = 260
.nMaxFileTitle = 260
.flags = OFN_FILEMUSTEXIST Or OFN_HIDEREADONLY Or OFN_PATHMUSTEXIST
.lpstrFilter = strFilter
.nFilterIndex = Dialog.lngFilterIndex
.lpstrFile = strTemp
.lpstrFileTitle = strTemp
.lpstrDefExt = Dialog.strDefExt
End With
'ダイアログを表示
OpenFileDialog = GetOpenFileName(OpenFile)
'エラーであれば、プロシージャを抜ける
If OpenFileDialog = 0 Then
Exit Function
End If
Dialog.strFilePath = Left$(OpenFile.lpstrFile, InStrRev(OpenFile.lpstrFile, Chr$(0)) - 1)
Dialog.strFileName = Left$(OpenFile.lpstrFileTitle, InStrRev(OpenFile.lpstrFileTitle, Chr$(0)) - 1)
Exit Function
ErrTrap:
OpenFileDialog = 0
End Function
すみません。
Dialog.strFilePath = Left$(OpenFile.lpstrFile, InStrRev(OpenFile.lpstrFile, Chr$(0)) - 1)
Dialog.strFileName = Left$(OpenFile.lpstrFileTitle, InStrRev(OpenFile.lpstrFileTitle, Chr$(0)) - 1)
を
Dialog.strFilePath = Left$(OpenFile.lpstrFile, InStr(OpenFile.lpstrFile, Chr$(0)) - 1)
Dialog.strFileName = Left$(OpenFile.lpstrFileTitle, InStr(OpenFile.lpstrFileTitle, Chr$(0)) - 1)
に置換えてください。
一応確認しておきますが、ken さんが使っておられるのは、Microsoft Excel ですよね?
> getopenfilenameメソッドやDialogsプロパティのxlDialogOpenは分かるのですが、
・GetOpenFilenameメソッド
・Dialogsプロパティ
・xlDialogOpen列挙定数
——これらって、Excel 2000以上の VBA に含まれる物ですから。
「コモンダイアログが使えない」「UserFormに貼り付けようとした」との内容から
察するに、恐らくは Excel VBAで開発しているのでしょう。
# Excel 2000 や 2002 でVBA開発環境を開くと、[バージョン情報]に
# 「Microsoft Visual Basic 6.0」と表示されますから、混乱があるのかも。
> ちなみにメニューバーの「ツール」で「その他のコントロール」から
Excel VBA開発環境の[ツール]メニューには、[その他のコントロール]という項がありますね。
で、それはさておき。もし、Excel 2002 以上で開発しているのであれば、
Dim F As FileDialog
Set F = Application.FileDialog(msoFileDialogOpen)
F.AllowMultiSelect = False
F.Filters.Clear
F.Filters.Add "テキストファイル", "*.txt"
F.InitialFileName = "C:\USER\"
If F.Show() Then
MsgBox F.SelectedItems(1)
Else
MsgBox "キャンセル"
End If
Set F = Nothing
のようにすれば良いかと思います。Excel 2000以下だと不可ですけれども。
皆さん度々のご回答、本当にありがとうございます。
魔界の仮面弁士さんのおっしゃる通りMicrosoft Excelの
VBAを使用しています。私は2つのPCで開発を同時進行していて、
それぞれがOSがXPのExcel2002、OSが2000のExcel98を使用しています。
実際にその操作を求めているのは後者のPCですが…。自分の開発環境が
曖昧であり説明不足であることにお詫び致します。
これから皆さんに提供して頂いた情報とプログラムを基に、
今一度プログラムを作ろうと思います。少し時間を要すると思いますが、
また何か分からなくなりましたらご教授願えればと思います。
岡田 之仁さん、吉野さん、長谷川さん、IMAさん、魔界の仮面弁士さん
に感謝致します。
> それぞれがOSがXPのExcel2002、OSが2000のExcel98を使用しています。
えぇと…。後者は Excel 97、または Word 98の間違いではありませんか?
確かに Excel 98 という製品は存在しますが、Excel 98 自体は Macintosh 用であり、Windows 2000 で動くような物では無かったかと。
失礼しました、Excel97の間違いです。そちらのPCが今手元になく
確認できず曖昧でした。
魔界の仮面弁士さんに提供して頂いたプログラム
Dim F As FileDialog
Set F = Application.FileDialog(msoFileDialogOpen)
F.AllowMultiSelect = False
F.Filters.Clear
F.Filters.Add "テキストファイル", "*.txt"
F.InitialFileName = "C:\USER\"
If F.Show() Then
MsgBox F.SelectedItems(1)
Else
MsgBox "キャンセル"
End If
Set F = Nothing
をExcel2002で実行したところ理想のものでした。
ちなみにテキストファイルを選択してOKボタンを押すと
選択したテキストファイル内のデータを読み取り
(列はカンマ区切りで36行×2列)指定したセルへ
貼り付けることは可能なのですか?
このくらい簡易なプログラムだと初心者の私にとって非常に助かります。
Excel97で利用できないと意味がないのですが…。
皆さんのおかげで希望通りのプログラムができました。
本当にありがとうございました。