Überprüfen Sie mit VBA, ob die Datei vorhanden ist

82
Sub test()

thesentence = InputBox("Type the filename with full extension", "Raw Data File")

Range("A1").Value = thesentence

If Dir("thesentence") <> "" Then
    MsgBox "File exists."
Else
    MsgBox "File doesn't exist."
End If

End Sub

Wenn ich den Textwert aus dem Eingabefeld nehme, funktioniert dies nicht. Wenn Sie es jedoch "the sentence"aus If entfernen Dir()und durch einen tatsächlichen Namen im Code ersetzen, funktioniert es. Kann jemand helfen?

Dinesh Goel
quelle

Antworten:

142

Beachten Sie, dass Ihr Code enthält, Dir("thesentence")was sein sollte Dir(thesentence).

Ändern Sie Ihren Code in diesen

Sub test()

thesentence = InputBox("Type the filename with full extension", "Raw Data File")

Range("A1").Value = thesentence

If Dir(thesentence) <> "" Then
    MsgBox "File exists."
Else
    MsgBox "File doesn't exist."
End If

End Sub
Cylian
quelle
1
Es hat mir teilweise geholfen. Ich denke, wenn ich diesen Code-Compiler verwende, wird "Thesentence" nicht als Verzeichnis betrachtet. Daher hatte ich zuvor nur eine weitere Codezeile verwendet. If: <code> Dim Path als String Dim Directory als String Path = InitialPath & "\" & Date $ Directory = Dir (Pfad, vbDirectory) </ code> als ich ** Directory ** variable Zeichenfolge unter If Dir (Directory) <> "" verwendet habe, dann hat es gut funktioniert
muhammad tayyab
19

Verwenden Sie das Office- FileDialogObjekt, damit der Benutzer eine Datei aus dem Dateisystem auswählt. Fügen Sie in Ihrem VB-Projekt oder im VBA-Editor eine Referenz hinzu Microsoft Office Libraryund schauen Sie in der Hilfe nach. Dies ist viel besser, als wenn Menschen vollständige Pfade betreten.

In diesem Beispiel kann msoFileDialogFilePickerder Benutzer mehrere Dateien auswählen. Sie könnten auch verwenden msoFileDialogOpen.

'Note: this is Excel VBA code
Public Sub LogReader()
    Dim Pos As Long
    Dim Dialog As Office.FileDialog
    Set Dialog = Application.FileDialog(msoFileDialogFilePicker)

    With Dialog
        .AllowMultiSelect = True
        .ButtonName = "C&onvert"
        .Filters.Clear
        .Filters.Add "Log Files", "*.log", 1
        .Title = "Convert Logs to Excel Files"
        .InitialFileName = "C:\InitialPath\"
        .InitialView = msoFileDialogViewList

        If .Show Then
            For Pos = 1 To .SelectedItems.Count
                LogRead .SelectedItems.Item(Pos) ' process each file
            Next
        End If
    End With
End Sub

Es gibt viele Optionen, daher müssen Sie die vollständigen Hilfedateien anzeigen, um alles zu verstehen, was möglich ist. Sie können mit dem Office 2007 FileDialog-Objekt beginnen (natürlich müssen Sie die richtige Hilfe für die von Ihnen verwendete Version finden).

ErikE
quelle
1
+1 Viel besser, da dies Excel Application.FileDialog (msoFileDialogOpen) ist
Alex K.
18

Korrektur zu fileExists von @UberNubIsTrue:

