Dezvoltarea aplicațiilor vba în excel

Creați o aplicație care monitorizează
pentru utilizarea componentelor proiectului

Aici ne concentrăm atenția asupra altor aspecte legate de crearea de aplicații finalizate bazate pe Excel pe exemplul unui alt program real.







În dezvoltarea de diverse aplicații, acumulați mai multe componente reutilizabile și este nevoie de mult timp pentru a le monitoriza. De exemplu, cum să determinați ce fișier este utilizat în proiectul OBJobAgent - SPREAD.VBX sau noua sa versiune SSVBX25.VBX? Unde se utilizează modulul OBORD32 - în proiectul OBSuper sau în legătură cu proiectul AvailAgent? Există multe astfel de întrebări.

Pentru a facilita gestionarea componentelor reutilizabile, se folosesc depozite de cod sursă, dar multe organizații mici nu lucrează cu ele. Ca o soluție "simplificată", vă recomandăm să utilizați Excel 97 pentru a crea tabele pivot care reflectă utilizarea componentelor în orice proiect.

Fișierele proiectului VB sunt fișiere obișnuite ASCII care conțin căile și numele fișierelor care alcătuiesc proiectul. Înainte de versiunea VB 3.0 inclusiv, descrierea proiectului a fost stocată în fișierele MAK și a inclus o listă destul de simplă a numelor componentelor (a se vedea Lista 1). De la VB4, acest fișier a primit extensia VBP, iar compoziția și structura informațiilor stocate în acesta s-au modificat semnificativ (a se vedea Listing 2).

Listarea 1. Fragmentul unui fișier tipic MAK
în VB3 conține o listă a componentelor proiectului

Listarea 2. Un fragment al unui fișier tipic VBP din VB5 care conține o listă a componentelor proiectului.

C: \ WINDOWS \ SYSTEM \ STDOLE2.TLB # Tipuri standard OLE

C: \ SOFTURI DE PROGRAM \ FILME COMUNE \ MICROSOFT SHARED \ DC: \ PROGRAM _

Ideea pe care o vom întrupa este aceasta. De lucru în Excel, descoperim în mod constant ne interesează în fișierele de proiect și de a crea un tabel cu toate componentele utilizate în aceste aplicații, și apoi utilizați aceste informații pentru a crea un tabel de sinteză finală (vezi. Fig. 1) Această problemă poate fi rezolvată în mai multe moduri. De exemplu, puteți scrie procedurile necesare pe VB5 și puteți apela Excel ca server ActiveX. Cu toate acestea, aici arătăm cum să scriem aceste proceduri în mediul Excel propriu zis, folosind VBA.

NOTĂ. Să nu confundați cititorii cu titlul "Count of File" din Fig. Ne-am dorit în mod special să demonstrăm posibilele probleme de limbă atunci când se face o cerere în limba rusă în versiunea în limba engleză a suitei de birouri - în acest caz, cuvintele în limba engleză sunt generate automat de comandantul de creare a tabelelor sumare.

Crearea propriilor proceduri

PASUL 1. Începeți Excel, denumiți noul proiect PivotVBP.xls și mergeți la mediul de dezvoltare VB (Alt + F11). Creați un nou modul BAS (comanda Insert | Module) și denumiți și PivotVBP (în câmpul Nume din fereastra Proprietăți).

Acum, începeți să scrieți codul pentru acest modul (codul final este afișat în listare 3). Rețineți că puteți crea proceduri noi fie utilizând comanda Insert | Procedure, fie tastând prima linie a antetului procedurii (Sub ProcedureName) direct în fereastra cu codul modulului.

Listarea 3. Textul modulului de cod PivotVBP.

Atribut VB_Name = "PivotVBP"

"Setarea anteturilor tabelului

"LoadProjectFile formează sursa

'Tabela de componente și returnează rezultatul

Dacă LoadProjectFile Apoi "există cel puțin un proiect

'Formarea unui tabel rezumativ

Dacă FileType $ <> "" Atunci "este specificată componenta

'Evidențierea numelui fișierului din plin

