指定したフォルダへジャンプするには?

解決


ken  2004-01-23 09:38:15  No: 81656  IP: [192.*.*.*]

初めまして、VB初心者のkenと申します。
指定したフォルダへアクセスして、そのフォルダ内にある複数のテキストファイルから1つを選択するようなダイアログボックスの表示方法が分かりません。
getopenfilenameメソッドやDialogsプロパティのxlDialogOpenは分かるのですが、選択したいテキストファイルが存在するフォルダへダイレクトにアクセスしたいのです。
そのプログラムをご存知でしたら是非教えてください。よろしくお願いします。

編集    削除
岡田 之仁  2004-01-23 16:57:08  No: 81657  IP: [192.*.*.*]

VB6でですか?
VB.NET?

VB6ならコモンダイアログをコントロールに追加して
下さい。ファイルを選択するダイアログですから、要望
されるファイル選択ができますが・・・

以上。

編集    削除
ken  2004-01-23 20:11:24  No: 81658  IP: [192.*.*.*]

ご返答ありがとうございます。VB6を使っています。コモンダイアログを追加したいのですが、”メニューバーの「プロジェクト」から「コンポーネント」を選択して・・・を実行する”と書いてあるんですが、そのメニューバーがあるvisual basic[デザイン]自体のウィンドウの開き方が分かりません。現状はMicrosoft visual basicというウィンドウが開かれています。どうすれば追加できるでしょうか?ちなみにメニューバーの「ツール」で「その他のコントロール」からMicrosoft common dialog control, version 6.0を選択してuserformに貼り付けようとしても「正式にライセンスされていないため、コントロールを作成することはできません」というメッセージボックスが表示されてしまいます。

編集    削除
吉野  2004-01-23 21:32:24  No: 81659  IP: [192.*.*.*]

[Ctrl]+[T]を押してみてください。
コンポーネント追加の画面が表示されます。

編集    削除
ken  2004-01-23 23:15:45  No: 81660  IP: [192.*.*.*]

吉野さんの言われた通り[Ctrl]+[T]を押してみましたが、コンポーネント追加の画面が表示されましたが、チェックし、OKボタンを押しても何も変わりませんでした。やり方が悪いのでしょうか?
できれば、一番最初に記述したgetopenfilenameメソッドを使用してできないでしょうか?

編集    削除
長谷川  2004-01-23 23:32:51  No: 81661  IP: [192.*.*.*]

GetOpenFileNameは自分で設定したパスで開くことはできないみたいです。

それから、
「正式にライセンスされていないため、コントロールを作成することはできません」
と出たコモンダイアログコントロールですが、OCXが壊れているか、
きちんとセットアップされていないのではないかと。
一度VBをセットアップし直すなりしたほうがよいのでは。

編集    削除
ken  2004-01-24 00:04:41  No: 81662  IP: [192.*.*.*]

そのOCXですが、comdlg32のフォルダ内にあるはずがそのフォルダ自体が存在しませんでした。これはofficeか何かでExcelをインストールしたときに、最低限のインストールをした可能性があるのでしょうか?VBの話からずれてきて申し訳ありません。

編集    削除
吉野  2004-01-24 02:16:47  No: 81663  IP: [192.*.*.*]

オフィスとは無関係だと思います。
一度、VBをインストールし直してみてください。
VB6はラーニングエディションをお使いですか?

編集    削除
IMA  2004-01-24 02:21:35  No: 81664  IP: [192.*.*.*]

GetOpenFileNameはComdlg32.dllって
Declare Function GetOpenFileName Lib "comdlg32.dll" _
          Alias "GetOpenFileNameA" (lpofn As OPENFILENAME) As Long
と宣言して使う物ですよね。

場所はWin2000なら、WINNT\system32 に入っているはずです。
また、Windowsのdllですから参照設定など必要ないはずです。

OCXでは無いと思いますが。

編集    削除
吉野  2004-01-24 02:51:25  No: 81665  IP: [192.*.*.*]

モジュールで使用してみてください。
動作していたコードの一部をコピーペーストしました。

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

編集    削除
吉野  2004-01-24 02:53:19  No: 81666  IP: [192.*.*.*]

すみません。
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)
に置換えてください。

編集    削除
魔界の仮面弁士  2004-01-24 03:56:31  No: 81667  IP: [192.*.*.*]

一応確認しておきますが、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以下だと不可ですけれども。

編集    削除
ken  2004-01-24 06:59:31  No: 81668  IP: [192.*.*.*]

皆さん度々のご回答、本当にありがとうございます。
魔界の仮面弁士さんのおっしゃる通りMicrosoft Excelの
VBAを使用しています。私は2つのPCで開発を同時進行していて、
それぞれがOSがXPのExcel2002、OSが2000のExcel98を使用しています。
実際にその操作を求めているのは後者のPCですが…。自分の開発環境が
曖昧であり説明不足であることにお詫び致します。
これから皆さんに提供して頂いた情報とプログラムを基に、
今一度プログラムを作ろうと思います。少し時間を要すると思いますが、
また何か分からなくなりましたらご教授願えればと思います。
岡田 之仁さん、吉野さん、長谷川さん、IMAさん、魔界の仮面弁士さん
に感謝致します。

編集    削除
魔界の仮面弁士  2004-01-24 07:37:09  No: 81669  IP: [192.*.*.*]

> それぞれがOSがXPのExcel2002、OSが2000のExcel98を使用しています。
えぇと…。後者は Excel 97、または Word 98の間違いではありませんか?

確かに Excel 98 という製品は存在しますが、Excel 98 自体は Macintosh 用であり、Windows 2000 で動くような物では無かったかと。

編集    削除
ken  2004-01-24 08:05:05  No: 81670  IP: [192.*.*.*]

失礼しました、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で利用できないと意味がないのですが…。

編集    削除
ken  2004-01-25 14:22:47  No: 81671  IP: [192.*.*.*]

皆さんのおかげで希望通りのプログラムができました。
本当にありがとうございました。

編集    削除