2013-12-09 70 views
1

我試圖得到實現創建一個新的這是一個文件夾路徑的一個在VBA Excel 2007中子文件夾內結合子文件夾的名稱,使一個字符串

組合

有沒有一種方法可以將CurDir()與folder.path和path.separators結合起來,這會給出組合字符串的結果?

例子:

\\Tardis\Data\[PATH] = ParentPath 
\\Tardis\Data\[PATH]\HELLO = 1st Subfolder 
\\Tardis\Data\[PATH]\HELLO\WORLD = 2nd Subfolder 

結果: HELLO WORLD

+2

目前尚不清楚你的問題是什麼。 「打印」在哪裏?通常,您使用「&」連接VBA中的字符串,如果您需要代碼也可以在Mac上工作,則可以使用Application.PathSeparator而不是「\」。 –

+0

如果你的意思是你試圖打印一個字符串,將文件夾名稱合併成一個句子,用空格分隔而不是路徑分隔符,你可以使用提供的info @TimWilliams提供的'Split'和'Join' VBA String函數。 – Blackhawk

+0

@Blackhawk有沒有一個例子可以使用'Split'和'Join'在VBA中使用文件夾路徑?另外我已經澄清了我在問題中的措詞。 – Julz

回答

2

我要帶贓物在此:我想你想創建一個綜合的目錄和子目錄名稱的字符串與之間的空間。

這裏是假設在當前目錄中多個子文件夾,並使用FileSystemObjectFolder你描述爲每一個(從陣列中舉行,訪問),可以創建一個腳本。請注意,您需要設置對Microsoft腳本運行時的引用。我在C:驅動器上使用文件路徑對我的文檔進行了測試,結果正常。希望這有助於:

Sub CreateStringsForSubfolders() 

    'To use this you need a reference set for Microsoft Scripting Runtime 

    '~~>dim variables and set initial values 
     Dim fsObject As New FileSystemObject 
     Dim fFolder As Folder 
      Set fFolder = fsObject.GetFolder("\\Tardis\Data\[PATH]\HELLO") 
     Dim fSubfolder As Folder 
     Dim aNames() As String 
      ReDim aNames(1) As String 

    '~~>loop to create name for each subfolder 
     For Each fSubfolder In fFolder.SubFolders 
      ReDim Preserve aNames(UBound(aNames) + 1) 
      aNames(UBound(aNames)) = fFolder.Name & " " & fSubfolder.Name 
      Debug.Print aNames(UBound(aNames)) 'press [CTRL + G] to see the names created 
     Next 

End Sub 

這裏是您的要求修改代碼。我不確定你在做什麼(如果你在你的問題中包含了這些信息可能會有幫助),所以我假設你只是想將子文件夾添加到數組中。如果您確實想要創建字符串中始終有兩個文件夾的名稱,請使用Else部分中的註釋替代方法。

Sub CreateStringsForSubfolders2() 

    '~~>dim variables and set initial values 
     Dim sPath As String 
     Dim fsObject As New FileSystemObject 
     Dim fFolder As Folder 
      Set fFolder = fsObject.GetFolder("\\Tardis\Data\[PATH]") 
     Dim fSubfolder As Folder 
     Dim fSubfolder2 As Folder 
     Dim aNames() As String 
      ReDim aNames(1) As String 

    '~~>loop to create name for each subfolder and any sub-subfolders 
     For Each fSubfolder In fFolder.SubFolders 
      ReDim Preserve aNames(UBound(aNames) + 1) 
      sPath = fSubfolder.Path 
      Set fSubfolder = fsObject.GetFolder(sPath) 
      If fSubfolder.SubFolders.Count <> 0 Then 
       For Each fSubfolder2 In fSubfolder.SubFolders 
        ReDim Preserve aNames(UBound(aNames) + 1) 
        aNames(UBound(aNames)) = fSubfolder.Name & " " & _ 
                 fSubfolder2.Name 
        Debug.Print aNames(UBound(aNames)) 
       Next fSubfolder2 
      Else 
       aNames(UBound(aNames)) = fSubfolder.Name 
             'or fFolder.Name & " " fSubfolder.Name 
       Debug.Print aNames(UBound(aNames)) 
      End If 
     Next 

End Sub 
+0

這正是我所期待的!然而,這些問題開始出現,因爲有兩個子目錄需要查看,而且我不確定如何在上面的代碼中添加另一個「圖層」 - 換句話說,您的方法可行! – Julz

+0

Julz,爲了解決你在編輯中描述的問題,你只需要在第一個嵌套中嵌套另一個循環。因爲我的原始路徑的一些子文件夾沒有子文件夾,所以我使循環有條件(如果存在另一個級別,只使用第二個循環)。希望這可以幫助。另外:你的問題不是很清楚。在發佈您的下一個問題之前,您可能需要[閱讀此](http://meta.stackexchange.com/questions/156810/stack-overflow-question-checklist)。 –

0

此代碼是慷慨地提供這種解決方案雖然我有時會收到沒有定義錯誤用戶定義類型 - 誰能告訴我爲什麼?

Sub ListFiles() 

    'Declare the variables 
    Dim objFSO As Scripting.FileSystemObject 
    Dim objTopFolder As Scripting.Folder 
    Dim strTopFolderName As String 

    'Assign the top folder to a variable 
    strTopFolderName = "\\Tardis\Data\[PATH]\" 

    'Create an instance of the FileSystemObject 
    Set objFSO = CreateObject("Scripting.FileSystemObject") 

    'Get the top folder 
    Set objTopFolder = objFSO.GetFolder(strTopFolderName) 

    'Call the RecursiveFolder routine 
    Call RecursiveFolder(objTopFolder) 

End Sub 

Sub RecursiveFolder(objFolder As Scripting.Folder) 

    'Declare the variables 
    Dim objFile As Scripting.File 
    Dim objSubFolder As Scripting.Folder 
    Dim objSubFolder2 As Scripting.Folder 
    Dim NextRow As Long 
    Dim myString As String 

    myString = "" 

    'Loop through each file in the folder 
    For Each objSubFolder In objFolder.SubFolders 
     For Each objSubFolder2 In objSubFolder.SubFolders 
      If myString = "" Then 
       myString = objSubFolder2.Name 
      Else 
       myString = objSubFolder.Name & " " & objSubFolder2.Name 
       Debug.Print myString 
      End If 
     Next objSubFolder2 

     myString = "" 

    Next objSubFolder 

End Sub 
+0

當您遇到錯誤時,VBA會突出顯示哪部分代碼?哪一段代碼指向「用戶定義類型未定義」 – Blackhawk

+0

@Blackhawk'Sub RecursiveFolder(objFolder As Scripting.Folder)'這部分 – Julz

+1

它可能會這樣做的唯一原因是如果您將此代碼複製到新的Excel文檔,但不添加對「Microsoft腳本運行時」的引用。你可以進入VBA窗口,點擊Tools ---> References ...並選中「Microsoft Scripting Runtime」旁邊的複選框。 – Blackhawk

相關問題