Board logo

標題: [發問] 2003與2007得到的路徑差異 [打印本頁]

作者: maiko    時間: 2012-10-9 11:43     標題: 2003與2007得到的路徑差異

  1. Sub OpenPath()
  2. Dim fd As FileDialog, FileName As String, FileFolder As String
  3. Set fd = Application.FileDialog(msoFileDialogFolderPicker)
  4. With fd
  5.     .AllowMultiSelect = False
  6.     If .Show = -1 Then
  7.         FileFolder = .InitialFileName
  8.     Else
  9.         End
  10.     End If
  11. End With
  12. Sheet1.Range("F2") = fd.InitialFileName
  13. End Sub
複製代碼
在2003時可以完全的拿到路徑,可是在2007時就只能拿到當前路徑的上一層,請問哪裡出錯了?
例如:
在2003時拿到的路徑是:
d:\SaveExcel\20121009
可是在2007時拿到的路徑是:
d:\SaveExcel\
就差這麼一層。
作者: stillfish00    時間: 2012-10-9 14:21

回復 1# maiko
  1. Sub OpenPath()
  2. Dim fd As FileDialog, FileName As String, FileFolder As String
  3. Set fd = Application.FileDialog(msoFileDialogFolderPicker)
  4. With fd
  5.     .AllowMultiSelect = False
  6.     If .Show = -1 Then
  7.         FileFolder = .SelectedItems(1)  '#1
  8.     Else
  9.         End
  10.     End If
  11. End With
  12. Sheet1.Range("F2") = FileFolder  '#2
  13. End Sub
複製代碼
InitialFileName只是你開啟Dialog時一開始的位置
作者: maiko    時間: 2012-10-9 15:31

回復  maiko InitialFileName只是你開啟Dialog時一開始的位置
stillfish00 發表於 2012-10-9 14:21



   

有個小問題:
得到的路徑是:
d:\SaveExcel\20121009
並不是:
d:\SaveExcel\20121009\
少了個「\」符號。
作者: GBKEE    時間: 2012-10-9 15:33

回復 1# maiko
2# 說 InitialFileName只是你開啟Dialog時一開始的位置
預設如圖

[attach]12733[/attach]
  1. Option Explicit
  2. Sub Ex() ' 2003, 2007 分別執行看看有無差別
  3.     MsgBox Application.DefaultFilePath
  4. End Sub
複製代碼

作者: maiko    時間: 2012-10-9 16:09

回復  maiko
2# 說 InitialFileName只是你開啟Dialog時一開始的位置
預設如圖
GBKEE 發表於 2012-10-9 15:33



   

1. 你的意思是不是說在選項中的「預設檔案位置」沒有「\」,那麼取得的路徑最後面就沒有「\」?

2. 還是說InitialFileName只是開啟Dialog時一開始的位置 就是「預設檔案位置」?

如果是1.的話,那麼我在WinXP + Excel 2007,用InitialFileName就可以得到完整的路徑,如:d:\SaveExcel\20121009\
如果是2.的話,因為在開啟Dialog時已經改變了檔案位置,所以按了確定以後所得到的路徑已經不是「預設檔案位置」的路徑。

忽然,我得到了一個好像跟Windows有關的問題,就是:
用Win7 + Excel 2007的話,用.InitialFileName取到的路徑就會少一層;
用WinXP + Excel 2007的話,用.InitialFileName取到的路徑就很完整。
當然Excel 2003在哪個Windows都沒有問題。

不知道這個是不是Windows本身的FileDialog介面不同所得到的路徑不同?
這個是WinXP + Excel 2007擷取的FileDialog介面:
[attach]12734[/attach]

Win7 + Excel 2007暫時擷取不到,等下再補上。
作者: maiko    時間: 2012-10-9 16:49

請各位高手用代碼試試看,哪裡出錯了?有什麼地方要改進?謝謝!
作者: GBKEE    時間: 2012-10-9 17:16

