Lucrul cu diagrame

Următoarele secțiuni vă arată cum să utilizați VBA pentru a crea și a formata diagrame, fie ca foi de diagramă întregi într-un registru de lucru, fie ca obiecte într-o foaie de lucru existentă.

Crearea unei diagrame

VBA utilizează obiectul Chart pentru a reprezenta o diagramă dintr-o foaie de tip diagramă și obiectul ChartObject pentru a reprezenta o diagramă încorporată într-o foaie de lucru. Obiectul ChartObject conține un obiect Chart, pe care îl puteți manipula accesându-l prin obiectul ChartObject.

Într-o macrocomandă, crearea unei diagrame sau un obiect diagramă se face într-o ordine diferită de cea când lucrați interactiv și faceți lucrurile manual în Excel. Iată pașii pentru crearea în program a unei diagrame (prin intermediul codului macrocomenzii, nu interactiv - prin intermediul unui mouse și a tastaturii):

  1. Creați variabila obiect Chart.
  2. Instanțiați (aduceți la viață) obiectul Chart utilizând comanda Set.
  3. Specificați intervalul sursă pentru datele sale utilizând metoda SetSourceData.
  4. Specificarea tipului de diagramă utilizând proprietatea ChartType.
  5. Specificați orice alte elemente de care aveți nevoie.

Crearea unei diagrame pe o foaie nouă de tip diagramă

Pentru a crea o diagramă într-o foaie nouă de tip diagramă, utilizați metoda Add cu colecția Charts. Sintaxa este următoarea:

expression.Add(Before, After, Count, Type)

Iată componentele sintaxei:

  • expression este o expresie necesară care returnează o colecție Charts.
  • Before este un argument opțional de tip Variant pe care îl puteți utiliza pentru a specifica foaia înainte de care să adăugați noua foaie diagramă. After este un argument opțional de tip Variant pe care îl puteți utiliza pentru a specifica foaia după care să adăugați noua foaie. De obicei, veți utiliza fie Before, fie After. Dacă omiteți ambele argumente, VBA adaugă noua foaie diagramă înainte de foaia activă.
  • Count este un argument opțional de tip Variant pe care îl puteți utiliza pentru a specifica câte foi diagramă vor fi adăugate. Valoarea implicită este una.
  • Type este un argument opțional de tip Variant pe care îl puteți utiliza pentru a specifica ce fel de diagramă doriți. Alegerile sunt xlWorksheet, xlChart, xlExcel4MacroSheet și xlExcel4IntlMacroSheet. Valoarea implicită este xlWorksheet, astfel încât va trebui să specificați xlChart în următorul exemplu de cod, deoarece adaugă o diagramă, nu este o foaie de lucru obișnuită.

Următorul cod declară o variabilă obiect numită myChartSheet ca fiind de tip diagramă (o foaie de lucru diagramă) și apoi atribuie la myChartSheet o foaie diagramă nouă adăugată după ultima foaie existentă în registrul de lucru activ:

Dim myChartSheet As Chart
Set myChartSheet = ActiveWorkbook.Sheets.Add _
(After:=ActiveWorkbook.Sheets(ActiveWorkbook.Sheets.Count), _
Type:=xlChart)

Crearea unei diagrame într-o foaie de lucru existentă

Pentru a crea o diagramă într-o foaie de lucru existentă, utilizați metoda Add cu colecția ChartObjects. Sintaxa este următoarea:

expression.Add(Left, Top, Width, Height)

Iată componentele sintaxei:

  • expression este o expresie necesară care returnează o colecție ChartObjects.
  • Left este un argument necesar de tip Double (tip de variabilă) care specifică poziția colțului din stânga sus a diagramei în puncte față de marginea stângă a celulei A1.
  • Top este un argument necesar de tip Double care specifică poziția colțului din stânga sus a diagramei în puncte față de marginea superioară a celulei A1.
  • Width este un argument necesar de tip Double care specifică lățimea diagramei în puncte.
  • Height este un argument necesar de tip Double care specifică înălțimea diagramei în puncte.

De exemplu, următoarele declarații declară un obiect nou ChartObject numit myChartObject și atribuie noului obiect diagramă (zona diagramei) 400 de puncte lățime și 300 de puncte înălțime, poziţionat la 200 puncte față de marginea din stânga și la 200 de puncte față de marginea de sus a foii de lucru:

Dim myChartObject As ChartObject
Set myChartObject = ActiveSheet.ChartObjects.Add(Left:=200, Top:=200, _ 
  Width:=400, Height:=300) 

Pentru a lucra cu diagrama din ChartObject, returnați proprietatea Chart a obiectului ChartObject.

Specificarea datelor sursă (Source Data) pentru diagramă

Până în prezent, diagrama (din foaia diagramei sau din obiectul Chart) este goală. Pentru a-i da conținut, specificați datele sursă ale diagramei utilizând metoda SetSourceData a obiectului Chart. De exemplu, următoarea instrucțiune specifică intervalul A1:E5 din foaia de lucru denumită Chart Data din registrul de lucru activ ca date sursă ale obiectului Chart din obiectul ChartObject numit myChartObject:

myChartObject.Chart.SetSourceData Source:= _
ActiveWorkbook.Sheets("Chart Data").Range("A1:E5")

Specificarea unui tip de diagramă

Pentru a specifica un tip de diagramă, setați proprietatea ChartType a obiectului Chart. Excel oferă o varietate prea mare de diagrame pentru a o lista aici (73 de tipuri diferite), dar puteți identifica cu ușurință tipurile de diagrame din numele lor. De exemplu, constanta xl3DArea reprezintă tipul de diagramă 3D Area, xlColumnStacked reprezintă tipul de diagramă Stacked Column, iar xlDoughnut Exploded reprezintă tipul de diagramă Exploded Doughnut.

Următoarea instrucțiune setează tipul diagramei reprezentate de variabila obiect myChart la tipul Stacked Column:

myChart.ChartType = xlColumnStacked

Lucrul cu serii de date (Series) în diagramă

Pentru a lucra cu seria într-o diagramă, utilizați colecția SeriesCollection, care conține toate seriile din diagrama specificată.

Crearea unei serii noi

Pentru a crea o serie nouă, utilizați metoda NewSeries cu colecția SeriesCollection. De exemplu, următoarea instrucțiune adaugă o nouă serie la diagrama reprezentată de variabila obiect myChart:

myChart.SeriesCollection.NewSeries

Adăugarea unei serii noi

Pentru a adăuga o nouă serie la o colecție SeriesCollection, utilizați metoda Add cu obiectul SeriesCollection corespunzător. Sintaxa este următoarea:

expression.Add(Source, Rowcol, SeriesLabels, CategoryLabels, Replace)

Iată componentele sintaxei:

  • expression este o expresie necesară care returnează o colecție SeriesCollection.
  • Source este un argument necesar de tip Variant care specifică sursa datelor pentru noua serie. Puteți furniza datele fie ca zonă, fie ca o serie de puncte de date.
  • Rowcol este un argument opțional pe care îl puteți seta la xlRows pentru a specifica faptul că noile valori sunt pe rândurile din intervalul specificat, sau puteți utiliza setarea implicită, xlColumns, pentru a specifica faptul că noile valori sunt pe coloane. Dacă omiteți acest argument, Excel utilizează xlColumns.
  • SeriesLabels este un argument opțional de tip Variant pe care îl puteți seta la True pentru a specifica faptul că primul rând sau coloană din zona sursă conține etichetele seriei, sau setați la False pentru a specifica faptul că primul rând sau coloană din zona sursă conține primul punct de date pentru seriile de date. Dacă omiteți acest argument, Excel încearcă să stabilească dacă primul rând sau coloană conține o etichetă de serie. Cel mai bine este să specificați acest argument pentru a evita confuzia. Cu toate acestea, dacă Source este o matrice, VBA ignoră acest argument.
  • CategoryLabels este un argument opțional de tip Variant pe care îl puteți seta la True pentru a specifica faptul că primul rând sau coloană conține numele etichetelor categoriei, sau setați la False pentru a specifica faptul că nu le conține. Dacă omiteți acest argument, Excel încearcă să afle dacă primul rând sau coloană conține o etichetă de categorie. Cel mai bine este să specificați acest argument pentru a evita confuzia. Din nou, dacă Source este o matrice, VBA ignoră acest argument.
  • Replace este un argument opțional de tip Variant pe care îl puteți seta la True când CategoryLabels este True pentru a face categoriile să înlocuiască categoriile existente pentru serii, sau setați la False (valoarea implicită) pentru a preveni înlocuirea categoriilor existente.