Apelați FileNameTest (FileN $, Path $, Nume fișier $)

"Adăugați o descriere a componentei (proiect, tip, nume

'Fișier') în colecția Fișiere

Files.Add Array (Project $, FileType $, Nume fișier $), txt $

Vom scrie codul de proceduri pe principiul "de sus în jos" - metoda clasică de programare structurată - de la un nivel ridicat de componente la unul inferior. Corectitudinea acestei abordări a fost dovedită de mult timp - este necesar să ne gândim la cel puțin alți dezvoltatori care vor înțelege apoi programele noastre, le vor adapta sau le vor folosi în proiectele lor. Dar, deplasând "de sus în jos", trebuie să vă amintiți mereu componentele finite ale nivelului inferior, care va constitui în mare parte baza aplicației.

PASUL 2. Mai întâi scrieți procedura CreateVBProjCrossRef, care este capul pentru întreaga noastră aplicație. Mai întâi setează anteturile care vor fi folosite în sursă și apoi în tabelele pivot. Apoi accesează funcția LoadProjectFile. în care se formează tabelul inițial al componentelor aplicației. Dacă funcția returnează True, înseamnă că acest tabel a fost creat pentru cel puțin un proiect. În acest caz, se numește o subrutină, care construiește o tabelă pivot.

PASUL 3. Procedura SetUpHeadings utilizează obiectul Selection al foii de calcul active active pentru a atribui numele de coloane. Rețineți că metoda Offset este utilizată pentru a vă deplasa spre dreapta atunci când umpleți anteturile pentru a doua și a treia coloană și pentru a selecta celula din prima coloană a primului rând sub rubrici.

Un contra-argument destul de comun împotriva programării de sus în jos este considerat că aceasta împiedică depanarea treptată - aplicația poate fi executată numai după executarea întregului cod. Cu toate acestea, o astfel de teză este incorectă: de fapt, depanarea pas cu pas este ușor de realizat prin utilizarea unei varietăți de "stubs" (goale sau implementate într-o versiune simplificată a procedurilor).

Rețineți, de asemenea, că atunci când rulați în mediul VBA atunci când executați aplicația de execuție (Run / F5), controlul este transferat către componenta (în acest caz procedura), care este în prezent în fereastra activă a mediului. Deci, înainte de a apăsa F5, setați cursorul de text în fereastra de cod la procedura CreateVBProjCrossRef.







PASUL 4. Se scrie procedura LoadProjectFile, cheia pentru intregul proiect este formarea tabelului de componente originale. Funcționează într-o buclă, referindu-se la o casetă de dialog standard pentru a determina numele unui fișier existent (Figura 2). În acest scop, metoda GetOpenFilename a obiectului Application și extensiile .MAK și .VBP sunt utilizate pentru a identifica fișierele proiectului. Dacă utilizatorul, în loc să selecteze un fișier (butonul Deschidere), apasă Anulare, formarea tabelului se termină și funcția returnează True sau False la programul de apel, în funcție de faptul dacă a fost selectat sau nu cel puțin un proiect.

Tipul fișierului selectat (MAK sau VBP) poate fi determinat prin extinderea numelui acestuia. Dar aici o facem diferit: fișierul de proiect este deschis și semnul de egalitate din prima linie este verificat (a se vedea listele 1 și 2). Rețineți că în cazul unui fișier MAK, trebuie să setați indicatorul de citire / scriere din fișier la începutul fișierului pentru a ține cont de prima linie atunci când creați lista de componente.

După aceasta, procedura corespunzătoare se numește LoadMAK sau LoadVBP pentru a încărca informații din fișierul proiect în colecția de fișiere și apoi a pune această informație din colecția de fișiere într-o foaie de calcul. Rețineți că primul ciclu este Pentru. Apoi, ea arata prin colectia Files, iar al doilea ciclu este For. Următorul este un tablou care conține informații detaliate pentru fiecare fișier.

