VBA kullanarak dosyanın var olup olmadığını kontrol edin


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

Bu durumda, metin değerini giriş kutusundan aldığımda çalışmıyor. Bununla birlikte, If'den "the sentence"çıkarırsanız Dir()ve koddaki gerçek bir adla değiştirirseniz çalışır. Biri yardım edebilir mi?

Yanıtlar:


142

Kodunuzun Dir("thesentence")olması gerekenleri içerdiğini unutmayın Dir(thesentence).

Kodunuzu buna değiştirin

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

1
Kısmen bana yardımcı oldu Bu kod derleyicisini kullandığımda "thesentence" ı bir dizin olarak kabul etmediğini düşünüyorum, bu yüzden If: <code> Dim Path as String Dim Directory as String Path = InitialPath & "\" & Tarih $ Directory = Dir (Yol, vbDirectory) </code> ** Dizin ** değişken dizesini If Dir (Dizin) <> "" altında kullandığımda iyi çalıştı
muhammad tayyab

19

FileDialogKullanıcının dosya sisteminden bir dosya seçmesini sağlamak için Office nesnesini kullanın . VB projenize veya VBA düzenleyicisine bir referans ekleyin Microsoft Office Libraryve yardıma bakın. Bu, insanların tam yollara girmesinden çok daha iyidir.

Aşağıda, msoFileDialogFilePickerkullanıcının birden çok dosya seçmesine izin veren bir örnek verilmiştir . Ayrıca kullanabilirsiniz 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

Pek çok seçenek var, bu yüzden mümkün olan her şeyi anlamak için tüm yardım dosyalarını görmen gerekecek. Office 2007 FileDialog nesnesiyle başlayabilirsiniz (tabii ki, kullandığınız sürüm için doğru yardımı bulmanız gerekir).


1
1 Çok daha iyi, bu excel Application.FileDialog (msoFileDialogOpen) olduğu gibi
Alex K.

18

@UberNubIsTrue'dan dosyaya düzeltme:

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: kısaltılmış versiyon

' 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

2
Kod neden aynı dosya adını birden çok kez test ediyor (s_directory içindeki her dosya için bir kez)? Bu testi tekrar etmenin bir anlamı yok. Döngü değişkeninin (obj_file) döngü kodu tarafından kullanılmadığını fark edeceksiniz.
grantnz

1
@grantnz Gerçekten! Tembel kopyala / yapıştır işlemini yaptım ve işe yarayana kadar ince ayar yaptım. Kısaltılmış versiyon yukarıda. Teşekkürler.
amackay11

Bu testin bazen yanlış bir pozitif rapor ettiğini, yani dosya sisteminde bir dosya olmasa bile "Doğru" döndürdüğünü fark eden var mı? Uygulamamda, size bir ipucu veriyorsa, ağımdaki bir sunucuda bir dosyanın varlığını kontrol ediyorum.
pablete

6

sadece şu konuşma işaretlerinden kurtul

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

Bu benim sevdiğim şey:

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

3
Daha önce hiç "konuşma işareti" duymadım. Garip. Bence bir çeşit yanlış isim. Pek çok şey alıntı gerektirir ama konuşma değildir.
ErikE

4
Güzel bir gözlem için @ErikE +1 ... Pictures Here
whytheq

1
Görünüşe göre "konuşma işaretleri", "tırnak işaretleri" nin resmi olmayan bir versiyonu.
ErikE

@ErikE ... Biliyorum ya da daha doğrusu "biliyorum" dedim
whytheq

6
Function FileExists(fullFileName As String) As Boolean
    FileExists = VBA.Len(VBA.Dir(fullFileName)) > 0
End Function

Neredeyse benim sitemde çok iyi çalışıyor. Onu "" boş dizeyle çağırırsam, Dir " connection.odc " döndürür !! Sonucunuzu paylaşırsanız harika olur.

Neyse, bunu beğendim:

Function FileExists(fullFileName As String) As Boolean
  If fullFileName = "" Then
    FileExists = False
  Else
    FileExists = VBA.Len(VBA.Dir(fullFileName)) > 0
  End If
End Function

1
Eski gönderi, ancak görünüşe göre dir("")size geçerli dizindeki ilk dosyanın adını veriyor. Senin durumunda bu, adlı bir dosyaydı connection.odc.
Corey

4
Function FileExists(fullFileName As String) As Boolean
    FileExists = VBA.Len(VBA.Dir(fullFileName)) > 0
End Function

3

Özellikle kodunuzda neyin yanlış olduğundan emin değilim, ancak çevrimiçi bulduğum bu işlevi (yorumlarda URL) bir dosyanın var olup olmadığını kontrol etmek için kullanıyorum:

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

1
Bu, bir yol verirseniz ve bunun bir dizin olup olmadığını bilmiyorsanız true değerini verecektir. Bir yolun yalnızca dosya olup olmadığını test etmek istiyorsanız, bu% 100 çalışmayacaktır. ? dir$("C:\Users\Chloe\AppData\Local\Temp\")o dizindeki ilk dosyayı verecektir ve "" eşit olmayacaktır, bu nedenle, Directorybağımsız değişkeni kapalı bıraksanız veya yanlış olarak ayarlasanız bile doğru geri dönecektir .
Chloe

@Chloe Sanırım dosya adıyla birlikte bir dosya uzantısı belirteceğinizi varsayıyor, bu nedenle bir dizin olmanın belirsizliği bu durumda gerçekten geçerli değil. Ama elbette, daha sağlam olabilir. Bu sadece ne kadar derin bir çözüme ihtiyacınız olduğuna bağlıdır. Ancak OP tarafından belirtilen dava için kesinlikle işe yarıyor
Dan

1

Çok eski bir gönderi, ama bazı değişiklikler yaptıktan sonra bana yardımcı olduğu için paylaşacağımı düşündüm. Bir dizinin olup olmadığını kontrol ediyorsanız, vbDirectory bağımsız değişkenini Dir işlevine eklemek isteyeceksiniz, aksi takdirde 0her seferinde geri dönersiniz . (Düzenleme: Bu, Roy'un cevabına bir cevaptı, ancak yanlışlıkla bunu normal bir cevap verdim.)

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

1

Buradaki diğer yanıtlara dayanarak, dizinler ve dosyalar için çalışması gereken tek satırlarımı paylaşmak istiyorum :

  • Len(Dir(path)) > 0 or Or Len(Dir(path, vbDirectory)) > 0  'version 1 - ... <> "" should be more inefficient generally
    
    • ( Len(Dir(path))dizinler için çalışmadı (Excel 2010 / Win7))
  • CreateObject("Scripting.FileSystemObject").FileExists(path)  'version 2 - could be faster sometimes, but only works for files (tested on Excel 2010/Win7)
    

olarak PathExists(path)işlev:

Public Function PathExists(path As String) As Boolean
    PathExists = Len(Dir(path)) > 0 Or Len(Dir(path, vbDirectory)) > 0
End Function
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.