2017-02-21 171 views
0

求解正如@ 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:\ StartingPath”而不是“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