PASUL 5. Se scrie codul procedurii LoadMAK, LoadVBP și FilesAdd. Diferența dintre procedurile LoadMAK și LoadVBP este modul în care tipul de componentă este identificat în liniile fișierului descrierea proiectului. În primul caz, acest lucru se face folosind extensia de nume de fișier, în al doilea caz, utilizând cuvântul cheie de la începutul liniei. Ambele proceduri utilizează subrutina auxiliară FilesAdd, în care sunt selectate numele scurt al fișierului și descrierea descrierii sale în colecția Fișiere.

ANUNȚ IMPORTANT. Pentru a efectua unele operații atunci când procesăm fișierele de caractere MAK și VBP, am folosit procedurile create anterior ParseString și FileNameTest, care au fost folosite în diferite aplicații VB. Ele sunt scrise în modulele PARSESUB.BAS și INSTRREV.BAS, respectiv. Descărcați-le în aplicația pe care o creăm într-un mediu Excel / VBA utilizând comanda File | Import File, dar ar trebui să aveți în vedere o circumstanță foarte importantă.

BAS-modul, astfel încât încărcat în Office / VBA (acest lucru se aplică Cuvântului, și Excel), își pierde în mod automat relația logică relevante BAS-fișierele stocate pe disc, și devine pur o componentă internă a aplicației. Aceasta este una dintre diferențele semnificative dintre logica utilizării modulelor BAS în VB și VBA convenționale. În cel de-al doilea caz (cu care ne confruntăm acum, lucrăm în Excel 97), modificările efectuate în fișierul BAS nu au niciun efect asupra stării modulului BAS încărcat și invers.

În consecință, dacă vrem să folosim câteva module generate în VBA în viitoarele noastre aplicații, atunci trebuie să le scriem pe disc folosind comanda specială File | Export. Astfel, înlocuirea numelor comenzilor pentru citirea / scrierea modulelor Add / Save în Import / Export reflectă de fapt diferențele în mecanismul de lucru cu module.

După descărcarea și modulele PARSESUB.BAS INSTRREV.BAS vom vedea că în Excel / VBA au primit nume triviale Module1 și Module2. O astfel de înlocuire a numelor pare a fi pasul potrivit, deoarece - repetăm ​​din nou - acestea sunt deja alte componente care nu au legătură cu fișierele părinte. În acest sens, opțiunea dezvoltată în Word 97, atunci când numele unității interioare este atribuit numele fișierului original (strict vorbind nici măcar numele fișierului, precum și numele în prima linie Atribut fișier VB_Name - dacă există), nu este foarte bun, deoarece creează iluzia unei clare corespondența dintre cele două componente.

PASUL 6. Având în vedere toate acestea, după descărcarea și PARSESUB.BAS INSTRREV.BAS (comanda File | Import File) module, care sunt transformate în componente Module1 și Module2 proiectul nostru, vom efectua următoarele operații. Copiați textul procedurii ParseString de la Modul1 la Modul (selectați textul, apoi scrieți-l în clipboard și restaurați-l de acolo). Apoi ștergeți modulul 1 (nu avem nevoie de procedurile rămase), iar modulul 2 va fi redenumit în Service (consultați Lista 4).

Listarea 4. Textul modulului Codul de serviciu

Atribut VB_Name = "Service"

Sub FileNameTest (PathFile $, Cale $, Fișier $)

'Input: PathFile $ - numele fișierului complet

'Exit: Calea $ este numele directorului

'Fișierul $ este numele fișierului

pos2 - pos - Len (del $)))

ElseIf n> 1 Apoi

ParseString = "" al doilea element nu a fost găsit

Crearea unui PivotTable

Începem crearea procedurii CreatePivotTable, care generează un tabel rezumativ bazat pe tabela de componente originale. Așa cum vom vedea acum, codul de program al acestei proceduri este destul de mic, dar scrierea manuală este destul de obositoare. Prin urmare, este mai bine să utilizați expertul Pivot Table și apoi să modificați codul generat într-o formă mai generală.

