2017-02-21 34 views
0

SOLVED Как было указано @ z32a7ul Я использовал неправильную переменную, чтобы указать путь после FileDialog. Предполагалось, что OutPathS вместо OutPath.Вход пользователя FileDialog в путь для исходных файлов в VBA

Какой код имеет: У меня есть код, который читает файлы в папке, печатает имена в активной книге и затем помещает имена в порядке возрастания.

Obs1: У меня есть следующие коды, которые используют эту информацию для расчетов, но эта часть не относится к текущей проблеме.

Цель: Я пытаюсь создать FileDialog, чтобы пользователь мог ввести папку, в которой находятся исходные файлы.

Проблема: Я создаю для этого код, но по какой-то причине он не читает исходные файлы, даже если формат тот же.

Где я добрался до сих пор: Если я удалю этот пользовательский ввод и просто «твердый код» адрес источников (если моя сборник находится в той же папке, что и они), все работает нормально. Но тогда я ограничена тем, где я могу разместить эту сборник.

Вопрос: У меня нет конкретной строки ошибки. В результате возникает проблема, так как она не находит исходные файлы. Кто-нибудь знает, что здесь делать?

Код:

Option Explicit 

Public path As String 

Sub Counter() 

Dim count As Integer, i As Long, var As Integer 
Dim ws As Worksheet 
Dim w As Workbook 
Dim Filename As String 
Dim FileTypeUserForm As UserForm 
Dim X As String 
Dim varResult As Variant 
Dim OutPath As String, OutPathS As String, wPos As Long 

Set w = ThisWorkbook 

Application.Calculation = xlCalculationManual 

'source input by user 

     varResult = Application.GetSaveAsFilename(FileFilter:="Comma Separated Values Files" & "(*.csv), *.csv", Title:="OutPath", InitialFileName:="D:StartingPath") 

     If varResult <> False Then 
      OutPath = varResult 
      w.Worksheets("FILES").Cells(1, 4) = varResult 

     Else 

      Exit Sub 

     End If 

wPos = InStr(OutPath, "\StartingPath") 
OutPathS = Mid(OutPath, 1, wPos - 1) 

**'MY ERROR IS HERE, It has to be OutpathS: 
path = OutPath & "\*.*" 'this should be: path = OutPathS & "\*.*"** 


Filename = Dir(path) 

ThisWorkbook.Sheets("FILES").Range("A:A").ClearContents 

X = GetValue 
If X = "EndProcess" Then Exit Sub 


Set ws = ThisWorkbook.Sheets("FILES") 
i = 0 
Do While Filename <> "" 
    var = InStr(Filename, X) 

    If var <> 0 Then 
     i = i + 1 
     ws.Cells(i + 1, 1) = Filename 
     Filename = Dir() 

    Else: Filename = Dir() 
    End If 

Loop 

Range("A2:A" & i).Sort key1:=Range("A2"), order1:=xlAscending, Header:=xlNo  'this will sort the names directly in the "FILES" sheet 

Application.Calculation = xlCalculationAutomatic 

ws.Cells(1, 2) = i 

MsgBox i & " : files found in folder" 
End Sub 


Function GetValue() 
With FileTypeUserForm 
    .Show 
    GetValue = .Tag 
End With 
Unload FileTypeUserForm 
End Function 

Obs2: Существует общественный переменной, так как он будет использоваться в последующем макро, для расчетов.

Obs3: Вся часть filedialog предназначена только для того, чтобы найти путь к исходным файлам. Это ничего не спасает.

+0

Вы можете попробовать это: 'varResult = Application.GetSaveAsFilename (FileFilter: = «Запятые значения запятой (*. Csv), * .csv») ' – Vityata

+1

Вам не хватает \ из InitialFileName? Разве это не должно быть «D: \ StartPath» вместо «D: StartingPath»? – z32a7ul

+1

Вы сохраняете результат от Mid до OutPathS, но вычисляете путь из OutPath (без S). – z32a7ul

ответ

3

Если вам нужно только выбрать папку, рассмотреть возможность использования Application.FileDialog(msoFileDialogFolderPicker)

функция, возвращающая выбранную папку может выглядеть

Function GetFolder(initPath As String) As String 
    Dim dialog As FileDialog 

    Set dialog = Application.FileDialog(msoFileDialogFolderPicker) 
    dialog.title = "Select a Folder" 
    dialog.AllowMultiSelect = False 
    dialog.InitialFileName = initPath 

    If dialog.show Then 
     GetFolder = dialog.SelectedItems(1) 
    Else 
     GetFolder = "" 
    End If 
    Set dialog = Nothing 
End Function 
+0

Спасибо за ответ. Это также отлично работает, но требует некоторых модификаций кода. Учитывая, что исходная проблема была просто переменной ошибкой, я буду принимать ее в качестве ответа. – DGMS89