VBA is een objectbibliotheek in Office programma's. Elk Office programma heeft zijn eigen VBA objectbibiliotheek. Het is mogelijk om de programma's als Excel op uw eigen manier te laten werken. U kunt uw eigen UserForms maken en met VBA aansturen met de werkbladen. Er is echter één probleem: VBA werkt intern. U kunt niet de Excel code compileren als een zelfstandig eigen EXE applicatie. U hebt altijd Excel nodig om uw project uit te laten voeren.

Maar misschien is er toch een oplossing. In de referentielijst van de programmeertalen in Visual Studio is een Excel COM library waarmee we met de VBA objecten in Visual Basic kunnen programmeren, en zelfs in Visual C# en in Visual C++. Wanneer we in Visual Basic 2010 een nieuwe solution aanmaken met een project, genaamd ExcelTest, kunnen we de Excel library toevoegen aan het project.


Kies in het menu Project het menu-item Add Reference.... Een dialoogformulier verschijnt. Open het tabblad COM en rol met de muis totdat u bij de library komt. Klik die aan, zie voorbeeld. Klik dan op OK.

Het kan voorkomen dat u een andere library versie tegenkomt. Dat heeft te maken met wat voor Excel versie u hebt.

Houd er rekening mee dat de library alleen aanwezig kan zijn als u zelf Office met Excel heeft. De library is namelijk geen onderdeel van Visual Studio.

Klik op de lege Form1 en open de klasse Form1. U ziet onderstaande klasse:

Public Class Form1

End Class

Voordat de library gebruikt kan worden, moet die geïmporteerd worden in de klasse. Neem onderstaande Imports regel over boven de Form1 klasse:

Imports Excel = Microsoft.Office.Interop.Excel

In de klasse zijn drie objecten nodig om gebruik te kunnen maken van de Excel objecten. Allemaal hebben ze een verband met elkaar. Het werkboek kunnen we niet aanmaken zonder een applicatie object van Excel en dan zouden we ook geen werkblad aan kunnen maken als we geen werkboek zouden hebben. Neem onderstaande declaraties over in de klasse:

Private app As New Excel.Application
    Private workbook As Excel.Workbook
    Private worksheet As Excel.Worksheet

Open de event Form1_Load() en neem onderstaande code over:

app.Visible = True
workbook = app.Workbooks.Add()
worksheet = workbook.Sheets(
1)
worksheet.Range(
"A1").Value = 20

Als u vergeet de app.Visible = True regel op te nemen, zult u het werkboek niet zien. Toch is het werkboek onzichtbaar ook te gebruiken, en dat kan best nuttig zijn (daarover later meer).

Willen we Form1 sluiten, dan moeten we ook het werkboek sluiten en de Excel objecten opruimen om foutmeldingen te voorkomen. Plaats onderstaande code in de Form1_FormClosed() event:

workbook.Close()
app.Quit()
worksheet =
Nothing
workbook = Nothing
app = Nothing

Als u het project start, zult u wat zien wat u niet zou verwachten. Althans, niet omdat het een object bibliotheek is!

Niet alleen Form1 van Visual Basic 2010 is aanwezig, maar ook het hele Excel programma! Hoe kan dat? We willen enkel een werkboek hebben zonder enige poespas.

Het probleem is dat de library een COM library is en geen zelfstandige klassen library. Zonder gebruik van Excel.Application kan er geen werkboek aangemaakt worden.

Ook als u gebruik zult maken van Visual C# of Visual C++ heeft u hetzelfde probleem.

Toch kan het gebruik van Excel in uw project nuttig zijn, bijvoorbeeld als u functies en formules wilt gebruiken die in Visual Studio niet aanwezig zijn. U kunt dan die functies en formules van Excel gebruiken door ze in de objecten aan te roepen.

