[[20130104172546]] 『ラベルのCaption』(あや) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『ラベルのCaption』(あや)

 *現状の状況

 Sheet3に
 コマンドボタンA と ラベル と
 コマンドボタンStart の3つを作り

 コマンドボタンAを押すと、フォルダを指定するダイアログが開き、
 フォルダを選択してOKすると
 ラベルに該当のフォルダまでのパスが表示されます。

 '///////////////////////////////////////
 (Sheet3の中に記述)
 Private Sub Cmdフォルダ指定_Click()

    With Application.FileDialog(msoFileDialogFolderPicker)      
        If .Show = True Then
            Lblフォルダ指定.Caption = .SelectedItems(1)
        Else
            Exit Sub
        End If
    End With

 End Sub
 '///////////////////////////////////////

 コマンドボタンStartを押すと、
 標準モジュールにある Sub SubStartを呼び出し
 終了後、メッセージボックスを表示させます。
 '///////////////////////////////////////
 (Sheet3の中に記述)
 Private Sub CmdStart_Click()

    Call SubStart   
    MsgBox "終了です。"

 End Sub
 '///////////////////////////////////////

 * 解消したいところ
 フォルダの指定をしてから、
 その後にスタートを押せば問題なく動きますが、

 フォルダの指定をしてから、エクセルを保存後 終了
 開きなおして、(フォルダの指定はすでにラベルに表示されているのでOK)
 スタートを押すと、
 『実行時エラー53 ファイルが見つかりません』となり以下の☆で止まります。

 こんな感じです
 フォルダ指定→スタート OK
 フォルダ指定→スタート→スタート OK
 フォルダ指定→スタート→エクセルを閉じる→スタート NG
 フォルダ指定→スタート→エクセル閉じる→フォルダ指定→スタート OK

 SubStartの中身
 '///////////////////////////////////////
 (標準モジュールに記述)
 Sub SubStart()

    Dim StrFPath As String
    Dim Fbuf As String

    Dim buf As String, n As Long

    StrFPath = Sheet3.Lblフォルダ指定.Caption & "\"

    Fbuf = Dir(StrFPath & "\" & "*.htm")
    Do While Fbuf <> ""

        'htmlをエクセルに書き出す
        Open Fbuf For Input As #1      ☆

   (その後の作業が続きます)

 '///////////////////////////////////////

 Sheet3にあるラベルのCaptionが取ってこれていないのかと思って
 1行デバッグで確認したところ
 「StrFPath」 「Fbuf」 のどちらも必要な文字は入っていました。

 変数に渡すには、.captionが間違っている?など考えております。

 何かわかる方教えていただければ助かります。


 とりあえず気になった点だけ。検証はしていませんが…。
 Openステートメントは対象ファイルをフルパスで指定する必要があると思います。

 >Fbuf = Dir(StrFPath & "\" & "*.htm")

 Dir関数はファイル名だけを返しますから、

 >Open Fbuf For Input As #1

 この記述はおかしいかな?
 もう一点、

 >StrFPath = Sheet3.Lblフォルダ指定.Caption & "\"

 の最後の\は不要では?次の記述で

 >Fbuf = Dir(StrFPath & "\" & "*.htm")

 としていますから、\が二つ重なる事になりますよね。
 この記述でうまく動く事があるという方が不思議なのですが…

 Fbufはフルパスを含めたファイル名にはなっていないはずです。

 StrFPath = Sheet3.Lblフォルダ指定.Caption
 Fbuf = StrFPath & "\" & Dir(StrFPath & "\" & "*.htm")
 のようにしてみたらどうでしょう?
(Jera)

 おはようございます。
 すいません、上記の
 >Openステートメントは対象ファイルをフルパスで指定する必要がある
 は誤りですね…。パスを省略するとそのファイルのあるフォルダを参照するのですね。失礼しました。
(Jera)

 結果を言えば、
 >Openステートメントは対象ファイルをフルパスで指定する必要があると思います。
 と記述されているとおり、

 フルパス指定で Openステートメントを運用する

 で良いと思います。

 > フォルダの指定をしてから、
 >その後にスタートを押せば問題なく動きますが、
 がうまく作動しているのは、FileDialogのShowメソッド実行後には、
 取得したフォルダパスがカレントフォルダに設定されているから、Dir関数で受け取ったファイル名だけでも
 正常に作動しますが、

 >エクセルを保存後 終了
 >開きなおして、

 という操作を行うとカレントフォルダは、既定値に設定されて、ラベルに表示されている場合と
 違う場合にエラーが発生しますね!!

 紛らわしいので最初からフルパスを指定する方法にした方が良いと思います。

 >フォルダの指定をしてから、
 >その後にスタートを押せば問題なく動きますが、 

 この場合でも失敗する場合もあります。実例を次投稿にて・・・。

 ichinose

↓の場合でも、\が2重になるときもあるかも(マナ)

 Fbuf = StrFPath & "\" & Dir(StrFPath & "\" & "*.htm")

 以下に記述する内容はExcel2002で確認した内容です。
 上位バージョンでは、動作が違うなら、その旨教えてください。

 >がうまく作動しているのは、FileDialogのShowメソッド実行後には、
 >取得したフォルダパスがカレントフォルダに設定されているから、Dir関数で受け取ったファイル名だけでも
 >正常に作動します

 と、記述しましたが、選択の仕方によっては、必ずしもそうはならない ということです。

 まず、適当なドライブ下(仮にCドライブとします)にaというフォルダを作成してください

 aのフォルダ内に更に b,cというフォルダを作成してください。

 つまり、フルパスで言い換えると

 c:\a     
 c:\a\b
 c:\a\c

 という3つのフォルダを上記の関係で作成してください。

 次に新規ブックにて、標準モジュールに

 Sub フォルダ指定()
    With Application.FileDialog(msoFileDialogFolderPicker)
        If .Show = True Then
            MsgBox "選択されたフォルダ名 " & .SelectedItems(1) & vbCrLf & _
                   "カレントフォルダ名 " & CurDir
        Else
            Exit Sub
        End If
    End With
 End Sub

 フォルダ指定を実行してください。

 現在のカレントフォルダ内にあるフォルダが表示されていますが、
 c:\a を開いてみてください

 b,cのフォルダが表示されていると思います。

 bを選択してください、bを開くことなくOKボタンを押してください。

 選択されたフォルダ名 C:\a\b
 カレントフォルダ名 C:\a

 と表示されます。つまり、選択されたフォルダ名とカレントフォルダは、必ずしも一致するとは
 限りません。

 私は、FileDialogやDir関数は、使わないので、試してみた結果です。

 マナさん御指摘の件もFSOを使うと、あまり気にしなくても済むのですが、
 Dir関数でも対処法はあるので考えてみてください。

 ドライブそのものを指定された時と適当なフォルダを指定された時でちょっと違うということです。

 いずれにせよ、前述したように

 >フルパス指定で Openステートメントを運用する
 方法で考えてみては、いかがですか?

 ichinose


 Jeraさん ichinoseさん マナさん ありがとうございます。

 何からどこから疑ったらいいのかすらわからなくて
 困ってました^^;

 ichinoseさん
 ドライブそのものを指定した時と
 適当なフォルダを指定した時の違いが
 実例まで頂きよく理解できました。
 勉強になりますm(_ _)m

 フルパス指定にて対応で解決でした。

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

 (あや)

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.