PASUL 8. Să trecem la mediul Excel astfel încât foaia de calcul originală creată de noi să fie vizibilă pe ecran (a se vedea Figura 3). Setați modul macro de înregistrare utilizând comanda Instrumente | Macro | Înregistrare nouă macro (cuvântul Înregistrare apare în bara de stare). Lăsați numele macro-ului creat propus în mod implicit. Apoi, utilizând comanda Data | PivotTable Report, porniți Expertul Creare PivotTable, care va oferi în mod consecvent patru operații utilizând casetele de dialog afișate de acesta.

În prima fereastră, lăsați opțiunea implicită pentru a crea o tabelă pivot - lista Microsoft Excel sau baza de date - și faceți clic pe Următorul (Figura 4). Următorul pas va fi, de asemenea, trecut, fără a schimba nimic.

Al treilea pas este cel mai important: formarea structurii tabelului rezumativ. O casetă de dialog cu o diagramă a tabelului va apărea pe ecran (figura 5).

În partea dreaptă sunt formate trei butoane, care corespund celor trei coloane ale foii de calcul actuale. Numele butoanelor sunt conținutul celulelor primului rând din tabel, care sunt interpretate ca nume de coloane. Tragând numele butoanelor din dreapta, formăm tabelul prezentat în Fig. 6.

Pentru aceasta, numele "Proiect" trebuie plasat în câmpul "COLUMN", "Type" și "File" - în "ROW".

Ultimul, al patrulea pas va trece și fără a schimba nimic (va fi folosit comutatorul pentru foaia de lucru nouă) - făcând clic pe butonul Terminare. Vom avea o masă master creată de vrăjitor. Acum opriți modul de înregistrare macro - Instrumente | Macro | Oprire înregistrare.

PASUL 9. Să revenim la mediul VBA. Acolo, în fereastra proiectului, vedem că avem un nou modul și, în el, o procedură de acest fel:

ActiveSheet.PivotTableWizard SourceType: = xlDatabase, _

RowFields: = Array ("Tip", "Fișier"), _

Copiați-l în modulul nostru principal PivotVBP, redenumiți-l la CreatePivotTable și eliminați modulul1 din proiect. În codul de mai sus, puteți vedea că prima linie utilizează o referință la un anumit interval de 16 linii. Pentru a utiliza această procedură pentru orice număr de rânduri, trebuie să adăugați doar două rânduri de cod pentru a selecta o celulă mai mare pe o linie. Procedând astfel, vom folosi metoda CurrentRegion a obiectului Selection pentru a selecta rânduri și coloane adiacente. De asemenea, trebuie să modificați argumentul SourceData = Selecție din metoda PivotTableWizard pentru a utiliza obiectul Selecție ca domeniu. Rezultatul activității noastre este afișat în listare 3.

PASUL 10. Asigurați-vă că aplicația noastră funcționează. Să executăm procedura CreateVBProjCrossRef. Apoi, selectând secvențial fișierele din fereastra "Descărcați fișierul proiectului VB", creați tabela originală a componentelor. Finalizați operațiunea de selectare a fișierelor făcând clic pe butonul Cansel din fereastră și veți vedea un tabel rezumativ al componentelor proiectelor VB.

Puteți scrie orice alte proceduri numai în modulele de cod. În acest proiect am creat două astfel de module - PivotVBP și Service. Prin distribuirea procedurilor între cele două module, am vrut să subliniem specificul subrutinelor. În PivotVBP există proceduri scrise exact ca parte a creării acestei aplicații și nu vedem încă aplicarea potențială a oricăruia dintre ele în alte proiecte. Iar aici în modulul Serviciu sunt scrise acele proceduri, pe care le-am pregătit de la dezvoltările anterioare.

Știați că atunci când unii cercetători care încearcă să reconcilieze relativismul și fizica eterică spun, de exemplu, că cosmosul constă în 70% din "vidul fizic" și 30% din materie și câmp, atunci acestea intră în contradicții logice fundamentale. Această contradicție este după cum urmează.

ȘTIRI ALE FORUMULUI
Cavalerii teoriei eterului







Trimiteți-le prietenilor: