Din punct de vedere al prelucrărilor vba, fişierele sunt de două categorii



Yüklə 461 b.
tarix06.09.2018
ölçüsü461 b.



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

    • instrucţiunea Open
  • citire/scriere

    • diverse instrucţiuni, care vor fi discutate în continuare
  • închidere

    • instrucţiunea Close


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

  • 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




Yüklə 461 b.

Dostları ilə paylaş:




Verilənlər bazası müəlliflik hüququ ilə müdafiə olunur ©muhaz.org 2020
rəhbərliyinə müraciət

    Ana səhifə