Următoarea procedură reunește mai multe elemente utilizate în exemplele de cod anterioare din acest capitol. Acesta ilustrează modul de creare a unei diagrame complete și adăugarea unei serii noi la diagrama identificată de variabila obiect myChart. Procedura extrage datele din zona A4:K4 din foaia de lucru activă din registrul de lucru activ, utilizând rânduri:

Sub test()
Dim myChartObject As ChartObject
Dim MyChart As Chart
Set myChartObject = ActiveSheet.ChartObjects.Add(Left:=100, Top:=100, _ Width:=400, Height:=300)
Set MyChart = myChartObject.Chart
MyChart.ChartType = xlConeBarStacked
MyChart.SeriesCollection.Add _
Source:=ActiveSheet.Range("A4:K4"), Rowcol:=xlRows
End Sub

După executarea macrocomenzii de mai sus, va fi generată o diagramă pe baza datelor care se încadrează în intervalul specificat.

Extindrea unei serii existente

Pentru a extinde o serie existentă, utilizați metoda Extend cu obiectul SeriesCollection corespunzător. Sintaxa este următoarea:

expression.Extend(Source, Rowcol, CategoryLabels)

Iată componentele sintaxei:

  • expression este o expresie necesară care returnează un obiect SeriesCollection.
  • Source este un argument necesar de tip Variant care specifică sursa datelor pentru noua serie. Puteți furniza datele fie ca zonă, fie ca o serie de puncte de date.
  • Rowcol este un argument opțional pe care îl puteți seta la xlRows pentru a specifica faptul că noile valori sunt pe rândurile din intervalul specificat, sau puteți utiliza setarea implicită, xlColumns, pentru a specifica faptul că noile valori sunt pe coloane. Dacă omiteți acest argument, Excel utilizează xlColumns.
  • CategoryLabels este un argument opțional de tip Variant pe care îl puteți seta la True pentru a specifica faptul că primul rând sau coloană conține numele etichetelor categoriei, sau îl puteți seta la False pentru a specifica faptul că nu le conține. Dacă omiteți acest argument, Excel încearcă să afle dacă primul rând sau coloană conține o etichetă de categorie. Cel mai bine este să specificați acest argument pentru a evita confuzia. Dacă Source este o matrice, VBA ignoră acest argument.

De exemplu, următoarea instrucțiune extinde seria în diagrama identificată de variabila obiect myChart utilizând datele din celulele P3:P8 din foaia de lucru denumită Chart Data:

myChart.SeriesCollection.Extend _
  Source:=Worksheets("Chart Data").Range("P3:P8")

Adăugarea unei legende la diagramă

Pentru a adăuga o legendă în diagramă, setați proprietatea HasLegend la True. Pentru a manipula legenda, lucrați cu proprietățile obiectului Legend. Iată câteva proprietăți:

  • Proprietatea Position controlează locul în care apare legenda: xlLegendPositionBottom, xlLegendPositionCorner, xlLegendPositionLeft, xlLegendPositionRight, or xlLegendPositionTop.
  • Proprietatea Height și proprietatea Width controlează înălțimea și, respectiv, lățimea legendei, în puncte.
  • Proprietatea Font returnează obiectul Font, care are proprietăți pe care le puteți seta pentru a specifica dimensiunea fontului, numele și efectele.

