Korištenje FileSystemObject u Excelu VBA

Korištenje FileSystemObject (FSO) u Excelu VBA

FileSystemObject (FSO) daje vam pristup čitavom nizu funkcija za pristup datotečnom sustavu vašeg računala. Pomoću ovog objekta možete jednostavno pristupiti datotekama, mapama i pogonima te čitati i pisati u datoteke.

Mnoge od funkcija FSO -a mogli biste napisati u tradicionalnom VBA -u, ali bi zahtijevali više kodiranja, a dolazećem programeru bi bilo teže održavati i razumjeti. FSO je iskušani API (Application Programming Interface) i pouzdaniji je od vašeg vlastitog koda. Jednostavan je za upotrebu, spreman i dostupan.

FSO radi prema međunarodnim standardima i postavkama koje imate na računalu. Ako svoju Excel aplikaciju distribuirate globalno, korištenje FSO -a pobrinut će se za sve razlike u postavkama između zemalja, što bi vaš vlastiti kôd imao problema.

FSO će vam omogućiti da učinite gotovo sve u VBA kodu što biste mogli učiniti u Windows File Exploreru. Omogućuje vam potpuni pristup datotečnom sustavu Windows.

Stvaranje FileSystemObject

FileSytemObject nije dio programa Excel VBA. FSO možete koristiti stvaranjem objekta (kasno vezivanje) u VBA:

123 Sub CreateFSO ()Postavi MyFSO = CreateObject ("Scripting.FileSystemObject")Kraj podm

Alternativno, možete dodati referencu u VBA za knjižnicu FSO. To se naziva rano vezivanje i brže je od kasnog vezivanja, jer objekt ne mora biti kreiran tijekom izvođenja koda.

Da biste dodali referencu, trebate pritisnuti Alt-F11 za ulazak u uređivač Visual Basic (VBE), a zatim upotrijebiti 'Alati | Reference' s izbornika VBE. Ovo će prikazati skočni prozor za odabir relevantne reference (vidi dolje).

Pomaknite se prema dolje na popisu dostupnih referenci dok ne vidite "Microsoft Scripting Runtime". Označite okvir i kliknite U redu, a biblioteka je sada dio vaše aplikacije.

Mjesto datoteke biblioteke DLL je C: \ Windows \ SysWOW64 \ scrrun.dll

Ako svoju aplikaciju distribuirate drugim kolegama ili lokacijama, važno je da imaju ovu datoteku na ispravnom mjestu na svom računalu, u protivnom će doći do pogreške u vašem kodu.

Vrijedi staviti zamku pogreške u događaj ‘WorkbookOpen’ pomoću naredbe Dir da biste provjerili postoji li datoteka. Ako ga nema, pošaljite poruku upozorenja i zatvorite Excel datoteku.

Nakon što je referenca dodana, možete koristiti sljedeći kôd za stvaranje FSO -a:

123 Pod TestFSO ()Zatamnite MyFSO kao novi FileSystemObjectKraj podm

Svi primjeri u ovom članku će koristiti ovu metodologiju za stvaranje FSO -a.

FSO ima na raspolaganju mnoge metode i svojstva. Ovdje su podijeljeni u odjeljke ovisno o tome što mogu učiniti.

Korištenjem metoda "Postoji"

Pomoću metode FSO možete provjeriti postoji li pogon, mapa ili datoteka. Ove su metode jednostavne za uporabu i zahtijevaju samo jedan parametar.

