Kad programmā Excel izmantojam VBA, lielākā daļa no tā ir mūsu uzdevumu automatizācija.
Tas nozīmē arī to, ka lielākoties mēs strādājam ar šūnām un diapazoniem, darblapām, darbgrāmatām un citiem objektiem, kas ir daļa no programmas Excel.
Bet VBA ir daudz jaudīgāka, un to var izmantot arī, lai strādātu ar materiāliem ārpus Excel.
Šajā apmācībā es parādīšu, kā izmantot VBA FileSystemObject (FSO), lai strādātu ar failiem un mapēm jūsu sistēmā vai tīkla diskos.
Kas ir VBA FileSystemObject (FSO)?
FileSystemObject (FSO) ļauj piekļūt datora failu sistēmai. Izmantojot to, jūs varat piekļūt un modificēt datorsistēmas failus/mapes/direktorijus.
Piemēram, zemāk ir dažas lietas, ko varat darīt, izmantojot programmu FileSystemObject programmā Excel VBA:
- Pārbaudiet, vai pastāv fails vai mape.
- Izveidojiet vai pārdēvējiet mapes/failus.
- Iegūstiet visu mapē esošo failu nosaukumu (vai apakšmapes nosaukumu) sarakstu.
- Kopējiet failus no vienas mapes uz citu.
Ceru, ka sapratāt ideju.
Visus šos iepriekš minētos piemērus (kā arī citus) es apskatīšu vēlāk šajā apmācībā.
Lai gan dažas no iepriekš minētajām lietām var izdarīt arī, izmantojot tradicionālās VBA funkcijas (piemēram, funkciju DIR) un metodes, tas novestu pie garākiem un sarežģītākiem kodiem. FileSystemObject atvieglo darbu ar failiem un mapēm, vienlaikus saglabājot kodu tīru un īsu.
Piezīme. FSO var izmantot tikai programmā Excel 2000 un jaunākās versijās.
Kādiem visiem objektiem varat piekļūt, izmantojot FileSystemObject?
Kā jau minēju iepriekš, varat piekļūt failiem un mapēm un tās mainīt, izmantojot FileSystemObject VBA.
Zemāk ir tabula, kurā parādīti vissvarīgākie objekti, kuriem varat piekļūt un kurus var mainīt, izmantojot FSO:
Objekts | Apraksts |
Braukt | Diska objekts ļauj iegūt informāciju par disku, piemēram, vai tas pastāv vai nav, tā ceļa nosaukumu, diska veidu (noņemams vai fiksēts), tā lielumu utt. |
Mape | Mapes objekts ļauj izveidot vai modificēt mapes savā sistēmā. Piemēram, jūs varat izveidot, dzēst, pārdēvēt, kopēt mapes, izmantojot šo objektu. |
Fails | Failu objekts ļauj strādāt ar failiem jūsu sistēmā. Piemēram, izmantojot šo objektu, varat izveidot, atvērt, kopēt, pārvietot un dzēst failus. |
TextStream | TextStream objekts ļauj izveidot vai lasīt teksta failus. |
Katram no iepriekš minētajiem objektiem ir metodes, kuras varat izmantot, lai ar tām strādātu.
Lai sniegtu piemēru, ja vēlaties izdzēst mapi, izmantojiet objekta Folder metodi DeleteFolder. Līdzīgi, ja vēlaties kopēt failu, izmantojiet objekta File metodi CopyFile.
Neuztraucieties, ja tas šķiet satriecoši vai grūti saprotami. Jūs iegūsit daudz labāku izpratni, apskatot piemērus, kurus esmu apskatījis šajā apmācībā.
Tikai atsauces nolūkos šīs apmācības beigās esmu aptvēris visas FileSystemObject metodes (katram objektam).
FileSystemObject iespējošana programmā Excel VBA
FileSystemObject nav pieejams pēc noklusējuma programmā Excel VBA.
Tā kā mēs strādājam ar failiem un mapēm, kas atrodas ārpus lietojumprogrammas Excel, mums vispirms ir jāizveido atsauce uz bibliotēku, kurā atrodas šie objekti (diski, faili, mapes).
Tagad ir divi veidi, kā sākt lietot FileSystemObject programmā Excel VBA:
- Atsauces iestatīšana uz Microsoft skriptu izpildlaika bibliotēku (Scrrun.dll)
- Objekta izveidošana atsaucei uz bibliotēku no paša koda
Lai gan abas šīs metodes darbojas (un es jums parādīšu, kā to izdarīt tālāk), es iesaku izmantot pirmo metodi.
Piezīme. Iespējojot FileSystemObject, varat piekļūt visiem tajā esošajiem objektiem. Tas ietver FileSystemObject, Drive, Files, Folders uc. Šajā apmācībā es galvenokārt koncentrēšos uz FileSystemObject.Atsauces iestatīšana uz Microsoft skriptu izpildlaika bibliotēku
Veidojot atsauci uz skriptu izpildlaika bibliotēku, jūs atļaujat programmai Excel VBA piekļūt visiem failu un mapju rekvizītiem un metodēm. Kad tas ir izdarīts, varat atsaukties uz failu/mapju/disku objektu no Excel VBA (tāpat kā uz šūnām, darblapām vai darbgrāmatām).
Tālāk ir norādītas darbības, lai izveidotu atsauci uz Microsoft skriptu izpildlaika bibliotēku.
- VB redaktorā noklikšķiniet uz Rīki.
- Noklikšķiniet uz Atsauces.
- Atvērtajā dialoglodziņā Atsauces ritiniet pieejamās atsauces un atzīmējiet opciju “Microsoft skriptu izpildlaiks”.
- Noklikšķiniet uz Labi.
Iepriekš minētās darbības ļaus jums atsaukties uz FSO objektiem no Excel VBA.
FileSystemObject instances izveide kodā
Kad esat iestatījis atsauci uz Scripting FileSystemObject bibliotēku, savā kodā ir jāizveido FSO objekta gadījums.
Kad tas ir izveidots, varat to izmantot VBA.
Zemāk ir kods, kas objekta mainīgo MyFSO iestatīs kā FileSystemObject objektu:
Sub CreatingFSO () Dim MyFSO kā FileSystemObject Set MyFSO = New FileSystemObject End Sub
Šajā kodā vispirms esmu deklarējis mainīgo MyFSO kā FileSystemObject tipa objektu. Tas ir iespējams tikai tāpēc, ka esmu izveidojis atsauci uz Microsoft skriptu izpildlaika bibliotēku. Ja atsauce netiek izveidota, tas radīs kļūdu (jo Excel neatpazīs, ko nozīmē FileSystemObject).
Otrajā rindā notiek divas lietas:
- Jauns atslēgvārds izveido FileSystemObject gadījumu. Tas nozīmē, ka tagad es varu izmantot visas FileSystemObject metodes, lai strādātu ar failiem un mapēm. Ja neveidojat šo gadījumu, jūs nevarēsit piekļūt FSO metodēm.
- Atslēgvārds SET iestata objektu MyFSO uz šo jauno FileSystemObject gadījumu. Tas ļauj man izmantot šo objektu, lai piekļūtu failiem un mapēm. Piemēram, ja man jāizveido mape, es varu izmantot MyFSO.CreateFolder metodi.
Ja vēlaties, varat arī apvienot divus iepriekš minētos apgalvojumus vienā, kā parādīts zemāk:
Sub CreatingFSO () Dim MyFSO kā jauns FileSystemObject End Sub
Liels ieguvums no šīs metodes izmantošanas (tas ir, norādīt atsauci uz Microsoft skriptu izpildlaika bibliotēku) ir tā, ka, izmantojot kodā esošos FSO objektus, jūs varēsit izmantot IntelliSense līdzekli, kas parāda metodes un rekvizītus, kas saistīti ar objekts (kā parādīts zemāk).
Tas nav iespējams, ja izveidojat atsauci no koda (apskatīts tālāk).
Objekta izveide no koda
Vēl viens veids, kā izveidot atsauci uz FSO, ir to izdarīt, izmantojot kodu. Šajā metodē jums nav jāizveido nekāda atsauce (kā tas tika darīts iepriekšējā metodē).
Rakstot kodu, jūs varat izveidot objektu no koda un skatīt sadaļu Scripting.FileSystemObject.
Zemāk esošais kods izveido objektu FSO un pēc tam padara to par FileSystemObject tipu.
Sub FSODemo () Dim FSO kā objektu kopa FSO = CreateObject ("Scripting.FileSystemObject") beigas
Lai gan tas varētu šķist ērtāk, šīs metodes izmantošanas lielais mīnuss ir tas, ka, strādājot ar objektiem FSO, tā nerādītu IntelliSense. Man tas ir milzīgs negatīvs, un es vienmēr iesaku izmantot iepriekšējo FSO iespējošanas metodi (kas ir, norādot atsauci uz “Microsoft skriptu izpildlaiku”)
VBA FileSystemObject piemēri
Tagad ienirsim un apskatīsim dažus praktiskus FileSystemObject izmantošanas piemērus programmā Excel.
1. piemērs: pārbaudiet, vai pastāv fails vai mape
Šis kods pārbaudīs, vai mape ar nosaukumu “Test” pastāv vai ne (norādītajā vietā).
Ja mape pastāv, IF nosacījums ir Patiess un ziņojumu lodziņā tiek parādīts ziņojums “Mape pastāv”. Un, ja tas neeksistē, tas parāda ziņojumu - mape nepastāv ”.
Sub CheckFolderExist () Dim MyFSO kā FileSystemObject Set MyFSO = New FileSystemObject If MyFSO.FolderExists ("C: \ Users \ sumit \ Desktop \ Test") Tad MsgBox "Mape pastāv" Cits MsgBox "Mape neeksistē" Beigas, ja beigas Sub
Līdzīgi varat arī pārbaudīt, vai fails pastāv vai ne.
Zemāk esošais kods pārbauda, vai norādītajā mapē ir fails ar nosaukumu Test.xlsx.
Sub CheckFileExist () Dim MyFSO kā FileSystemObject Set MyFSO = New FileSystemObject If MyFSO.FileExists ("C: \ Users \ sumit \ Desktop \ Test \ Test.xlsx") Tad MsgBox "Fails pastāv" Cits MsgBox "Fails neeksistē "Beigt, ja beidz apakš
2. piemērs: izveidojiet jaunu mapi norādītajā vietā
Zemāk esošais kods manas sistēmas C diskā izveidotu mapi ar nosaukumu “Test” (jums būs jānorāda sistēmas ceļš, kurā vēlaties izveidot mapi).
Sub CreateFolder () Dim MyFSO kā FileSystemObject Set MyFSO = New FileSystemObject MyFSO.CreateFolder ("C: \ Users \ sumit \ Desktop \ Test") Beigu apakšdaļa
Lai gan šis kods darbojas labi, tas parādītu kļūdu, ja mape jau pastāv.
Zemāk esošais kods pārbauda, vai mape jau pastāv, un izveido mapi, ja tā nav. Ja mape jau pastāv, tā parāda ziņojumu. Lai pārbaudītu, vai mape pastāv, es izmantoju FolderExists metode FSO.
Sub CreateFolder () Dim MyFSO kā FileSystemObject Set MyFSO = New FileSystemObject Ja MyFSO.FolderExists ("C: \ Users \ sumit \ Desktop \ Test"), tad MsgBox "Mape jau pastāv" Cits MyFSO.CreateFolder ("C: \ Users \ sumit \ Desktop \ Test ") End If End Sub
3. piemērs: iegūstiet visu mapē esošo failu sarakstu
Zemāk esošais kods parādītu visu norādītajā mapē esošo failu nosaukumus.
Apakš GetFileNames () Dim MyFSO kā FileSystemObject Dim MyFile kā fails Dim MyFolder kā mape Iestatīt MyFSO = New Scripting.FileSystemObject Set MyFolder = MyFSO.GetFolder ("C: \ Users \ sumit \ Desktop \ Test") katram MyFile mapē MyFolder.Files Atkļūdot. Drukāt MyFile. Nosaukums Nākamais MyFile End Sub
Šis kods ir nedaudz sarežģītāks par tiem, kurus mēs jau esam redzējuši.
Kā es minēju iepriekš šajā apmācībā, atsaucoties uz “Microsoft skriptu izpildlaika bibliotēku”, varat izmantot FileSystemObject, kā arī visus citus objektus (piemēram, failus un mapes).
Iepriekš minētajā kodā es izmantoju trīs objektus - FileSystemObject, File un Folder. Tas ļauj man apskatīt katru failu norādītajā mapē. Pēc tam es izmantoju rekvizītu name, lai iegūtu visu failu nosaukumu sarakstu.
Ņemiet vērā, ka es izmantoju Debug.Print, lai iegūtu visu failu nosaukumus. Šie vārdi tiks uzskaitīti VB redaktora tūlītējā logā.
4. piemērs: iegūstiet visu mapē esošo apakšmapi sarakstu
Zemāk esošais kods sniegs visu norādītās mapes apakšmapju nosaukumus. Loģika ir tieši tāda pati kā iepriekš minētajā piemērā. Failu vietā šajā kodā esam izmantojuši apakšmapes.
Apakš GetSubFolderNames () Dim MyFSO kā FileSystemObject Dim MyFile kā File Dim MyFolder kā mape Dim MySubFolder kā mapju kopa MyFSO = New Scripting.FileSystemObject Set MyFolder = MyFSO.GetFolder ("C: \ Users \ sumit \ Desktop My Test") Programmā MyFolder.SubFolders Debug. Izdrukāt MySubFolder.Name Next MySubFolder End Sub
5. piemērs: kopējiet failu no vienas vietas uz citu
Zemāk esošais kods kopēs failu no mapes “Avots” un nokopēs to mapē “Galamērķis”.
Sub CopyFile () Dim MyFSO kā FileSystemObject Dim SourceFile kā virkne Dim DestinationFolder kā virkne Iestatīt MyFSO = New Scripting.FileSystemObject SourceFile = "C: \ Users \ sumit \ Desktop \ Source \ SampleFile.xlsx" DestinationFolder = "C: \ Users \ sumit \ Desktop \ Destination "MyFSO.CopyFile Avots: = SourceFile, Destination: = DestinationFolder &" \ SampleFileCopy.xlsx "beigu apakšdaļa
Iepriekš minētajā kodā esmu izmantojis divus mainīgos - SourceFile un DestinationFolder.
Avota failā ir tā faila adrese, kuru es vēlos kopēt, un mainīgajam DestinationFolder ir adrese mapei, kurā es vēlos failu kopēt.
Ņemiet vērā, ka, kopējot failu, nepietiek norādīt galamērķa mapes nosaukumu. Jums arī jānorāda faila nosaukums. Varat izmantot to pašu faila nosaukumu vai arī to mainīt. Iepriekš minētajā piemērā es nokopēju failu un nosaucu to par SampleFileCopy.xlsx
6. piemērs. Kopējiet visus failus no vienas mapes uz citu
Zemāk esošais kods kopēs visus failus no mapes Avots uz mērķa mapi.
Sub CopyAllFiles () Dim MyFSO kā FileSystemObject Dim MyFile kā File Dim SourceFolder kā virkne Dim DestinationFolder Kā virkne Dim MyFolder kā mape Dim MySubFolder As Folder SourceFolder = "C: \ Users \ sumit \ Desktop \ Source" DestinationFolder = "C: \ Users \ sumit \ Desktop \ Destination "Set MyFSO = New Scripting.FileSystemObject Set MyFolder = MyFSO.GetFolder (SourceFolder) Katram MyFile mapē MyFolder.Files MyFSO.CopyFile Avots: = MyFSO.GetFile (MyFile), _ Mērķis: =" Destination: = " "& MyFile.Name, Overwritefiles: = False Next MyFile End Sub
Iepriekš minētais kods kopēs visus failus no mapes Avots uz galamērķa mapi.
Ņemiet vērā, ka MyFSO.CopyFile metodē rekvizītu “Pārrakstīt failus” esmu norādījis kā False (tas pēc noklusējuma ir True). Tas nodrošina, ka gadījumā, ja fails jau ir mapē, tas netiek kopēts (un jūs redzēsit kļūdu). Ja noņemsit “Pārrakstīt failus” vai iestatāt to uz Patiess, ja galamērķa mapē ir faili ar tādu pašu nosaukumu, tie tiks pārrakstīti.
Pro padoms: Kopējot failus, vienmēr pastāv iespēja failus pārrakstīt. Laba ideja šajā gadījumā ir pievienot laika zīmogu kopā ar nosaukumu. Tas nodrošinās, ka nosaukumi vienmēr ir atšķirīgi, un jūs varat viegli izsekot, kuri faili kādā laikā tika kopēti.Ja vēlaties kopēt tikai noteikta paplašinājuma failus, varat to izdarīt, izmantojot IF IF paziņojumu, lai pārbaudītu, vai paplašinājums ir xlsx.
Sub CopyExcelFilesOnly () Dim MyFSO kā FileSystemObject Dim MyFile kā File Dim SourceFolder kā String Dim DestinationFolder Kā String Dim MyFolder kā Folder Dim MySubFolder As Folder SourceFolder = "C: \ Users \ sumit \ Desktop \ Source" DestinationFolder = "C: \ Us: sumit \ Desktop \ Destination "Iestatīt MyFSO = New Scripting.FileSystemObject Set MyFolder = MyFSO.GetFolder (SourceFolder) Katram MyFile mapē MyFolder.Files If MyFSO.GetExtensionName (MyFile) =" xlsx "Tad MyFSO.CopyFileGet: (MyFile), _ Destination: = DestinationFolder & "\" & MyFile.Name, Overwritefiles: = False End if Next MyFile End Sub
FileSystemObject (FSO) metodes
Šeit ir metodes, kuras varat izmantot katram objektam. Tas ir tikai atsauces nolūkos un par to pārāk neuztraucas. Dažu to izmantošana ir parādīta iepriekš apskatītajos piemēros.
FSO metodes | Objektam | Apraksts |
DriveExists | Braukt | Pārbauda, vai disks ir vai nav |
GetDrive | Braukt | Atgriež diska objekta gadījumu, pamatojoties uz norādīto ceļu |
GetDriveName | Braukt | Atkārto diska nosaukumu |
BuildPath | Failu mape | Izveidojiet ceļu no esoša ceļa un nosaukuma |
CopyFile | Failu mape | Kopē failu |
GetAbsolutePathName | Failu mape | Atgrieziet ceļa kanonisko attēlojumu |
GetBaseName | Failu mape | Atgrieziet bāzes nosaukumu no ceļa. Piemēram, “D: \ TestFolder \ TestFile.xlsm” atgriezīs TextFile.xlsm |
GetTempName | Failu mape | Ģenerējiet nosaukumu, ko var izmantot pagaidu faila nosaukšanai |
CopyFolder | Mape | Kopē mapi no vienas vietas uz citu |
CreateFolder | Mape | Izveido jaunu mapi |
DeleteFolder | Mape | Izdzēš norādīto mapi |
FolderExists | Mape | Pārbauda, vai mape pastāv vai nav |
GetFolder | Mape | Atgriež mapes objekta gadījumu, pamatojoties uz norādīto ceļu |
GetParentFolderName | Mape | Atkārtoti palaiž vecāku mapes nosaukumu, pamatojoties uz norādīto ceļu |
GetSpecialFolder | Mape | Iegūstiet dažādu sistēmas mapju atrašanās vietu. |
MoveFolder | Mape | Pārvieto mapi no vienas vietas uz citu |
Izdzēst failu | Fails | Dzēš failu |
FileExists | Fails | Pārbauda, vai fails ir vai nav |
GetExtensionName | Fails | Atgriež faila paplašinājumu |
GetFile | Fails | Atgriež faila objekta gadījumu, pamatojoties uz norādīto ceļu |
GetFileName | Fails | Atgriež faila nosaukumu |
GetFileVersion | Fails | Atgriež faila versiju |
MoveFile | Fails | Pārvieto failu |
CreateTextFile | Fails | Izveido teksta failu |
GetStandardStream | Fails | Iegūstiet standarta ievadi, izvadi vai kļūdu straumi |
OpenTextFile | Fails | Atveriet failu kā TextStream |