VBA FileSystemObject (FSO) izmantošana programmā Excel - vienkāršs pārskats un piemēri

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:

  1. Atsauces iestatīšana uz Microsoft skriptu izpildlaika bibliotēku (Scrrun.dll)
  2. 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.

  1. VB redaktorā noklikšķiniet uz Rīki.
  2. Noklikšķiniet uz Atsauces.
  3. Atvērtajā dialoglodziņā Atsauces ritiniet pieejamās atsauces un atzīmējiet opciju “Microsoft skriptu izpildlaiks”.
  4. 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:

  1. 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.
  2. 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
wave wave wave wave wave