De exemplu, următoarele declarații adăuga legenda la diagrama reprezentată de variabila obiect myChart și îi aplică fontul Arial de 16 puncte:

With myChart.Legend 
  .HasLegend = True 
  .Font.Size = 16 
  .Font.Name = "Arial"
End With

Adăugarea unui titlu de diagramă

Pentru a adăuga un titlu la diagramă, setați proprietatea HasTitle la True, ca în acest exemplu:

myChart.HasTitle = True

Excel adaugă titlul cu textul implicit Chart Title. Pentru a modifica textul, setați proprietății Text a obiectului ChartTitle, care reprezintă titlul diagramei. Iată un exemplu:

myChart.ChartTitle.Text = "Aici se scrie titlul diagaramei"

Pentru a poziționa titlul, setați proprietatea Top (specificând numărul de puncte față de marginea de sus a foii de lucru) și proprietatea Left (specificând numărul de puncte față de marginea din stânga a foii de lucru), ca în acest exemplu:

With myChart.ChartTitle 
  .Top = 100 
  .Left = 150 
End With

Pentru a formata textul titlului, lucrați cu obiectul Font, astfel:

myChart.ChartTitle.Font.Name = "Arial"

Lucrul cu axele diagramei

Pentru a lucra cu o axă a unei diagrame, utilizați metoda Axe pentru a accesa axa corespunzătoare. Sintaxa este următoarea:

expression.Axes(Type, Group)

Aici, expression este o expresie necesară care returnează un obiect Chart. Type este un argument opțional de tip Variant care specifică axa care va fi returnată. Utilizaţi xlValue pentru a returna valoarea axei, xl Category pentru a returna categoria axei, sau xlSeriesAxis pentru a returna seris axei (numai pentru diagramele 3D). Group este un argument opțional pe care îl puteți seta la xlSecondary pentru a specifica al doilea grup de axei în loc de xlPrimary (setarea implicită), care specifică primul grup de axe.

De exemplu, următoarele declarații funcționează cu categoria axei din grupul principal al diagramei, aplicând titlul acesteia, adăugând text, setând fontul și dimensiunea fontului și activând liniile de grilă majore și liniile de grilă minore. Rețineți că folosind structura With, ele ar trebui să fie plasate într-o a doua structură WIth exterioară, care reprezintă diagrama propriu-zisă:

With MyChart
    With .Axes(Type:=xlCategory, AxisGroup:=xlPrimary) 
      .HasTitle = True
        .AxisTitle.Text = "Years"
        .AxisTitle.Font.Name = "Times New Roman" 
        .AxisTitle.Font.Size = 12 
        .HasMajorGridlines = True 
        .HasMinorGridlines = False 
    End With
End With

Formatare anteturi și subsoluri

Puteți manipula cu ușurință anteturile și subsolurile prin intermediul VBA utilizând un set încorporat de formate și constante de conținut. Acestea includ specificații de format, cum ar fi &U pentru subliniere și &C, pentru centrare. Constantele de conținut includ &D, care inserează data curentă, &P pentru numărul paginii și &F pentru numele documentului. Lista completă a constantelor VBA din antet și subsol pot fi găsite aici:

http://msdn.microsoft.com/en-us/library/office/ff822794.aspx

Următorul cod activează scrisul cursiv și subliniat, iar în partea dreaptă a antetului imprimă Inventar Pagina, urmată de pagina curentă și numărul total de pagini: Inventar Pagina 2 din 7. Dacă nu există antet, se creează unul.

ActiveSheet.PageSetup.RightHeader = "&U&I Inventar Pagina &P din &N