|
Din punct de vedere al prelucrărilor vba, fişierele sunt de două categorii
|
tarix | 06.09.2018 | ölçüsü | 461 b. | | #78146 |
|
din punct de vedere al prelucrărilor VBA, fişierele sunt de două categorii din punct de vedere al prelucrărilor VBA, fişierele sunt de două categorii - fişiere în formatul specific aplicaţiilor Office
- .doc(x) în Word, .xls(x) în Excel etc.
- fişiere utilizator
- accesate la nivel de caracter/octet/înregistrare
nu este recomandat accesul de nivel jos la fişierele din prima categorie - poate duce la coruperea acestora
similar altor limbaje similar altor limbaje deschidere citire/scriere - diverse instrucţiuni, care vor fi discutate în continuare
închidere
acces secvenţial acces secvenţial - moduri de dechidere: Input, Output, Append
- utilizat în special pentru fişiere text
acces aleator - mod de deschidere: Random
- permite accesul în orice punct al fişierului
- accesul se face la nivel de înregistrare
acces binar - mod de deschidere: Binary
- accesul se face la nivel de octet
în modurile Output, Append, Random şi Binary, dacă fişierul deschis nu există deja, este creat în modurile Output, Append, Random şi Binary, dacă fişierul deschis nu există deja, este creat modurile Input, Random şi Binary permit deschiderea unui fişier în mai multe moduri simultan - prin mai multe instrucţiuni Open diferite
- pentru celelalte moduri, fişierul trebuie închis şi apoi redeschis în alt mod
Open pathname For mode [Access access] [lock] As [#]filenumber [Len=reclength] Open pathname For mode [Access access] [lock] As [#]filenumber [Len=reclength] argumente - pathname: numele fişierului
- mode: modul de acces la fişier; implicit Random
- access: operaţiunile I/O permise pentru fişier
- valori posibile: Read, Write, Read Write
- lock: operaţiile asupra fişierului permise altor procese când fişierul este deschis
- valori posibile: Shared, Lock Read, Lock Write, Lock Read Write
argumente (continuare) argumente (continuare) - filenumber: identificatorul numeric asociat fişierului prin deschidere
- va fi utilizat în continuare de operaţiunile asupra fişierului
- următorul număr disponibil este obţinut prin apelul funcţiei FreeFile
- reclength: lungimea înregistrării în cazul accesului aleator, respectiv lungimea bufferului asociat fişierului în cazul accesului secvenţial
- nu are semnificaţie în cazul accesului binar
Write #filenumber, [outputlist] Write #filenumber, [outputlist] argumente - filenumber: identificatorul numeric asociat fişierului
- acesta trebuie să fie deja deschis
- outputlist: listă de expresii de tip numeric sau şir de caractere
elementele scrise sunt separate prin virgule, iar şirurile de caractere sunt incluse între ghilimele
instrucţiunea Write scrie la final combinaţia CR+LF (final de linie) instrucţiunea Write scrie la final combinaţia CR+LF (final de linie) scrierea diverselor tipuri de date - numeric: foloseşte punctul ca separator zecimal
- Boolean: #TRUE# sau #FALSE#
- dată/timp: #yyyy-mm-dd hh:mm:ss#
- dacă unele părţi sunt omise, pentru ele nu se afişează nimic
- Null: #NULL#
- Empty: nu se scrie nimic
- Error: #ERROR errorcode#
Print #filenumber, [outputlist] Print #filenumber, [outputlist] similară cu instrucţiunea Write permite un control mai precis al afişării din partea programatorului - nu sunt inseraţi separatori, iar şirurile de caractere nu sunt încadrate de ghilimele
în lista de expresii de afişat pot apărea şi - Spc, Spc(n) - inserează numărul indicat de spaţii
- Tab, Tab(n) - inserează numărul indicat de caractere Tab
Put [#]filenumber, [recnumber], varname Put [#]filenumber, [recnumber], varname argumente - filenumber: identificatorul numeric asociat fişierului
- recnumber: numărul înregistrării (modul Random) sau numărul octetului (modul Binary) unde începe scrierea
- prima poziţie este 1
- dacă nu este precizat, se scrie în poziţia curentă
- varname: numele variabilei a cărei valoare se scrie în fişier
Input #filenumber, varlist Input #filenumber, varlist argumente - filenumber: identificatorul numeric asociat fişierului
- varlist: listă de variabile în care se depun valorile citite din fişier
- numele variabilelor sunt delimitate prin virgulă
- nu pot fi: tablouri; obiecte din ierarhia Office
- pot fi: elemente de tablou; variabile din tipuri utilizator
utilizată în general pentru a citi date scrise cu instrucţiunea Write
valori primite de variabilele destinaţie în cazuri speciale valori primite de variabilele destinaţie în cazuri speciale - linie vidă: Empty
- #NULL#: Null
- #TRUE#/#FALSE#: True/False
- dată/timp: data/timpul corespunzătoare
- #ERROR errornumber#: numărul (codul) erorii
lucrează pe linii cu câmpuri clar delimitate - nu este recomandată pentru a citi date scrise cu instrucţiunea Print
Line Input #filenumber, varname Line Input #filenumber, varname argumente - filenumber: identificatorul numeric asociat fişierului
- varname: numele variabilei în care se preia şirul de caractere citit din fişier
utilizată pentru a citi date scrise cu instrucţiunea Print
Get [#]filenumber, [recnumber], varname Get [#]filenumber, [recnumber], varname argumentele sunt similare celor de la instrucţiunea Put cele două instrucţiuni sunt complementare
Seek [#]filenumber, position Seek [#]filenumber, position argumente - filenumber: identificatorul numeric asociat fişierului
- position: poziţia în cadrul fişierului a înregistrării sau octetului la care se va realiza următoarea operaţie de citire/scriere
- număr între 1 şi 2147483647
- instrucţiunile Get şi Put care precizează argumentul recnumber nu folosesc poziţia curentă
- poziţionare dincolo de sfârşitul fişierului - următoarea instrucţiune Put (fără recnumber) va extinde fişierul
Close Close - închide unul sau mai multe fişiere deschise prin instrucţiuni Open
- se pot indica unul sau mai multe identificatoare numerice de fişier
- dacă nu se indică nici un identificator, se închid toate fişierele deschise
Reset - închide toate fişierele deschise prin instrucţiuni Open
EOF EOF - returnează True atunci când
- se ajunge la sfârşitul fişierului (fişiere secvenţiale)
- ultima instrucţiune Get executată nu a putut citi o înregistrare întreagă (fişiere aleatoare sau binare)
- nu funcţionează corect la utilizarea instrucţiunii Input pe fişiere binare
LOF - returnează dimensiunea fişierului în octeţi
- pentru fişiere nedeschise există funcţia FileLen
Loc Loc - returnează poziţia curentă în fişier
- în funcţie de modul de acces
- secvenţial: poziţia curentă împărţită la 128
- aleator: numărul ultimei înregistrări scrise sau citite
- binar: poziţia ultimului octet citit sau scris
- poate fi utilizată împreună cu funcţia LOF pentru a determina când s-a ajuns la sfârşitul unui fişier binar
FileAttr FileAttr - returnează modul de deschidere al fişierului
- valori: 1 (Input), 2 (Output), 4 (Random), 8 (Append), 32 (Binary)
SetAttr, GetAttr - modifică/returnează atributele unui fişier
- valori corespunzătoare atributelor: vbNormal, vbReadOnly, vbHidden, vbSystem, vbDirectory, vbArchive
- pot fi setate mai multe atribute simultan
cooperarea între aplicaţii implică în principal transferul de date cooperarea între aplicaţii implică în principal transferul de date - prin intermediul fişierelor
- aplicaţiile Office nu-şi recunosc formatele de fişier proprii între ele
- există unele formate recunoscute de toate (text, CSV)
- prin Clipboard
- limitat, deoarece nu permite controlul precis al formatului datelor
- prin accesul la obiecte ActiveX
- permit comunicarea directă între aplicaţii
fiecare aplicaţie are biblioteci pentru propriile ierarhii de obiecte fiecare aplicaţie are biblioteci pentru propriile ierarhii de obiecte - dar aici se pune problema de a accesa ierarhiile altor aplicaţii
există bibliotecile necesare şi pentru accesul la celelalte aplicaţii - dar nu sunt disponibile în mod implicit
- trebuie stabilite corect referinţele în mediul VBE
meniurile VBE: Tools - References meniurile VBE: Tools - References - se alege din listă biblioteca dorită şi se bifează
- pot fi incluse mai multe biblioteci
- ex.: în Excel 2007 se alege Microsoft Word 12 Object Library
- evident, permite accesul la obiectele Word
atenţie - macrourile care folosesc acest mecanism de comunicare nu pot rula pe alte versiuni de Office
- deoarece conţin referinţe la alte versiuni ale bibliotecilor
- soluţie - preluarea codului prin clipboard şi rescrierea sa
odată încărcată biblioteca specifică altei aplicaţii, obiectele corespunzătoare pot fi utilizate în cod odată încărcată biblioteca specifică altei aplicaţii, obiectele corespunzătoare pot fi utilizate în cod - prefixate de numele aplicaţiei
- ex.: Word.Application
- funcţionează şi autocompletarea din mediul VBE
utilizarea prefixului este posibilă şi pentru obiectele aplicaţiei curente, dar nu e necesară - ex.: în Excel putem scrie Worksheet sau Excel.Worksheet, cu acelaşi efect
de fapt, putem accesa orice obiect pe baza numelui său, fără prefix de fapt, putem accesa orice obiect pe baza numelui său, fără prefix problema apare atunci când obiecte cu acelaşi nume sunt definite în aplicaţii diferite - care este cel folosit?
- bibliotecile sunt parcurse în ordinea în care sunt afişate în lista din meniul Tools - References
- se consideră primul obiect găsit astfel
- biblioteca aplicaţiei curente este întotdeauna plasată înaintea celor ale altor aplicaţii
se pot folosi direct tipurile definite în biblioteci se pot folosi direct tipurile definite în biblioteci crearea se face prin instrucţiunea Set, utilizând cuvântul-cheie New exemplu Dim xa As Excel.Application Set xa = New Excel.Application alternativ Dim xa As New Excel.Application - nu mai este necesară instrucţiunea Set
- dar nu avem control asupra momentului creării
există situaţii în care mecanismul anterior nu poate fi folosit există situaţii în care mecanismul anterior nu poate fi folosit - aplicaţia care se doreşte a fi lansată este instalată în reţea, nu pe maşina locală
- dorim să putem verifica dacă aplicaţia respectivă este disponibilă
- dorim să obţinem accesul la o instanţă deja existentă a aplicaţiei respective
- dorim să deschidem un fişier Office şi să obţinem o referinţă la aplicaţia cu care a fost deschis
CreateObject(class, [servername]) CreateObject(class, [servername]) parametri - class - şir de caractere conţinând numele aplicaţiei şi tipul obiectului creat
- servername - şir de caractere conţinând numele serverului pe care se va crea obiectul
- dacă parametrul este omis sau vid, obiectul va fi creat pe maşina locală
pentru obiectele înregistrate ca single-instance se va crea o singură instanţă, indiferent de numărul de apeluri CreateObject
se recomandă a se porni prin crearea obiectului Application corespunzător aplicaţiei dorite se recomandă a se porni prin crearea obiectului Application corespunzător aplicaţiei dorite - care de obicei este single-instance
- pornind de la acesta se pot crea obiectele de pe nivelele următoare, cu ajutorul metodelor specifice aplicaţiei respective
alternativ, se poate crea direct un obiect de nivel mai jos - implicit se va crea şi obiectul Application
- dar controlul asupra acestuia este problematic
din Word este creată o foaie de calcul Excel din Word este creată o foaie de calcul Excel se scrie valoarea 5 în celula A1 apoi foaia este salvată
Dim xls As Object Dim xls As Object Set xls = CreateObject("Excel.Sheet") xls.Application.Visible = True xls.Application.Cell(1, 1).Value = 5 xls.SaveAs "newfile.xlsx" accesul se realizează de multe ori prin intermediul obiectului Application - incomod ce se întâmplă cu aplicaţia Excel la terminarea macroului curent?
Dim xa As Excel.Application Dim xa As Excel.Application Dim xb As Excel.Workbook, xs As Excel.Worksheet Set xa = CreateObject("Excel.Application") Set xb = xa.Workbooks.Add Set xs = xb.Worksheets(1) xa.Visible = True xs.Cell(1, 1).Value = 5 xs.SaveAs "newfile.xlsx" accesul se realizează cât mai mult posibil prin metodele puse la dispoziţie de Excel
GetObject([pathname] [, class]) GetObject([pathname] [, class]) parametri - pathname - calea şi numele fişierului care conţine obiectul
- class - numele aplicaţiei şi tipul obiectului
lansează aplicaţia asociată cu fişierul precizat prin parametrul pathname şi activează obiectul corespunzător - pe baza parametrului class
- sau pe baza tipului de fişier indicat de pathname
dacă parametrul pathname este şirul vid, se returnează o nouă instanţă a obiectului indicat de parametrul class dacă parametrul pathname este şirul vid, se returnează o nouă instanţă a obiectului indicat de parametrul class dacă parametrul pathname este omis, se returnează obiectul activ din tipul indicat de parametrul class - sau se generează o eroare, dacă nu există nici un obiect activ din tipul respectiv
funcţiile CreateObject şi GetObject pot lucra fără a trebui stabilite referinţe la bibliotecile corespunzătoare aplicaţiilor utilizate funcţiile CreateObject şi GetObject pot lucra fără a trebui stabilite referinţe la bibliotecile corespunzătoare aplicaţiilor utilizate - dacă se lucrează cu variabile de tip Object
- late binding - tipul obiectelor este determinat la momentul execuţiei
dacă se lucrează cu variabile din tipurile specifice aplicaţiilor, referinţele sunt necesare - early binding - tipul obiectelor este determinat la momentul compilării
pentru aplicaţia nou creată este indicată setarea valorii True pentru proprietatea Visible pentru aplicaţia nou creată este indicată setarea valorii True pentru proprietatea Visible - altfel, la apariţia unei erori, aplicaţia devine inaccesibilă
în momentul în care aplicaţia nou creată şi-a îndeplinit sarcinile (inclusiv salvarea documentului creat) - va apela metoda Quit
- variabila care referă aplicaţia va primi valoarea Nothing
unele aplicaţii Office permit scrierea de cod care va fi apelat automat la crearea/deschiderea unui document unele aplicaţii Office permit scrierea de cod care va fi apelat automat la crearea/deschiderea unui document - Word: evenimentele Open, New asociate unui document
- Excel: evenimentul Open asociat unui caiet
uneori ne dorim ca un asemenea cod să nu ruleze la lansarea aplicaţiei prin program, de către altă aplicaţie
nu se poate interzice efectiv rularea codului asociat evenimentelor nu se poate interzice efectiv rularea codului asociat evenimentelor dar acesta poate fi scris astfel încât să ţină cont de modul în care a fost lansată aplicaţia se poate folosi proprietatea UserControl a obiectului Application - semnificaţia exactă a valorii sale poate fi uşor diferită în funcţie de aplicaţie
toate aplicaţiile Office au acces la biblioteca Microsoft Scripting Runtime toate aplicaţiile Office au acces la biblioteca Microsoft Scripting Runtime - pentru a putea fi folosită, trebuie setată în Tools - References
conţine două ierarhii de obiecte, având în vârf - Dictionary
- FileSystemObject
asemenea obiecte pot fi create - prin apelul funcţiei CreateObject
- prin instrucţiunea Set, folosind cuvântul-cheie New
structură de date care reţine perechi de tipul cheie-valoare structură de date care reţine perechi de tipul cheie-valoare metode/proprietăţi utile - Add
- Remove, RemoveAll
- Key
- Keys
- Item, Items
- Exists
Set dct = CreateObject("Scripting.Dictionary") Set dct = CreateObject("Scripting.Dictionary") dct.Add "a", "Item 1" dct.Add "b", "Item 2" k = dct.keys For i = 0 To dct.Count -1 MsgBox k(i) Next i If dct.Exists("c") Then dct.Remove("c") End If
permite accesul la fişiere şi directoare permite accesul la fişiere şi directoare obiecte subordonate (şi colecţii aferente) - Drive (Drives)
- Folder (Folders)
- File (Files)
- TextStream
pentru utilizarea metodelor specifice acestor obiecte, se recomandă consultarea sistemului de help
Set fs = New FileSystemObject Set fs = New FileSystemObject Set dc = fs.Drives For Each d In dc If d.IsReady Then s = s & d.DriveLetter & ": " n = d.FreeSpace s = s & CStr(n) & vbCrLf End If Next d MsgBox s
pot fi accesate prin intermediul bibliotecii Microsoft VBScript Regular Expressions - pentru a putea fi folosită, trebuie setată în Tools - References
- se recomandă includerea celei mai recente versiuni
această bibliotecă pune la dispoziţie obiectul RegExp
proprietăţi proprietăţi - Pattern
- reţine expresia regulată sub forma unui şir de caractere
- Global
- True - se doreşte găsirea tuturor potrivirilor în şirul în care se face căutarea
- False - se caută doar prima potrivire
- IgnoreCase
- False - se face diferenţa între literele mari şi mici
- MultiLine
- True - şirul în care se face căutarea are mai multe linii
metode metode - Test
- returnează True dacă s-a găsit cel puţin o potrivire
- Execute
- returnează un tablou cu informaţii despre potrivirile găsite
- Replace
- returnează un nou şir de caractere, în care potrivirile găsite sunt înlocuite cu un şir dat ca parametru
Set re = New RegExp Set re = New RegExp With re .Pattern = "[a-z]+" .Global = True .IgnoreCase = True .MultiLine = False End With Set e = re.Execute("ab3cd5ef") For Each f In e MsgBox(f.FirstIndex & " : " & f.Value) Next f
Dostları ilə paylaş: |
|
|