2017-02-21 1 views
0

RESOLU Comme l'indiquait @ z32a7ul, j'utilisais la mauvaise variable pour indiquer le chemin après le FileDialog. C'était censé être OutPathS au lieu de OutPath.Entrée utilisateur FileDialog vers chemin d'accès pour les fichiers sources dans VBA

Quel code fait: J'ai un code qui lit les fichiers dans un dossier, imprime les noms dans le classeur actif, et met ensuite les noms dans l'ordre croissant.

OBS1: J'ai suit les codes qui utilisent ces informations pour les calculs, mais cette partie ne concerne pas le problème actuel. J'essaie de créer un FileDialog afin que l'utilisateur puisse entrer le dossier dans lequel sont les fichiers source.

Problème: Je crée un code pour cela, mais pour une raison quelconque, il ne lit pas les fichiers source, même si le format est le même. Si je supprime cette entrée utilisateur et que je "code" l'adresse des sources (en supposant que mon classeur se trouve dans le même dossier qu'eux), tout fonctionne correctement. Mais alors je suis limité à l'endroit où je peux placer ce cahier de travail "rassembleur".

Question: Je n'obtiens aucune ligne d'erreur spécifique. Le résultat est le problème, car il ne trouve pas les fichiers source. Est-ce que quelqu'un a une idée sur ce qu'il faut faire ici?

code:

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: Il y a une variable publique, car il va être utilisé dans une macro ultérieure, pour les calculs.

Obs3: La partie entière de filedialog est juste pour trouver le chemin où les fichiers sources sont. Ça ne sauve rien.

+0

Pouvez-vous essayer ceci: 'varResult = Application.GetSaveAsFilename (FileFilter: = "Valeurs séparées par des virgules (*. Csv), * .csv") ' – Vityata

+1

N'y a-t-il pas un \ de InitialFileName? Ne devrait-il pas être "D: \ StartingPath" au lieu de "D: StartingPath"? – z32a7ul

+1

Vous sauvegardez le résultat de Mid à OutPathS mais calculez le chemin à partir de OutPath (sans S). – z32a7ul

Répondre

3

S'il vous suffit de sélectionner un dossier, envisagez d'utiliser Application.FileDialog(msoFileDialogFolderPicker)

Une fonction renvoyant un dossier sélectionné pourrait ressembler à

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

Merci pour la réponse. Cela fonctionne également bien, mais a nécessité quelques modifications de code. Considérant que le problème original était juste une erreur variable, je vais accepter celui-ci comme la réponse. – DGMS89