2015-06-27 2 views
1

У меня есть несколько папок, которые я хочу, чтобы этот код редактировал промежуточный запуск и завершение. Часть кода, который перерабатывает поиск в другой папке, не видит никакого * .csv, когда Folder2 заменяет Folder1 для SubFolder, но если исходное условие для SubFolder в начале меня вручную меняет с «Folder1» на «Folder2» «теперь он обнаружит * .csv-файлы в этой папке. Он также обнаруживает * .csv в «Folder1» и «Folder3», когда они являются начальным условием для SubFolder. Я проверить, как это рекомендовано в других вопросах и не мог найти недостающую «\» в этом кодеконкретные типы файлов в определенных папках с vba

Global Myfile, MyFolder, NewFile, SubFolder As String 

Sub SpecificFileTypeInSpecificFolders() 
' 
SubFolder = "Folder1" 
MyFolder = "C:\xxxxxx\" & SubFolder 
Myfile = Dir(MyFolder & "\*.csv") 
MsgBox SubFolder 
MsgBox Myfile 
Do While Myfile <> "" 
MsgBox SubFolder 
MsgBox Myfile 
Myfile = Dir 
    If Myfile = "" Then 
     If SubFolder = "Folder2" Then 'several more folders like this 
      SubFolder = "Folder3" 
     End If 
     If SubFolder = "Folder1" Then 
      SubFolder = "Folder2" 
     End If 
    End If 
    MsgBox SubFolder 
    MsgBox Myfile 
    Loop 
End Sub 

ответ

0

Изменение значения переменной SubFolder после строки кода MyFolder = "C:\xxxxxx\" & SubFolder не оказывает никакого влияния на переменную MyFolder. Когда вы объединяете строковые переменные с помощью оператора &, вы берете значение переменной SubFolder и добавляете его в текст C:\xxxxxx\ и помещая результат в значение переменной MyFolder.

Если вы хотите найти известный список папок, создайте массив из папок, а затем выполните цикл через массив.

Избегайте использования Globals. Лучшей практикой является объявление переменных с минимальной требуемой областью. В VBA, когда вы объявляете несколько переменных в одной строке, вы должны указать тип переменной каждого из них, иначе они будут определены как Variant. Таким образом, в вашей строке кода определяется только SubFolder в виде строки:

Global Myfile, MyFolder, NewFile, SubFolder As String 

Вместо этого используйте:

Dim Myfile As String, MyFolder As String, NewFile As String, SubFolder As String 

Лично я предпочитаю держать каждую переменную декларацию на отдельной строке.

Этот код должен работать нормально:

Sub SpecificFileTypeInSpecificFolders() 
' 
Dim myFile As String 
Dim subFolder As Variant ' Must be variant to enable looping through the array 
Dim folderNames As Variant 
Dim mainFolder As String 

    folderNames = Array("Folder1", "Folder2", "Folder3") 
    mainFolder = "C:\xxxxxx\" 

    For Each subFolder In folderNames 
     MsgBox subFolder 
     myFile = Dir(mainFolder & subFolder & "\*.csv") 
     Do While myFile <> "" 
      MsgBox myFile 
      myFile = Dir 
     Loop 
    Next subFolder 

End Sub 
+0

Спасибо, что помогли много, так как это может быть, третья вещь, которую я сделал в VBA. Я хочу сделать матричную версию, где «folderNames» также находятся в массиве. – raeng