2015-10-03 30 views
2

我在我的宏中有一些標準化進程,將更改應用到放置在任何目錄中的一組文件,並且我不知道爲什麼我會得到不同的結果。爲了說明這一點,這是標準的代碼的開頭:更改工作驅動器

'list files in the folder where this macro is placed 
strNombreCarpeta = ThisWorkbook.Path 
ChDir strNombreCarpeta 
strArchivoExcel = Dir("*." & CStr(strExtension)) 

'rest of the code 

即使我的工作目錄是在另一個驅動器(不是「C:」),我可以得到的「strNombreCarpeta」變量,內容爲「E :/ updates/12_06_files /'並處理該文件夾中的文件。

但是,在另一臺PC上使用同一個宏文件時,該進程根本無法工作,變量'strNombreCarpeta'獲取空值,並且「Dir」命令的工作原理與我的默認路徑爲%CURRENT_USER %/ DOCUMENTS並嘗試列出該文件夾中的文件。

所以,我沒有得到在我想要的文件進行任何更改。

一些想法,爲什麼硬盤的這一變化僅適用有時候? 我該如何預防?

在始終工作「C:」不是一個標準的解決方案,因爲在驅動器中的空間是有限的。

+0

如果您始終將完整路徑傳遞給Dir() –

+0

'ThisWorkbook.Path'無法返回NULL值,則不需要ChDir或ChDrv。如果工作簿直到現在才保存,它將返回一個空的String'「」'。如果工作簿是從模板('* .xltm')創建的,則會發生這種情況。如果雙擊此模板,將打開一個新的未保存的工作簿。或者有人使用'* .xlsm'作爲模板,方法是右鍵單擊並選擇New而不是Open。那麼該工作簿如何打開? –

回答

0

要盡我所知CHDIR的不能改變CurrentDrive。你必須使用單獨的命令 - ChDrive。所以代碼將如下所示:

strNombreCarpeta = thisworkbook.path 
strDrive = left(strNombreCarpeta,1) 
ChDrive strDrive 
ChDir strNombreCarpeta 

strArchivoExcel = Dir("*." & CStr(strExtension)) 

就我個人而言,我只是使用帶Dir函數的完整文件夾目錄。所以:

strArchivoExcel = Dir(strNombreCarpeta & "\*." & CStr(strExtension)) 

這在我看來更簡單和更安全。它甚至可能會在網絡路徑(UNC)

工作,如果有人NOW的答案爲什麼有時沒有ChDrive工作,我想知道自己anwser。我最好的工作理論是,其他一些過程正在改變應用程序.CurrDrive & .CurrDir。

注意:我沒有測試任何代碼上面 - 我沒有這臺機器上安裝的Office。

0

一對夫婦更可靠的方式來獲得的文件列表,而無需使用ChDir

Public Sub listFilesDir() 
    Dim f As Variant 

    f = Dir(ThisWorkbook.Path & "\" & "*.txt") 

    Do While Len(f) > 0 
     Debug.Print f 
     f = Dir 
    Loop 
End Sub 

Public Sub listFilesFSO() 
    Dim fso As Object, fsoFolder As Object, f As Variant 

    Set fso = CreateObject("Scripting.FileSystemObject") 

    Set fsoFolder = fso.GetFolder(ThisWorkbook.Path) 


    For Each f In fsoFolder.Files 
     If InStr(f.Name, ".txt") > 0 Then Debug.Print f.Name 
    Next 

    'or 

    For Each f In fsoFolder.Files 
     If f.Type = "Text Document" Then Debug.Print f.Name 
    Next 
End Sub 

  • .xlsm Type: "Microsoft Excel Macro-Enabled Worksheet"
  • .csv Type: "Microsoft Excel Comma Separated Values File"
  • .txt Type: "Text Document"
0

感謝您的回答。是的,ThisWorkbook.Path不是null,strNombreCarpeta獲取一個值,實際上,ChDir是不起作用的。

我在Windows系統中找到了解決方案。我的電腦已將所有內容安裝在驅動器'C:'(Windows,Program Files,Users)中,但有點不同之處在於我移動了'Documents','Images'和'Downloads'子文件夾來驅動'E:'。因此,宏觀過程從一開始就以'E:'開頭,這就是ChDir適用於'E:/ updates/12_06_files /'的原因。

令人驚訝的是,試圖在我自己的PC中運行像C:/ updating /這樣的文件夾中的宏,顯示了我在其他PC上得到的錯誤。

我做了一個小的修改我的代碼添加這些行:

strCurrentDrive = Left(ThisWorkbook.Path,2) 
ChDrive strCurrentDrive 
ChDir strNombreCarpeta 
'rest of the code 

和工作!我不確定在使用'Left(ThisWorkbook.Path,2)'或'Left(ThisWorkbook.Path,1)'之間是否會有差異,但它們都可以工作。

我已經使用過'fso'來計算文件夾中的文件,但我更喜歡避免它,通常會使過程有點慢。

再次感謝大家。

相關問題