回復 5# maiko
1#問說:  2003  d:\SaveExcel\20121009 可是在2007時拿到的路徑是:d:\SaveExcel\
我的回覆 是指出可能是 Application.DefaultFilePath   2003,2007 的「預設檔案位置」 路徑不同
你問 :      InitialFileName只是開啟Dialog時一開始的位置 就是「預設檔案位置
                所以在開啟Dialog時已經改變了檔案位置,所以按了確定以後所得到的路徑已經不是「預設檔案位置」的路徑。
是對的
  1. Sub Ex()
  2.     Application.DefaultFilePath = "D:\TEST"
  3.     '可修改「預設檔案位置」
  4. End Sub
複製代碼

作者: maiko    時間: 2012-10-9 19:07

回復  maiko
1#問說:  2003  d:\SaveExcel\20121009 可是在2007時拿到的路徑是:d:\SaveExcel\
我的回覆 ...
GBKEE 發表於 2012-10-9 17:16



   
你誤會了我的意思了,我並不是要「預設檔案位置」或者要改變「預設檔案位置」,我是想通過選擇檔案路徑然後給出完整的路徑字串,如:d:\SaveExcel\20121009\,這樣的字串,而我在2003時,使用InitialFileName是可以完整的取得檔案路徑:d:\SaveExcel\20121009\,而在2007時,使用InitialFileName就只能取得:d:\SaveExcel\,就是差了一層路徑。

而我用stillfish00大提供的取得的檔案路徑卻是:d:\SaveExcel\20101009,後面少了「\」這個,正是這樣的困擾才問這裡的高手看看有什麼方法解決完整路徑字串的問題,謝謝!

請用代碼在Excel上試試。謝謝!
作者: maiko    時間: 2012-10-9 19:13

補上在Win7 + Excel 2007的 FileDialog 介面
[attach]12735[/attach]

這是WinXP + Excel 2007 的 FileDialog 介面
[attach]12736[/attach]

問題會不會出在兩個介面所得的路徑不同,可能已經不是用InitialFileName,也不是用SelectedItems(1)所能取得的路徑了,是不是還有其它的方法取得這樣的路徑呢?謝謝!
作者: stillfish00    時間: 2012-10-9 19:27

回復 5# maiko
Hi , 我家是win7+Excel2010 ,

我又試了一遍 , 確實 .InitialFileName 也會隨使用者操作後改變路徑 , 只是當初沒想到還能這樣做為回傳結果 , 但如果沒特殊需求我還是會用 .SelectedItems取回結果啦 , 少個斜線就用笨方法 & "\" 自己加上去:L

然後win7+Excel2010下 , 使用 .InitialFileName也跟你一樣少一層 , 但跟Application.DefaultFilePath不一致 , 反而是跟curDir一致 , 供您參考
作者: Hsieh    時間: 2012-10-9 20:53

回復 9# maiko

InitialFileName是可以用來指定對話視窗中的預備目錄
若未指定InitialFileName則會以選項中的預設存檔目錄作為對話視窗預設目錄
而SelectedItems才是所選擇的資料夾
所以,妳要寫入的應該是   SelectedItems而不是InitialFileName
這樣SelectedItems不管是2003或2007都是不含最後的斜線
  1. Sub OpenPath()
  2. Dim fd As FileDialog, FileName As String, FileFolder As String
  3. Set fd = Application.FileDialog(msoFileDialogFolderPicker)
  4. With fd
  5.      .InitialFileName = "E:\"  '指定對話視窗的目錄
  6.      .AllowMultiSelect = False
  7.     If .Show = -1 Then
  8.         FileFolder = .SelectedItems(1)   '選擇的資料夾
  9.     Else
  10.         End
  11.     End If
  12. End With
  13. [F2] = FileFolder
  14. End Sub
複製代碼
[attach]12737[/attach]
作者: Happkkevin    時間: 2012-10-9 23:14

進入這主題學到不少
搜尋學到,順便分享一下,較常用DefaultFilePath避免上述變化
有空試試,學習一下FileDialog搭配運用


自Excel XP(2002)起,Application多了一個FileDialog屬性。FileDialog 屬性傳回 FileDialog 物件,此物件代表檔案對話方塊的執行個體。