123456 Sub CheckExistance ()Zatamnite MyFSO kao novi FileSystemObjectMsgBox MyFSO.DriveExists ("C:")MsgBox MyFSO.FolderExists ("C: \ temp \")MsgBox MyFSO.FileExists ("C: \ temp \ testfile.txt")Kraj podm

Ove će izjave vratiti vrijednost "True" pod pretpostavkom da vaše računalo ima C: pogon, mapu na njoj pod nazivom "Temp" i datoteku u mapi Temp pod nazivom "testfile.txt"

Tekstualni nizovi u parametrima ne razlikuju velika i mala slova. Niti u jednoj od ovih metoda ne možete koristiti zamjenske znakove.

Također ne možete koristiti URL -ove (Uniform Resource Locators) za opisivanje mape ili lokacije datoteke. FSO radi isključivo na Windows operativnom sustavu i datotečnom sustavu na njemu. Za mjesto vanjskog poslužitelja morate prije svega mapirati pogon na to, a zatim upotrijebiti samu putanju pogona.

Korištenjem metoda 'Get'

FSO ima brojne metode za dobivanje informacija o datoteci i putanji, bilo podjelom putanje i datoteke, bilo dobivanjem podataka o datoteci ili mapi kao što je datum kreiranja ili datum izmjene.

GetAbsolutePathname

To će osigurati potpuni put od korijena navedenog pogona.

Sintaksa je:

GetAbsolutePathName (pathspec)

12345 Sub AbsolutePath ()Zatamni MyFSO kao novi FileSystemObject, Pth kao nizPth = "c: …"MsgBox MyFSO.GetAbsolutePathName (Pth)Kraj podm

Ovo će vratiti niz "C: \ Users \ Richard \ Documents". To je zato što je put naveden kao C: nakon čega slijede tri točke. Svaka točka označava sljedeću razinu unutar strukture mape.

GetBaseName

Ovo vraća naziv određene datoteke ili mape.

Sintaksa je:

GetBaseName(staza)

12345 Pod osnovno ime ()Zatamni MyFSO kao novi FileSystemObject, Pth kao nizPth = "C: \ temp \ testfile.txt"MsgBox MyFSO.GetBaseName (Pth)Kraj podm

Ovaj kôd će vratiti "testfile". Metoda vraća posljednji odjeljak u imenu staze. Ako se radi o datoteci, tada ne vraća sufiks datoteke.

Ako se put ne može pronaći, bit će vraćen prazan niz.

GetDrive

To vam omogućuje korištenje koda za pristup informacijama o pogonu, na temelju navedenog slova pogona.

Sintaksa je:

GetDrive (driverspec)

123456 Sub DriveInfo ()Zatamnite MyFSO kao novi FileSystemObject, Pth kao niz, Dr kao pogonPth = "C:"Postavite Dr = MyFSO.GetDrive (Pth)MsgBox Dr.FreeSpaceKraj podm

Ova metoda vraća objekt pogona na temelju navedenog pogona. Ovaj objekt možete koristiti za pristup informacijama o pogonu, poput slobodnog prostora.

Umorni ste od traženja primjera VBA koda? Isprobajte AutoMacro!

GetDriveName

Ova metoda odvojit će naziv pogona od niza puta / naziva datoteke.

Sintaksa je:

GetDriveName (staza)

12345 Sub DriveName ()Zatamni MyFSO kao novi FileSystemObject, Pth kao nizPth = "C: \ temp \ testfile.txt"MsgBox MyFSO.GetDriveName (Pth)Kraj podm

Ovo će vratiti "C:"

GetExtensionName

Ovo će vratiti sufiks datoteke na navedenoj putanji.

Sintaksa je:

GetExtensionName (staza)

12345 Ime dodatnog proširenja ()Zatamni MyFSO kao novi FileSystemObject, Pth kao nizPth = "C: \ temp \ testfile.txt"MsgBox MyFSO.GetExtensionName (Pth)Kraj podm

Ovo će vratiti "txt".

Ako nije navedena datoteka, bit će vraćen prazan niz.

GetFile

Ova metoda vraća objekt datoteke koji sadrži različite podatke o samoj datoteci.

Sintaksa je:

GetFile (filespec)

123456 Sub FileInfo ()Zatamnite MyFSO kao novi FileSystemObject, Pth kao niz, Fn kao datotekuPth = "C: \ temp \ testfile.txt"Postavite Fn = MyFSO.GetFile (Pth)MsgBox Fn.DateCreatedKraj podm

Ovo će vratiti datum i vrijeme kada je navedena datoteka stvorena. Ako nije navedena datoteka ili datoteka ne postoji, dobit ćete pogrešku "datoteka nije pronađena".

12345 Podnaziv datoteke ()Zatamni MyFSO kao novi FileSystemObject, Pth kao nizPth = "C: \ temp \ testfile.txt"MsgBox MyFSO.GetFileName (Pth)Kraj podm

Ovo će vratiti "testfile.txt".

GetFolder

Time se stvara objekt mape za osnovnu mapu na navedenoj putanji. Put mora sadržavati samo nazive mapa. Imena datoteka ne smiju biti uključena jer će u protivnom doći do pogreške.

Sintaksa je:

GetFolder (folderspec)

123456 PodfolderInfo ()Zatamnite MyFSO kao novi FileSystemObject, Pth kao niz, Fo kao mapuPth = "C: \ temp"Postavi Fo = MyFSO.GetFolder (Pth)MsgBox Fo.DateCreatedKraj podm

Objekt mape sadrži različite informacije kojima se može pristupiti. U tom slučaju vraća datum kada je mapa stvorena.

Ovu metodu možete koristiti i za dohvaćanje svih naziva datoteka unutar određene mape:

12345678 Podnazivi datoteka ()Zatamni MyFSO kao novi FileSystemObject, Pth kao niz, Fo kao mapu, Fn kao datotekuPth = "C: \ temp"Postavi Fo = MyFSO.GetFolder (Pth)Za svaki Fn In Fo.DatotekeMsgBox Fn.NameSljedeći FnKraj podm

Ovaj kôd će ponavljati kroz mapu "Temp" i prikazivati ​​svaki pronađeni naziv datoteke.

GetParentFolderName

Ova metoda vraća naziv mape na sljedećoj razini u hijerarhiji mapa.

Sintaksa je:

GetParentFolderName (staza)

12345 Naziv podmape ()Zatamnite MyFSO kao novi FileSystemObject, Pth kao niz, Fo kao mapuPth = "C: \ korisnici \ richard"MsgBox MyFSO.GetParentFolderName (Pth)Kraj podm

Ovo će vratiti "Korisnici" jer je ovo "roditelj" za mapu "richard".

VBA programiranje | Generator koda radi za vas!

Korištenjem metoda 'Stvori'

S FSO -om možete stvoriti novu mapu i put te stvoriti tekstualnu datoteku.

CreateFolder

Možete odrediti novi naziv putanje mape za stvaranje. Opasnost od toga je da će, ako mapa već postoji, doći do pogreške. Možete se poslužiti metodom "FolderExists" kako biste bili sigurni da se to neće dogoditi.

Sintaksa je:

CreateFolder(ime datoteke)

1234567 Sub CreateNewFolder ()Zatamni MyFSO kao novi FileSystemObject, Pth kao nizPth = "C: \ temp \ MyFolder"Ako je MyFSO.FolderExists (Pth) = Netočno TadaMyFSO.CreateFolder (Pth)Završi akoKraj podm

Ovaj će kôd stvoriti novu mapu pod nazivom "Moja mapa" pod postojećom stazom "C: \ temp".

CreateTextFile

Ova vam metoda omogućuje stvaranje jednostavne tekstualne datoteke i pisanje izravno u nju.

Sintaksa je:

CreateTextFile (naziv datoteke, [ prebrisati, [ unicode ]])

1234567 Sub CreateTextFile ()Zatamni MyFSO kao novi FileSystemObject, Pth kao nizPth = "C: \ temp \ Myfile.txt"Postavi Fn = MyFSO.CreateTextFile (Pth, True)Fn.Write "Dodaj moj vlastiti tekst ovdje" & vbLf & "Ovo je drugi redak"Fn.ZatvoriKraj podm

Ovaj kôd stvara tekstualnu datoteku pod nazivom "Myfile.txt" u mapi "Temp" pogona "C:", a zatim u nju zapisuje dva retka teksta.

Imajte na umu da je znak unosa retka spojen u niz koji se upisuje.

Ako put na koji pišete ne postoji, doći će do pogreške. To možete provjeriti prije stvaranja datoteke pomoću metode ‘FolderExists’.

Postoji izborni parametar za prepisivanje postojeće datoteke ako je potrebno - to može biti Tačno ili Netačno. Zadana je vrijednost True.

Korištenjem metoda 'Kopiraj'

Pomoću ovih metoda možete kopirati datoteku ili mapu na drugo mjesto.

VBA programiranje | Generator koda radi za vas!

CopyFile

Ova metoda kopira datoteku s jedne lokacije mape na drugu. Imajte na umu da kopiranje neće uspjeti ako odredišno mjesto ima postavljen atribut samo za čitanje.

Sintaksa je:

CopyFile izvor, odredište, [ prebrisati ]

1234 Sub CopyFile ()Zatamnite MyFSO kao novi FileSystemObjectMyFSO.CopyFile "C: \ temp \*. Txt", "C: \ temp \ myfolder \", IstinaKraj podm

Ovaj kôd će kopirati sve tekstualne (txt) datoteke u "C: \ temp" u "C: \ temp \ myfolder \", prepisujući datoteku gdje je to potrebno. Zadana postavka za Overwrite je True.

Za nazive datoteka možete koristiti zamjensku zvjezdicu (*), ali ne možete koristiti zamjenski znak upitnika (?) Za predstavljanje pojedinačnih znakova.

CopyFolder

Ovu metodu možete koristiti za kopiranje cijele mape s jednog mjesta na drugo.

Sintaksa je:

CopyFolder izvor, odredište, [ prebrisati ]

1234 Mapa podkopiranja ()Zatamnite MyFSO kao novi FileSystemObjectMyFSO.CopyFolder "C: \ temp \*", "C: \ users \ richard \"Kraj podm

Ovaj kôd kopira sve mape i datoteke ispod "C: \ temp" u "C: \ users \ richard". Nova će mapa biti "C: \ users \ richard \ myfolder" jer je "C: \ temp" u sebi imala mapu pod nazivom "myfolder".

Postoje četiri moguća ishoda korištenjem ove metode:

  • Ako odredište ne postoji, tada se izvorna mapa i sadržaj kopiraju.
  • Ako odredište već postoji, dolazi do pogreške.
  • Ako je odredište mapa, tada će se izvorna mapa i njezin sadržaj kopirati. Pogreška će se dogoditi ako je Overwrite postavljeno na False, a na odredištu već postoji kopija datoteke.
  • Ako je odredište postavljeno samo za čitanje, doći će do pogreške ako je prepisivanje postavljeno na Netačno.

Ova se metoda zaustavlja pri prvoj pogrešci na koju naiđe. Ne postoji vraćanje niti jedne radnje koja je uspjela prije nego što se pogreška dogodi.

Korištenjem metoda 'Premjesti'

Ove se metode mogu koristiti za premještanje datoteka ili mapa na druga mjesta. To je isto kao rezanje s jednog mjesta i lijepljenje na drugo mjesto. Imajte na umu da ako je datoteka za premještanje otvorena, tada metoda Move neće uspjeti s pogreškom.

Premjesti datoteku

Ova metoda se koristi za premještanje određene datoteke na drugo mjesto. Zamjenski znakovi dopušteni su u posljednjoj komponenti puta izvora.

Sintaksa je:

Premjesti datoteku izvor, odredište

1234 Sub MoveAFile ()Zatamnite MyFSO kao novi FileSystemObjectMyFSO.MoveFile "C: \ temp \*", "C: \ temp \ myfolder"Kraj podm

Ovaj kôd premješta sve datoteke koje se nalaze na "C: \ temp" u "C: \ temp \ myfolder".

Mape izvora i odredišta moraju postojati jer se odredišna mapa ne stvara automatski.

Ova se metoda zaustavlja pri prvoj pogrešci na koju naiđe. Ne postoji vraćanje niti jedne radnje koja je uspjela prije nego što se pogreška dogodi.

VBA programiranje | Generator koda radi za vas!

Premjesti mapu

Ova metoda premješta određenu mapu s jednog mjesta na drugo.

Sintaksa je:

Premjesti mapu (izvor, odredište)

1234 Sub MoveAFolder ()Zatamnite MyFSO kao novi FileSystemObjectMyFSO.MoveFolder "C: \ temp \ myfolder", "C: \ temp \ mydestination"Kraj podm

Ovaj kôd premješta mapu "moja mapa" i sadržaj u mapu "moje odredište". 'Myfolder' učinkovito se briše i stvara se 'mydestination' zajedno sa sadržajem iz 'myfolder'.

Ako odredišna mapa već postoji, dolazi do pogreške.

Korištenjem metoda 'Izbriši'

Ove se metode koriste za brisanje datoteka ili mapa. Moraju se koristiti oprezno jer nema metoda vraćanja ili poništavanja ako nešto pođe po zlu.

Izbrisati dateoteku

Time se brišu pojedinačne datoteke ili skupina datoteka pomoću zamjenskih znakova.

Sintaksa je:

Izbrisati dateoteku filespec, [ sila ]

1234 Sub DeleteFiles ()Zatamnite MyFSO kao novi FileSystemObjectMyFSO.DeleteFile "C: \ temp \*"Kraj podm

Ovaj kôd će izbrisati sve datoteke u mapi 'C: \ temp'

Parametar Force nije obavezan i postavljen je na True ili False. Ako je postavljeno na True, tada će se datoteke samo za čitanje izbrisati. Zadana je vrijednost Netačno.

Izbriši mapu

Ova metoda briše navedenu mapu i njezin sadržaj.

Sintaksa je:

Izbriši mapu folderspec, [ sila ]

1234 Podbriši mape ()Zatamnite MyFSO kao novi FileSystemObjectMyFSO.DeleteFolder "C: \ temp \ MyDestination"Kraj podm

Ovaj će kôd izbrisati mapu "Moje odredište" i sve datoteke u toj mapi. Mapa "temp" će ostati.

Parametar Force nije obavezan i postavljen je na True ili False. Ako je postavljeno na True, tada će se mape samo za čitanje izbrisati. Zadana je vrijednost Netačno.

Zamjenski znakovi mogu se koristiti u posljednjoj komponenti puta. Ako mapa nije pronađena, doći će do pogreške.

Ova se metoda zaustavlja pri prvoj pogrešci na koju naiđe. Ne postoji vraćanje niti jedne radnje koja je uspjela prije nego što se pogreška dogodi.

VBA programiranje | Generator koda radi za vas!

Ostale metode u FSO -u

OpenAsTextStream.

Ova metoda otvara navedenu datoteku kao objekt tekstualnog toka i omogućuje joj čitanje ili pisanje. Prednost ove metode je što može otvoriti bilo koju vrstu datoteke i izdvojiti dostupan tekst.

Sintaksa je:

OpenAsTextStream ([ iomode, [ format ]])

Parametar ‘iomode’ omogućuje samo čitanje (1), čitanje/pisanje (2) i dodavanje (8). Parametar čitanje/pisanje prepisuje datoteku.

Parametar "format" postavljen je na -2 za zadane postavke sustava, -1 za otvaranje datoteke kao Unicode i 0 za otvaranje datoteke kao ASCII (američki standardni kod za razmjenu informacija).

1234567891011 Podtekstni tok ()Zatamnite MyFSO kao novi FileSystemObjectPostavite f = MyFSO.GetFile ("C: \ temp \ myfile.txt")Postavi ts = f.OpenAsTextStream (2)ts.Napiši "Moj novi tekst"ts.ZatvoritePostavi ts = f.OpenAsTextStream (1)s = ts.ReadLineMsgBox sts.ZatvoriteKraj podm

Ovaj kôd dobiva postojeću tekstualnu datoteku i stvara je kao objekt pomoću metode 'GetFile'. Zatim otvara tok teksta kao čitanje / pisanje (2) i zapisuje redak teksta. Datoteka se zatim zatvara i ponovno otvara kao pročitana (1) te se iz nje čita redak koji se zatim prikazuje kao okvir s porukom.

Imajte na umu da se redak za čitanje mora staviti u varijablu prije nego što se može prikazati u okviru za poruku.

BuildPath

Ova metoda će dodati naziv mape ili datoteke na kraj postojeće putanje mape. Ovo stvara samo tekstualni niz, a zapravo ne stvara novu mapu.

Sintaksa je:

BuildPath (staza, Ime)

12345 Sub BuildPth ()Zatamnite MyFSO kao novi FileSystemObjectnp = MyFSO.BuildPath ("C: \ temp", "ANewFolder")MsgBox npKraj podm

Ovo će prikazati "C: \ temp \ ANewFolder". Međutim, ako zaista želite koristiti ovu mapu, morate upotrijebiti metodu 'CreateFolder'.

OpenTextFile

Ova metoda omogućuje otvaranje i čitanje datoteka ili pisanje datoteka prema postavljenim parametrima. Djeluje na sličan način kao metoda OpenAsTextStream.

Sintaksa je:

OpenTextFile (naziv datoteke, [ iomode, [ stvoriti, [ format ]]])

Parametar ‘iomode’ omogućuje ForReading, ForWriting i ForAppending. Parametar ForWriting prepisuje datoteku.

Parametar 'create' je Booleova vrijednost. True znači da će se nova datoteka stvoriti ako navedeni naziv datoteke ne postoji. Netačno znači da se datoteka neće stvoriti ako naziv datoteke nije pronađen. Zadana je vrijednost Netačno.

Parametar "format" može se postaviti na TristateFalse, TristateMixed, TristateTrue i TristateUseDefault, ovisno o tome je li datoteka ASCII ili Unicode.

1234567 Sub OpenTxtFile ()Zatamnite MyFSO kao novi FileSystemObjectPostavi ts = MyFSO.OpenTextFile ("C: \ temp \ myfile.txt", ForReading, False, TristateUseDefault)s = ts.ReadLineMsgBox sts.ZatvoriteKraj podm

Ovaj će kôd čitati redak iz tekstualne datoteke "myfile.txt".

Prednost koju metoda OpenTextFile ima u odnosu na OpenAsTextStreamMethod je ta što ima padajuće izbornike za parametre, koji su značajniji od pokušaja pamćenja odgovarajućih numeričkih vrijednosti za različite opcije parametara.

VBA programiranje | Generator koda radi za vas!

Svojstva FSO -a

Pogoni

Ovo svojstvo sadrži zbirku dostupnih pogona na vašem računalu.

1234567 Poddrv ()Zatamnite MyFSO kao novi FileSystemObject, d Kao pogonPostavite Dr = MyFSO.DrivesZa svaki d U Dr.MsgBox d.DriveLetterDalje dKraj podm

Ovaj kôd će vratiti svako slovo pogona dostupno na vašem računalu.

Ime

Ovo vraća naziv određene datoteke ili mape.

123456789 Primjer podimena ()Zatamnite MyFSO kao novi FileSystemObjectPostavite f = MyFSO.GetFile ("C: \ temp \ myfile.txt")i = f.Name & "on Drive" & UCase (f.Drive) & vbCrLfi = i & "Kreirano:" & f.DateCreated & vbCrLfi = i & "Posljednji pristup:" & f.DateLastAccessed & vbCrLfi = i & "Posljednja izmjena:" & f.DateLastModifiedMsgBox iKraj podm

Ovaj kôd će dati naziv datoteke i podatke o njoj pomoću svojstva Disk.

Staza

Svojstvo Path odvojit će put od specifikacije datoteke.

123456789 Primjer pod putanje ()Zatamnite MyFSO kao novi FileSystemObjectPostavite f = MyFSO.GetFile ("C: \ temp \ myfile.txt")i = f.Path & f.Name & "na disku" & UCase (f.Drive) & vbCrLfi = i & "Kreirano:" & f.DateCreated & vbCrLfi = i & "Posljednji pristup:" & f.DateLastAccessed & vbCrLfi = i & "Posljednja izmjena:" & f.DateLastModifiedMsgBox iKraj podm

Ovaj primjer radi na isti način kao i primjer imena, samo što sada pruža put do datoteke.

VBA programiranje | Generator koda radi za vas!

Veličina

Svojstvo Size dat će veličinu mape ili datoteke.

12345 Pod FS veličina ()Zatamnite MyFSO kao novi FileSystemObjectPostavite f = MyFSO.GetFolder ("C: \ temp \")MsgBox f. VeličinaKraj podm

Ovaj gornji kôd će vratiti veličinu mape ‘C: \ temp \’.

12345 Pod FS veličina ()Zatamnite MyFSO kao novi FileSystemObjectPostavite f = MyFSO.GetFile ("C: \ temp \ myfile.txt")MsgBox f. VeličinaKraj podm

Ovaj gornji kôd vratit će veličinu datoteke 'myfile.txt'.

Tip

Svojstvo type vratit će tekst za vrstu datoteke ili mape.

12345 Podvrsta FType ()Zatamnite MyFSO kao novi FileSystemObjectPostavite f = MyFSO.GetFolder ("C: \ temp \")MsgBox f.TipKraj podm

Ovaj gornji kôd će vratiti tekst "Mapa datoteka".

12345 Podvrsta FType ()Zatamnite MyFSO kao novi FileSystemObjectPostavite f = MyFSO.GetFile ("C: \ temp \ myfile.txt")MsgBox f.TipKraj podm

Ovaj gornji kôd će vratiti tekst "Tekstualni dokument".

Uočite primjenu "GetFolder" i "GetFile" u svakom primjeru.

Vi ćete pomoći u razvoju web stranice, dijeljenje stranicu sa svojim prijateljima

wave wave wave wave wave