Het project sluiten. Of toch eerst Excel?
Klikt u op het sluiten knop van Form1, dan zult u dezelfde vraag krijgen als wanneer u Excel sluit, of u Map1 wilt opslaan of niet. Bij de knoppen Opslaan en Niet opslaan werkt alles prima en uw project wordt samen met Excel keurig afgesloten. Klikt u echter op Annuleren, dan zal toch uw Form1 afgesloten worden, maar niet Excel. De reden is dat het berichtvenster niet van Visual Studio is, maar bij Excel vandaan komt, ook al werkt u alleen met Form1! Alle objecten worden opgeruimd, maar Excel blijft aanwezig. Merk op dat het berichtvenster na een klik op Annuleren nogmaals zal verschijnen zonder Form1. Waarschijnlijk doordat er Workbook.Close() en een app.Quit() uitgevoerd worden. Het zou kunnen dat de app gesloten kan worden zonder het werkboek te hoeven sluiten.

Sluiten we echter eerst Excel en daarna pas Form1, dan heeft dat grote gevolgen en kan uw project gaan hangen of zelfs crashen. Het sluiten van Excel zorgt voor het ongeldig maken van het app object. Als we die proberen te sluiten en te vernietigen met Nothing, dan zal het project meteen hangen en Form1 zal niet meer reageren. In de IDE kunt u het project onderbreken naast de uitvoerknop. Als het een uitvoerbaar bestand is zult u dat niet meer kunnen doen en is de enige mogelijkheid om het programma via taakbeheer af te breken.

Het is daarom zeer belangrijk gebruik te maken van foutafhandelingen als u objectbibliotheken gaat gebruiken die deze problemen kunnen veroorzaken. COM library's moet u goed beschermen, want het gebruik ervan is heel anders dan bij klassen library’s.

Toch nog een voordeel.
Ook al is deze manier niet zoals u zou willen, toch kan het gebruik van het Excel COM library nuttig zijn. Door gebruik te maken van de Formula eigenschap, kunt u elke Excel formule in het worksheet object aanroepen. Jammer genoeg moet u de formules in het Engels programmeren, terwijl ze in Excel zelf Nederlandstalig zijn.

Om zo'n voordeel te kunnen zien, gaan we een testje maken. We breiden het project uit door nog twee extra getallen in de cellen A2 en A3 te zetten en een gemiddelde van de waarden in de cellen A1, A2 en A3 in A4 uit te voeren. Het resultaat plaatsen we in een label in Form1.

Klik op de toolbox de label control en sleep deze linksboven op Form1.

Plaats onderstaande code onder de Worksheet.Range("A1").Value = 20 regel:

worksheet.Range("A2").Value = 30
worksheet.Range("A3").Value = 40
worksheet.Range("A4").Formula = "=AVERAGE(A1:A3)"
Label1.Text = worksheet.Range("A4").Value.ToString

Als u het project start, ziet u onderstaand voorbeeld.

 

Het gemiddelde wordt prima uitgevoerd. Schuift u Form1 aan de kant, dan zult u merken dat in cel A4 gewoon de fomule =GEMIDDELDE in de invoerbalk staat en niet de opgegeven =AVERAGE.

Maakt u een groter project met gebruik van de handige Excel functies, dan zal het verschijnen van Excel zelf kunnen irriteren, de applicatie staat gewoon in de weg. Het is mogelijk om de applicatie onzichtbaar te laten en gewoon de objecten te laten werken.

 

Dit doet u door de regel:

app.Visible = True

in commentaar te zetten, of True in False te wijzigen.


Samenvatting

U kunt hiermee uw projecten functioneler maken. Door uw project samen met de Excel objecten te laten werken, kunt u formulieren ontwerpen dat normaal gesproken op een UserForm in Excel niet kan, vanwege gebrek aan materiaal (besturingselementen). Bovendien werkt VBA alleen als een versie 6.

Maar pas op! U kunt van uw project ook een rommel maken. Als u de Excel applicatie zichtbaar laat, dan is het mogelijk dat u per ongeluk VBA opent. In VBA kan ook een compleet project ontwikkeld worden. Het uitvoeren van de code van Visual Studio kan het VBA project in Excel verstoren, of andersom. Wees dus voorzichtig met het gebruik van Excel in Visual Studio. Als u echter weet wat u doet, is er niets aan de hand.