用法:
Application.FileDialog(fileDialogType)
fileDialogType 必選的 MsoFileDialogType。檔案對話方塊的類型。
MsoFileDialogType 可以是這些 MsoFileDialogType 常數之一。

    msoFileDialogFilePicker 允許使用者選取檔案。
    msoFileDialogFolderPicker 允許使用者選取資料夾。
    msoFileDialogOpen 允許使用者開啟檔案。
    msoFileDialogSaveAs 允許使用者儲存檔案。

FileDialog 物件提供檔案對話方塊功能,類似 Microsoft Office 應用程式中的標準 [開啟舊檔] 及 [儲存檔案] 對話方塊功能。運用這些對話方塊,整合方案的使用者可以很容易地指定該方案應使用的檔案及資料夾。

使用 FileDialog 物件
以 FileDialog 屬性傳回 FileDialog 物件。FileDialog 屬性位在每個單獨的 Office 應用程式 Application 物件中。屬性使用一個引數 DialogType,以確定屬性所傳回的 FileDialog 物件類型。下列是 FileDialog 物件的 4 種類型:

    [開啟舊檔] 對話方塊:讓使用者選取一或多個檔案,可使用 Execute 方法在主應用程式中開啟。
    [另存新檔] 對話方塊:讓使用者選取一個檔案,可使用 Execute 方法儲存目前的檔案。
    [檔案選擇器] 對話方塊:讓使用者選取一或多個檔案。在 FileDialogSelectedItems 集合中擷取使用者所選取的檔案路徑。
    [資料夾選擇器] 對話方塊:讓使用者選取路徑。在 FileDialogSelectedItems 集合中擷取使用者所選取的路徑。

每個主應用程式只能例示 FileDialog 物件的單個實例。因此,即使當建立多個 FileDialog 物件時,亦保留 FileDialog 物件的許多屬性。因此,請確認在顯示該對話方塊前,已設定適合您目的之所有屬性。

為了使用 FileDialog 物件顯示對話方塊,您必須使用 Show 方法。一旦顯示對話方塊,就會在使用者結束該對話方塊之後才執行程式碼。
作者: Happkkevin    時間: 2012-10-9 23:48

回報一下測試結果,供參考
Win7+OFFICE 2010
OpenPath4
使用後測試結果 d:\SaveExcel\20121009
但下次選取時為跳到目錄為 d:\SaveExcel

OpenPath5
使用後測試結果d:\SaveExcel\
一樣下次選取時為跳到目錄為 d:\SaveExcel
  1.     Sub OpenPath4()
  2.     Dim fd As FileDialog, FileName As String, FileFolder As String
  3.     Set fd = Application.FileDialog(msoFileDialogFolderPicker)
  4.     With fd
  5.         .AllowMultiSelect = False
  6.         If .Show = -1 Then
  7.             FileFolder = .SelectedItems(1)  '#1
  8.         Else
  9.             End
  10.         End If
  11.     End With
  12.     [F2] = FileFolder  '#2
  13.     End Sub
複製代碼
  1. Sub OpenPath5()
  2. Dim fd As FileDialog, FileName As String, FileFolder As String
  3. Set fd = Application.FileDialog(msoFileDialogFolderPicker)
  4. With fd
  5.     .AllowMultiSelect = False
  6.     If .Show = -1 Then
  7.         FileFolder = .InitialFileName
  8.     Else
  9.         End
  10.     End If
  11. End With
  12. [F2] = fd.InitialFileName
  13. End Sub
複製代碼

作者: GBKEE    時間: 2012-10-10 07:37

回復 8# maiko
而我用stillfish00大提供的取得的檔案路徑卻是:d:\SaveExcel\20101009,後面少了「\」           
不一樣的  1# 是 Sheet1.Range("F2") = fd.InitialFileName
stillfish00 2# 是 Sheet1.Range("F2") = FileFolder
作者: maiko    時間: 2012-10-10 07:58

回復  maiko
而我用stillfish00大提供的取得的檔案路徑卻是:d:\SaveExcel\20101009,後面少了「\」      ...
GBKEE 發表於 2012-10-10 07:37



   

FileFolder = .InitialFileName
也就是:
FileFolder = fd.InitialFileName
對等公式。
試過了,結果一樣,唯有像 stillfish00 大說的一樣,在後面加上 & "\" ,那麼無論甚麼版本的Excel都可以用到,統一樣式,不會讓以後改了版本就用不到。