Function fileExists(s_directory As String, s_fileName As String) As Boolean

  Dim obj_fso As Object, obj_dir As Object, obj_file As Object
  Dim ret As Boolean
   Set obj_fso = CreateObject("Scripting.FileSystemObject")
   Set obj_dir = obj_fso.GetFolder(s_directory)
   ret = False
   For Each obj_file In obj_dir.Files
     If obj_fso.fileExists(s_directory & "\" & s_fileName) = True Then
        ret = True
        Exit For
      End If
   Next

   Set obj_fso = Nothing
   Set obj_dir = Nothing
   fileExists = ret

 End Function

EDIT: verkürzte Version

' Check if a file exists
Function fileExists(s_directory As String, s_fileName As String) As Boolean

    Dim obj_fso As Object

    Set obj_fso = CreateObject("Scripting.FileSystemObject")
    fileExists = obj_fso.fileExists(s_directory & "\" & s_fileName)

End Function
amackay11
quelle
2
Warum testet der Code denselben Dateinamen mehrmals (einmal für jede Datei in s_directory)? Es macht keinen Sinn, diesen Test zu wiederholen. Sie werden feststellen, dass die Schleifenvariable (obj_file) nicht vom Schleifencode verwendet wird.
Grantnz
1
@grantnz In der Tat! Ich hatte das faule Kopieren / Einfügen durchgeführt und optimiert, bis es funktionierte. Die verkürzte Version ist oben. Vielen Dank.
Amackay11
Hat jemand bemerkt, dass dieser Test manchmal ein falsches Positiv meldet, dh "Wahr" zurückgibt, selbst wenn eine Datei nicht im Dateisystem vorhanden ist. In meiner Anwendung überprüfe ich das Vorhandensein einer Datei auf einem Server in meinem Netzwerk, wenn dies einen Hinweis gibt.
Pablete
6

nur diese Sprachmarken loswerden

Sub test()

Dim thesentence As String

thesentence = InputBox("Type the filename with full extension", "Raw Data File")

Range("A1").Value = thesentence

If Dir(thesentence) <> "" Then
    MsgBox "File exists."
Else
    MsgBox "File doesn't exist."
End If

End Sub

Dies ist die, die ich mag:

Option Explicit

Enum IsFileOpenStatus
    ExistsAndClosedOrReadOnly = 0
    ExistsAndOpenSoBlocked = 1
    NotExists = 2
End Enum


Function IsFileReadOnlyOpen(FileName As String) As IsFileOpenStatus

With New FileSystemObject
    If Not .FileExists(FileName) Then
        IsFileReadOnlyOpen = 2  '  NotExists = 2
        Exit Function 'Or not - I don't know if you want to create the file or exit in that case.
    End If
End With

Dim iFilenum As Long
Dim iErr As Long
On Error Resume Next
    iFilenum = FreeFile()
    Open FileName For Input Lock Read As #iFilenum
    Close iFilenum
    iErr = Err
On Error GoTo 0

Select Case iErr
    Case 0: IsFileReadOnlyOpen = 0 'ExistsAndClosedOrReadOnly = 0
    Case 70: IsFileReadOnlyOpen = 1 'ExistsAndOpenSoBlocked = 1
    Case Else: IsFileReadOnlyOpen = 1 'Error iErr
End Select

End Function    'IsFileReadOnlyOpen
warum theq
quelle
3
Ich habe noch nie von "Sprachmarken" gehört. Seltsam. Eine Art Fehlbezeichnung meiner Meinung nach. Viele Dinge erfordern Zitate, sind aber keine Sprache.
ErikE
4
@ErikE +1 für schöne Beobachtung ... Bilder hier
whytheq
1
Anscheinend ist "Sprachzeichen" eine informelle Version von "Anführungszeichen".
ErikE
@ErikE ... Ich weiß oder besser gesagt, ich sagte "Ich weiß"
warum theq
6
Function FileExists(fullFileName As String) As Boolean
    FileExists = VBA.Len(VBA.Dir(fullFileName)) > 0
End Function

Funktioniert fast sehr gut bei mir. Wenn ich es mit "" der leeren Zeichenfolge aufrufe, gibt Dir " connection.odc " zurück !! Wäre toll, wenn ihr euer Ergebnis teilen könntet.

Jedenfalls gefällt mir das:

Function FileExists(fullFileName As String) As Boolean
  If fullFileName = "" Then
    FileExists = False
  Else
    FileExists = VBA.Len(VBA.Dir(fullFileName)) > 0
  End If
End Function
Joachim Brolin
quelle
1
Alter Beitrag, aber es sieht so aus, als ob dir("")Sie den Namen der ersten Datei im aktuellen Verzeichnis erhalten. In Ihrem Fall war es eine Datei namens connection.odc.
Corey
3

Ich bin nicht sicher, was speziell mit Ihrem Code nicht stimmt, aber ich verwende diese Funktion, die ich online gefunden habe (URL in den Kommentaren), um zu überprüfen, ob eine Datei vorhanden ist:

Private Function File_Exists(ByVal sPathName As String, Optional Directory As Boolean) As Boolean
    'Code from internet: http://vbadud.blogspot.com/2007/04/vba-function-to-check-file-existence.html
    'Returns True if the passed sPathName exist
    'Otherwise returns False
    On Error Resume Next
    If sPathName <> "" Then

        If IsMissing(Directory) Or Directory = False Then

            File_Exists = (Dir$(sPathName) <> "")
        Else

            File_Exists = (Dir$(sPathName, vbDirectory) <> "")
        End If

    End If
End Function
Dan
quelle
1
Dies gibt return true zurück, wenn Sie einen Pfad angeben und nicht wissen, ob es sich um ein Verzeichnis handelt oder nicht. Wenn Sie testen möchten, ob ein Pfad nur eine Datei ist, funktioniert dies nicht zu 100%. ? dir$("C:\Users\Chloe\AppData\Local\Temp\")gibt die erste Datei in diesem Verzeichnis aus und ist nicht gleich "". Daher wird true zurückgegeben, auch wenn Sie das DirectoryArgument weglassen oder auf false setzen.
Chloe
@Chloe Ich denke, es wird davon ausgegangen, dass Sie eine Dateierweiterung zusammen mit dem Dateinamen angeben, sodass die Mehrdeutigkeit, ein Verzeichnis zu sein, in diesem Fall nicht wirklich zutrifft. Aber sicher, es könnte robuster sein. Es kommt nur darauf an, wie tief eine Lösung ist, die Sie benötigen. Aber es funktioniert auf jeden Fall für den vom OP angegebenen Fall
Dan
3
Function FileExists(fullFileName As String) As Boolean
    FileExists = VBA.Len(VBA.Dir(fullFileName)) > 0
End Function
Ronnie Royston
quelle
1

Sehr alter Beitrag, aber da er mir nach einigen Änderungen geholfen hat, dachte ich, ich würde ihn teilen. Wenn Sie überprüfen, ob ein Verzeichnis vorhanden ist, möchten Sie das Argument vbDirectory zur Dir-Funktion hinzufügen. Andernfalls kehren Sie 0jedes Mal zurück. (Bearbeiten: Dies war eine Antwort auf Roys Antwort, aber ich habe es versehentlich zu einer regelmäßigen Antwort gemacht.)

Private Function FileExists(fullFileName As String) As Boolean
    FileExists = Len(Dir(fullFileName, vbDirectory)) > 0
End Function
Wort Nerd
quelle
1

basierend auf anderen Antworten hier möchte ich meine Einzeiler teilen, die für Verzeichnisse und Dateien funktionieren sollten :

  • Len(Dir(path)) > 0 or Or Len(Dir(path, vbDirectory)) > 0  'version 1 - ... <> "" should be more inefficient generally
    • ( Len(Dir(path))funktionierte einfach nicht für Verzeichnisse (Excel 2010 / Win7))
  • CreateObject("Scripting.FileSystemObject").FileExists(path)  'version 2 - could be faster sometimes, but only works for files (tested on Excel 2010/Win7)

als PathExists(path)Funktion:

Public Function PathExists(path As String) As Boolean
    PathExists = Len(Dir(path)) > 0 Or Len(Dir(path, vbDirectory)) > 0
End Function
Andreas Dietrich
quelle