Excel'de VBA kullandığımızda, çoğu görevlerimizi otomatikleştirmek içindir.
Bu aynı zamanda çoğu zaman hücreler ve aralıklar, çalışma sayfaları, çalışma kitapları ve Excel uygulamasının parçası olan diğer nesnelerle çalıştığımız anlamına gelir.
Ancak VBA çok daha güçlüdür ve Excel dışındaki şeylerle çalışmak için de kullanılabilir.
Bu öğreticide, sisteminizdeki veya ağ sürücülerinizdeki dosya ve klasörlerle çalışmak için VBA FileSystemObject'i (FSO) nasıl kullanacağınızı göstereceğim.
VBA FileSystemObject (FSO) nedir?
FileSystemObject (FSO), bilgisayarınızın dosya sistemine erişmenizi sağlar. Bunu kullanarak, bilgisayar sisteminizdeki dosyalara/klasörlere/dizinlere erişebilir ve bunları değiştirebilirsiniz.
Örneğin, Excel VBA'da FileSystemObject kullanarak yapabileceğiniz şeylerden bazıları aşağıdadır:
- Bir dosya veya klasör olup olmadığını kontrol edin.
- Klasörleri/dosyaları oluşturun veya yeniden adlandırın.
- Bir klasördeki tüm dosya adlarının (veya alt klasör adlarının) bir listesini alın.
- Dosyaları bir klasörden diğerine kopyalayın.
Umarım fikri anlarsın.
Yukarıdaki tüm örnekleri (artı daha fazlasını) bu eğitimde daha sonra ele alacağım.
Yukarıda bahsedilenlerden bazıları, geleneksel VBA işlevleri (DIR işlevi gibi) ve yöntemleri kullanılarak da yapılabilirken, bu daha uzun ve daha karmaşık kodlara yol açacaktır. FileSystemObject, kodu temiz ve kısa tutarken dosya ve klasörlerle çalışmayı kolaylaştırır.
Not: FSO yalnızca Excel 2000 ve sonraki sürümlerde kullanılabilir.
FileSystemObject Aracılığıyla Hangi Nesnelere Erişebilirsiniz?
Yukarıda bahsettiğim gibi, VBA'da FileSystemObject kullanarak dosya ve klasörlere erişebilir ve bunları değiştirebilirsiniz.
Aşağıda, FSO kullanarak erişebileceğiniz ve değiştirebileceğiniz en önemli nesneleri gösteren bir tablo bulunmaktadır:
Nesne | Tanım |
Sürmek | Drive Object, sürücünün var olup olmadığı, yol adı, sürücü türü (çıkarılabilir veya sabit), boyutu vb. gibi sürücü hakkında bilgi almanızı sağlar. |
Dosya | Klasör nesnesi, sisteminizde klasörler oluşturmanıza veya değiştirmenize olanak tanır. Örneğin, bu nesneyi kullanarak klasörler oluşturabilir, silebilir, yeniden adlandırabilir, kopyalayabilirsiniz. |
Dosya | Dosya Nesnesi, sisteminizdeki dosyalarla çalışmanıza olanak tanır. Örneğin, bu nesneyi kullanarak dosyalar oluşturabilir, açabilir, kopyalayabilir, taşıyabilir ve silebilirsiniz. |
Metin Akışı | TextStream nesnesi, metin dosyaları oluşturmanıza veya okumanıza olanak tanır. |
Yukarıdaki nesnelerin her biri, bunlarla çalışmak için kullanabileceğiniz yöntemlere sahiptir.
Örnek vermek gerekirse, bir klasörü silmek istiyorsanız Klasör nesnesinin DeleteFolder yöntemini kullanacaksınız. Benzer şekilde, bir dosyayı kopyalamak istiyorsanız, File nesnesinin CopyFile yöntemini kullanacaksınız.
Bu ezici veya anlaşılması zor görünüyorsa endişelenmeyin. Bu eğitimde ele aldığım örnekleri incelediğinizde çok daha iyi anlayacaksınız.
Sadece referans amacıyla, bu öğreticinin sonunda tüm FileSystemObject yöntemlerini (her nesne için) ele aldım.
Excel VBA'da FileSystemObject'i Etkinleştirme
FileSystemObject, Excel VBA'da varsayılan olarak mevcut değildir.
Excel uygulamasının dışında kalan dosya ve klasörlerle uğraştığımız için öncelikle bu nesneleri (sürücüler, dosyalar, klasörler) tutan kitaplığa bir referans oluşturmamız gerekiyor.
Artık Excel VBA'da FileSystemObject'i kullanmaya başlamanın iki yolu var:
- Başvuruyu Microsoft Komut Dosyası Çalıştırma Zamanı Kitaplığı'na (Scrrun.dll) ayarlama
- Kodun kendisinden kitaplığa başvuracak bir nesne oluşturma
Her iki yöntem de işe yarasa da (bunu nasıl yapacağınızı daha sonra göstereceğim), ilk yöntemi kullanmanızı öneririm.
Not: FileSystemObject'i etkinleştirdiğinizde, içindeki tüm nesnelere erişebilirsiniz. Buna FileSystemObject, Drive, Files, Folders vb. dahildir. Bu eğitimde büyük ölçüde FileSystemObject'e odaklanacağım.Başvuruyu Microsoft Komut Dosyası Çalıştırma Zamanı Kitaplığına Ayarlama
Komut Dosyası Çalıştırma Zamanı Kitaplığına bir başvuru oluşturduğunuzda, Excel VBA'nın dosya ve klasörün tüm özelliklerine ve yöntemlerine erişmesine izin verirsiniz. Bu yapıldıktan sonra, Excel VBA içinden dosyalar/klasörler/sürücüler nesnesine başvurabilirsiniz (tıpkı hücrelere, çalışma sayfalarına veya çalışma kitaplarına başvurabileceğiniz gibi).
Aşağıda, Microsoft Komut Dosyası Çalıştırma Zamanı Kitaplığı'na bir başvuru oluşturma adımları verilmiştir:
- VB Editöründe, Araçlar'a tıklayın.
- Referanslar'a tıklayın.
- Açılan Referanslar iletişim kutusunda, mevcut referanslar arasında gezinin ve 'Microsoft Komut Dosyası Çalıştırma Zamanı' seçeneğini işaretleyin.
- Tamam'ı tıklayın.
Yukarıdaki adımlar artık Excel VBA'dan FSO nesnelerine başvurmanıza izin verecektir.
Kodda FileSystemObject Örneği Oluşturma
Başvuruyu Scripting FileSystemObject kitaplığına ayarladıktan sonra, kodunuzda FSO nesnesinin bir örneğini oluşturmanız gerekir.
Bu oluşturulduktan sonra, VBA'da kullanabilirsiniz.
MyFSO nesne değişkenini bir FileSystemObject nesnesi olarak ayarlayacak kod aşağıdadır:
Sub CreateFSO() Dim MyFSO As FileSystemObject Set MyFSO = New FileSystemObject End Sub
Bu kodda önce MyFSO değişkenini FileSystemObject type nesnesi olarak bildirdim. Bu, yalnızca Microsoft Komut Dosyası Çalıştırma Zamanı Kitaplığı'na bir başvuru oluşturduğum için mümkündür. Referans oluşturulmazsa, bu size bir hata verecektir (çünkü Excel, FileSystemObject'in ne anlama geldiğini tanımaz).
İkinci satırda iki şey olur:
- NEW anahtar sözcüğü, FileSystemObject örneğini oluşturur. Bu, artık dosya ve klasörlerle çalışmak için FileSystemObject'in tüm yöntemlerini kullanabileceğim anlamına geliyor. Bu örneği oluşturmazsanız, FSO yöntemlerine erişemezsiniz.
- SET anahtar sözcüğü, MyFSO nesnesini bu yeni FileSystemObject örneğine ayarlar. Bu, dosya ve klasörlere erişmek için bu nesneyi kullanmama izin veriyor. Örneğin bir klasör oluşturmam gerekirse MyFSO.CreateFolder yöntemini kullanabilirim.
İsterseniz, yukarıdaki iki ifadeyi aşağıda gösterildiği gibi tek bir ifadede de birleştirebilirsiniz:
Sub CreateFSO() Dim MyFSO As New FileSystemObject End Sub
Bu yöntemi kullanmanın (Microsoft Komut Dosyası Çalıştırma Zamanı Kitaplığına başvuruyu ayarlamak için) büyük bir yararı, kodunuzda FSO nesnelerini kullandığınızda, aşağıdakilerle ilişkili yöntemleri ve özellikleri gösteren IntelliSense özelliğini kullanabilecek olmanızdır. bir nesne (aşağıda gösterildiği gibi).
Referansı kodun içinden oluşturduğunuzda bu mümkün değildir (ileride ele alınacaktır).
Koddan Nesne Oluşturma
FSO'ya referans oluşturmanın başka bir yolu da bunu koddan yapmaktır. Bu yöntemde herhangi bir referans oluşturmanıza gerek yoktur (önceki yöntemde olduğu gibi).
Kodu yazarken, kodun içinden bir nesne oluşturabilir ve Scripting.FileSystemObject öğesine başvurabilirsiniz.
Aşağıdaki kod bir FSO nesnesi oluşturur ve ardından bunu bir FileSystemObject türü yapar.
Sub FSODemo() Dim FSO As Object Set FSO = CreateObject("Scripting.FileSystemObject") End Sub
Bu daha uygun görünse de, bu yöntemi kullanmanın büyük bir dezavantajı, FSO'da nesnelerle çalışırken IntelliSense göstermemesidir. Benim için bu çok büyük bir olumsuzluk ve her zaman FSO'yu etkinleştirmenin önceki yöntemini kullanmanızı öneririm (bu, "Microsoft Komut Dosyası Çalıştırma Zamanı" referansını ayarlayarak)
VBA FileSystemObject Örnekleri
Şimdi, Excel'de FileSystemObject kullanmanın bazı pratik örneklerine bir göz atalım.
Örnek 1: Bir Dosya veya Klasörün Var Olup Olmadığını Kontrol Edin
Aşağıdaki kod, 'Test' adlı klasörün var olup olmadığını (belirtilen konumda) kontrol edecektir.
Klasör varsa, EĞER koşulu Doğru'dur ve bir mesaj kutusunda "Klasör Var" mesajını gösterir. Ve yoksa, bir mesaj gösterir - Klasör Mevcut Değil'.
Sub CheckFolderExist() MyFSO'yu Dim As FileSystemObject Set MyFSO = New FileSystemObject If MyFSO.FolderExists("C:\Users\sumit\Desktop\Test") Sonra MsgBox "Klasör Mevcut" Değilse MsgBox "Klasör Mevcut Değil" End If End Alt
Benzer şekilde, bir dosyanın var olup olmadığını da kontrol edebilirsiniz.
Aşağıdaki kod, belirtilen klasörde Test.xlsx adında bir dosya olup olmadığını kontrol eder.
Sub CheckFileExist() MyFSO'yu FileSystemObject Olarak Dim Dim MyFSO = New FileSystemObject Eğer MyFSO.FileExists("C:\Users\sumit\Desktop\Test\Test.xlsx") Sonra MsgBox "Dosya Mevcut" Değilse MsgBox "Dosya Mevcut Değilse" " End Alt Eğer End
Örnek 2: Belirtilen Konumda Yeni Bir Klasör Oluşturun
Aşağıdaki kod, sistemimin C sürücüsünde 'Test' adında bir klasör oluşturacaktır (sisteminizde klasörü oluşturmak istediğiniz yolu belirtmeniz gerekecektir).
Sub CreateFolder() Dim MyFSO As FileSystemObject Set MyFSO = New FileSystemObject MyFSO.CreateFolder ("C:\Users\sumit\Desktop\Test") End Sub
Bu kod düzgün çalışsa da, klasörün zaten mevcut olması durumunda bir hata gösterecektir.
Aşağıdaki kod, klasörün zaten var olup olmadığını kontrol eder ve yoksa bir klasör oluşturur. Klasör zaten mevcutsa, bir mesaj gösterir. Klasörün var olup olmadığını kontrol etmek için FolderExists yöntemi FSO'nun.
Sub CreateFolder() Dim MyFSO As FileSystemObject Set MyFSO = New FileSystemObject If MyFSO.FolderExists("C:\Users\sumit\Desktop\Test") Sonra MsgBox "Klasör Zaten Mevcut" Diğer MyFSO.CreateFolder ("C:\Users\ özet\Desktop\Test") End If End Sub
Örnek 3: Bir Klasördeki Tüm Dosyaların Listesini Alın
Aşağıdaki kod, belirtilen klasördeki tüm dosyaların adlarını gösterir.
Sub GetFileNames() MyFSO As FileSystemObject Dim MyFile Dosya Olarak Dim MyFolder MyFolder As Folder Set MyFSO = New Scripting.FileSystemObject MyFolder Set MyFSO.GetFolder("C:\Users\sumit\Desktop\Test") MyFolder.Files'daki Her MyFile İçin Debug.Print MyFile.Name Sonraki MyFile End Sub
Bu kod, daha önce gördüğümüz kodlardan biraz daha karmaşıktır.
Bu eğitimde yukarıda bahsettiğim gibi, 'Microsoft Scripting Runtime Library'ye başvurduğunuzda, FileSystemObject'in yanı sıra diğer tüm nesneleri (Dosyalar ve Klasörler gibi) kullanabilirsiniz.
Yukarıdaki kodda üç nesne kullanıyorum - FileSystemObject, File ve Folder. Bu, belirtilen klasördeki her dosyadan geçmeme izin veriyor. Daha sonra tüm dosya adlarının listesini almak için name özelliğini kullanırım.
Tüm dosyaların adlarını almak için Debug.Print kullandığımı unutmayın. Bu isimler, VB Editöründe hemen pencerede listelenecektir.
Örnek 4: Bir Klasördeki Tüm Alt Klasörlerin Listesini Alın
Aşağıdaki kod, belirtilen klasördeki tüm alt klasörlerin adlarını verecektir. Mantık, yukarıdaki örnekte ele alınanla tamamen aynıdır. Bu kodda dosyalar yerine alt klasörler kullandık.
Sub GetSubFolderNames() MyFSO'yu FileSystemObject As Olarak Dim MyFile Dosya Olarak Dim MyFolder Klasör Olarak Dim MySubFolder As Klasör Seti MyFSO = Yeni Scripting.FileSystemObject Set MyFolder = MyFSO.GetFolder("C:\Users\Sumit\Desktop\SubFolder") Her MyFolder İçin MyFolder.SubFolders'da Debug.Print MySubFolder.Name Sonraki MySubFolder End Sub
Örnek 5: Bir Dosyayı Bir Yerden Başka Bir Yere Kopyalayın
Aşağıdaki kod, dosyayı 'Kaynak' klasöründen kopyalayacak ve 'Hedef' klasörüne kopyalayacaktır.
Sub CopyFile() Dim MyFSO As FileSystemObject Dim SourceFile As Dize Dim DestinationFolder Dize Seti Olarak MyFSO = New Scripting.FileSystemObject SourceFile = "C:\Users\sumit\Desktop\Source\SampleFile.xlsx" DestinationFolder = "C:\Users\sumit \Desktop\Destination" MyFSO.CopyFile Source:=SourceFile, Destination:=DestinationFolder & "\SampleFileCopy.xlsx" End Sub
Yukarıdaki kodda iki değişken kullandım - SourceFile ve DestinationFolder.
Kaynak Dosya, kopyalamak istediğim dosyanın adresini tutar ve DestinationFolder değişkeni, dosyanın kopyalanmasını istediğim klasörün adresini tutar.
Bir dosyayı kopyalarken hedef klasör adını vermenin yeterli olmadığını unutmayın. Ayrıca dosya adını da belirtmeniz gerekir. Aynı dosya adını kullanabilir veya değiştirebilirsiniz. Yukarıdaki örnekte dosyayı kopyalayıp SampleFileCopy.xlsx olarak adlandırdım.
Örnek 6: Tüm Dosyaları Bir Klasörden Başka Bir Klasöre Kopyalayın
Aşağıdaki kod, Kaynak klasördeki tüm dosyaları hedef klasöre kopyalayacaktır.
Sub CopyAllFiles() MyFSO As FileSystemObject Dim MyFile Dosya Olarak Dim SourceFolder Dize Dim DestinationFolder As String Dim MyFolder Klasör Olarak Dim MySubFolder SourceFolder = "C:\Users\sumit\Desktop\Source" Hedef\User = "C: sumit\Desktop\Destination" Set MyFSO = New Scripting.FileSystemObject Set MyFolder = MyFSO.GetFolder(SourceFolder) MyFolder.Files'daki Her MyFile İçin MyFSO.CopyFile Source:=MyFSO.GetFile(MyFile), _ Destination:=DestinationFolder "\DestinationFolder " & MyFile.Name, Overwritefiles:=False Next MyFile End Sub
Yukarıdaki kod, Kaynak klasördeki tüm dosyaları Hedef Klasöre kopyalayacaktır.
MyFSO.CopyFile yönteminde, 'Overwritefiles' özelliğini False olarak belirlediğimi unutmayın (bu, varsayılan olarak True'dur). Bu, dosyanın zaten klasörde olması durumunda kopyalanmamasını sağlar (ve bir hata görürsünüz). 'Overwritefiles' öğesini kaldırırsanız veya bunu True olarak ayarlarsanız, hedef klasörde aynı ada sahip dosyalar olması durumunda bunların üzerine yazılır.
Profesyonel İpucu: Dosyaları kopyalarken, her zaman dosyaların üzerine yazma olasılığı vardır. Bu durumda, adla birlikte zaman damgasını eklemek iyi bir fikirdir. Bu, adların her zaman farklı olmasını sağlar ve hangi dosyaların ne zaman kopyalandığını kolayca takip edebilirsiniz.Yalnızca belirli bir uzantının dosyalarını kopyalamak istiyorsanız, uzantının xlsx olup olmadığını kontrol etmek için bir IF Then ifadesi kullanarak bunu yapabilirsiniz.
Sub CopyExcelFilesOnly() MyFSO'yu FileSystemObject Olarak Dim Dim MyFile Dosya Olarak Dim SourceFolder Dize olarak Dim DestinationFolder As String olarak Dim MySubFolder As Folder SourceFolder = "C:\Users\sumit\Desktop\Source"\C:\Us =ers " sumit\Desktop\Destination" Set MyFSO = New Scripting.FileSystemObject Set MyFolder = MyFSO.GetFolder(SourceFolder) MyFolder.Files'daki Her MyFile İçin MyFSO.GetExtensionName(MyFile) = "xlsx" ise, MyFSO. (MyFile), _ Destination:=DestinationFolder & "\" & MyFile.Name, Overwritefiles:=False End If Next MyFile End Sub
FileSystemObject (FSO) Yöntemleri
İşte her nesne için kullanabileceğiniz yöntemler. Bu sadece referans amaçlıdır ve bu konuda çok fazla endişelenmez. Bunlardan bazılarının kullanımı yukarıda ele alınan örneklerde gösterilmiştir.
FSO Yöntemleri | Nesne için | Tanım |
DriveExists | Sürmek | Sürücünün var olup olmadığını kontrol eder |
GetDrive | Sürmek | Belirtilen yola dayalı olarak sürücü nesnesinin bir örneğini döndürür |
GetDriveName | Sürmek | Sürücü adını yeniden çalıştırır |
Yapı Yolu | Dosya klasörü | Mevcut bir yoldan ve bir addan bir yol oluşturun |
Dosya kopyala | Dosya klasörü | Bir dosyayı kopyalar |
GetMutlakYolAdı | Dosya klasörü | Yolun kurallı gösterimini döndür |
GetBaseName | Dosya klasörü | Bir yoldan temel adı döndürür. Örneğin, “D:\TestFolder\TestFile.xlsm”, TextFile.xlsm döndürür |
GetTempName | Dosya klasörü | Geçici bir dosyayı adlandırmak için kullanılabilecek ad üret |
Kopya klasörü | Dosya | Bir klasörü bir konumdan diğerine kopyalar |
Klasör oluşturun | Dosya | Yeni bir klasör oluşturur |
Klasörü Sil | Dosya | Belirtilen klasörü siler |
KlasörVar | Dosya | Klasörün var olup olmadığını kontrol eder |
GetFolder | Dosya | Belirtilen yola dayalı olarak klasör nesnesinin bir örneğini döndürür |
GetParentKlasörAdı | Dosya | Belirtilen yola dayalı olarak üst klasörün adını yeniden çalıştırır |
GetSpecialFolder | Dosya | Çeşitli sistem klasörlerinin konumunu alın. |
MoveFolder | Dosya | Bir klasörü bir konumdan diğerine taşır |
Dosyayı sil | Dosya | Bir dosyayı siler |
Dosya var | Dosya | Bir dosyanın var olup olmadığını kontrol eder |
GetExtensionName | Dosya | Dosya uzantısını döndürür |
Dosyayı al | Dosya | Belirtilen yola dayalı olarak bir dosya nesnesinin örneğini döndürür |
GetFileName | Dosya | Dosya adını döndürür |
GetFileVersion | Dosya | Dosya sürümünü döndürür |
Dosyayı taşı | Dosya | Bir dosyayı taşır |
CreateTextFile | Dosya | Bir metin dosyası oluşturur |
GetStandardStream | Dosya | Standart giriş, çıkış veya hata akışını alın |
OpenTextFile | Dosya | Bir dosyayı TextStream olarak açın |