謝謝這麼多位高手的幫助,讓我更了解了FileDialog的屬性,謝謝!
作者: GBKEE    時間: 2012-10-10 08:28

回復 15# maiko
很抱歉沒說清楚 請再看  2# 的程式碼 有 FileFolder = .SelectedItems(1)   
stillfish00 2# 是 Sheet1.Range("F2") = FileFolder 是最後沒有 "\"
作者: maiko    時間: 2012-10-10 11:26

回復  maiko
很抱歉沒說清楚 請再看  2# 的程式碼 有 FileFolder = .SelectedItems(1)   
stillfish00 2 ...
GBKEE 發表於 2012-10-10 08:28



   

那麼依你所見,是不是Sheet1.Range("F2") = FileFolder 最後是沒有「\」,那麼應該用什麼才會有「\」?不用後面自己加& "\"?
作者: GBKEE    時間: 2012-10-10 12:42

回復 17# maiko
  1. Option Explicit
  2. Sub OpenPath()
  3. Dim fd As FileDialog, FileName As String, FileFolder As String
  4. Set fd = Application.FileDialog(msoFileDialogFolderPicker)
  5. With fd
  6.      .InitialFileName = "E:\"  '指定對話視窗的目錄
  7.      .AllowMultiSelect = False
  8.     If .Show = -1 Then
  9.         FileFolder = .SelectedItems(1)   '選擇的資料夾
  10.         [F2] = .SelectedItems(1)      '最後沒"\"
  11.         [F3] = fd.InitialFileName    '有"\"
  12.     Else
  13.         End
  14.     End If
  15. End With
  16. End Sub
複製代碼

作者: maiko    時間: 2012-10-10 15:14

回復  maiko
GBKEE 發表於 2012-10-10 12:42



   
謝謝大大的熱心幫忙,不過大大好像不明白我前面所講的要求:

InitialFileName如果用在2003上是完全可以取得完整的路徑,如:d:\SaveExcel\20121009\
可是InitialFileName如果用在2007上卻是得到的路徑會少了一層,如:d:\SaveExcel\,這也就是你說的後面有"\",可是路徑不完整。

如果用SelectedItems(1),那麼在2003或2007(因為我沒有2010,可是之前有大大在2010上試過)是可以取得到比較完整的路徑,如:d:\SaveExcel\20121009,後面就沒有"\",就如stillfish00大說過的那樣,唯有自己加上& "\",不知道這樣說明你能清楚嗎?

請試多幾次代碼的區別,謝謝大大的熱心幫忙!
作者: GBKEE    時間: 2012-10-10 15:44

回復 19# maiko
可是InitialFileName如果用在2007上卻是得到的路徑會少了一層
我只有2003版 所以這差異我無從參與的.
作者: Happkkevin    時間: 2012-10-11 19:36

回復 19# maiko

InitialFileName  會設定或傳回 String,此字串代表最初顯示在檔案對話方塊中的路徑或檔名。可讀寫的。
SelectedItems  會取得 FileDialogSelectedItems 集合。這個集合包含使用者在使用 FileDialog 物件的 Show 方法所顯示的檔案對話方塊中選取之檔案的路徑清單。唯讀的。

單純測試回報
如果依照我以2010版或你使用的2007版,如我上面回覆敘述,下次選取時為跳到目錄為選取時的上一層即 d:\SaveExcel,所以取得的 fd.InitialFileName還是d:\SaveExcel\
而使用SelectedItems 才會是選取的d:\SaveExcel\20121009,可以試試2003版是否選取後下次開啟是否不會跳回上一層,若是如此,應該是兩種版本 之FileDialog差異
這就需要高手們協助了
作者: maiko    時間: 2012-10-15 10:43

回復 21# Happkkevin


   

的確如你所說的那樣,2003選取後下次開啟是不會跳回上一層的,所以我說就是兩種版本的FileDialog的差異,正在等待高手如何解決,謝謝!




歡迎光臨 麻辣家族討論版版 (http://forum.twbts.com/)