Voorbeeldoplossingen: Voorbeeldoplossingen
VBA 1: VBA 1 Start Word; zorg ervoor dat onderaan de 'Drawing'-werkbalk zichtbaar is
Voeg aan de 'Drawing'-werkbalk een knopje toe waarmee je een tekstballon kan invoegen in een Word-document; verwijder vervolgens het knopje weer Ga naar 'Tools', 'Customize…'. Daar kies je 'AutoShapes' onder het 'Commands'-tabblad, waar je dan in het rechtervenster ergens een tekstballon ziet staan. Sleep die met de muis naar de tekenbalk (die zichtbaar gemaakt moet zijn). Dan komt er een knopje op de tekenbalk bij. Sleep dit knopje van de tekenbalk weer naar het 'Customize'-venster, en het is weg.
VBA 1 (vervolg): VBA 1 (vervolg) Maak een nieuwe werkbalk 'Zorro' aan; voeg er knopjes aan toe om de font in te stellen op Arial, Garamond en Comic Sans MS; plaats (sleep) de werkbalk bovenaan het scherm; test de werking.
Weer in het venster 'Customize' (zie vorige slide) kun je in het tabblad 'Toolbars' kiezen voor 'New…'. Je geeft de werkbalk een naam naar keuze (hier bijv. Zorro). Dan klik je bij 'Commands' in het linkervenster 'Fonts' aan. Let op dat je in Word werkt, want in PowerPoint is deze optie niet beschikbaar. Je sleept vervolgens de gevraagde lettertypes naar de werkbalk.
VBA 2: VBA 2 1. Creëer een lege PowerPoint-presentatie; maak een macro op die 'geselecteerde' tekst in een blauwe kleur zet; gebruik hiervoor de macrorecorder
Kies 'Tools', 'Macro', 'Record New Macro…'. Je selecteert dan tekst, die je met 'Format', 'Font…' blauw maakt. Daarna stop je de macro recorder. Bij 'Tools', 'Macro', 'Macros…' kun je de macro bewerken. De code ziet eruit als de tekst in het kader hier rechts. De meeste zaken gaan over de eigenschappen van de geselecteerde tekst (grootte, font, ...) en doen niet terzake. Na schrappen van de overbodige lijnen code hou je iets over zoals in de rechthoek eronder.
2. Creëer nu een werkbalk 'Zorro' en voeg de zojuist gecreëerde macro blauw er aan toe
Weer met 'Tools', 'Customize…'. Links kies je 'Macros' bij het 'Commands'-tabblad, rechts verschijnt dan jouw macro, die je kunt meeslepen naar een menubalk 3. Test de macro door allerlei tekst (en tekstvakken) te selecteren en hem erop toe te passen; test de macro ook op b.v. een pijl en experimenteer met de debugger Tekst is iets anders dan een vorm. Dat zal dus niet werken, en je zal er daarom een aparte macro voor moeten schrijven...
4. Schrijf het gecreëerde bestand weg, sluit alle PowerPoint-vensters en herstart PowerPoint met een nieuwe presentatie; werkt de macro nog? Ja.
Tips
De macrorecorder neemt teveel operaties op; editeer dus de macro in de VBA-editor en verwijder de overbodige lijnen
Als je de werkbalk aanmaakt, dan vind je de gecreëerde macro terug onder 'Commands', 'Macros' Sub blauw()
ActiveWindow.Selection.ShapeRange.TextFrame.TextRange.Characters(Start:=5, Length:=8).Select
With ActiveWindow.Selection.TextRange.Font
.Name = 'Times New Roman'
.Size = 32
.Bold = msoFalse
.Italic = msoFalse
.Underline = msoFalse
.Shadow = msoFalse
.Emboss = msoFalse
.BaselineOffset = 0
.AutoRotateNumbers = msoFalse
.Color.SchemeColor = ppAccent1
End With
End Sub Sub blauw()
With ActiveWindow.Selection.TextRange.Font
.Color.SchemeColor = ppAccent1
End With
End Sub
VBA 3: VBA 3 Voeg een nieuwe functie zorro toe aan Excel, die bij een gegeven getal 12 optelt; doe dit als volgt:
Creëer een nieuw werkblad en open de visual basic editor
Zoek in het project-venster de naam van het bestand waarmee je aan het werken bent en voeg een module toe (tip: gebruik contextmenu (via rechtermuistoets))
Lees eventueel de on-line help over 'function' en bestudeer in het bijzonder het voorbeeld dat daar wordt gegeven De on-line help van de Visual Basic Editor welteverstaan. Zoek naar 'Function', 'Function Statement' en klik dan op 'Example'. Het gaat om het volgende voorbeeld:
Open de eerder gecreëerde module door er twee keer op te klikken en creëer hierin de gevraagde functie Let op: de naam van de output is dezelfde als de naam van de functie.
Ga terug naar het Excel werkblad (P.S.: je hoeft de VBA-editor niet te sluiten); test de functie zorro door ze te gebruiken in een formule Via 'Insert', 'Function…'
Resultaat: zie functie.xls Function CalculateSquareRoot(NumberArg As Double) As Double
If NumberArg andlt; 0 Then ' Evaluate argument.
Exit Function ' Exit to calling procedure.
Else
CalculateSquareRoot = Sqr(NumberArg) ' Return square root.
End If
End Function Function zorro(NumberArg As Double) As Double
zorro = NumberArg + 12
End Function
VBA 4: VBA 4 Voeg een tweede functie toe, n.l. Celsius die een temperatuur in Fahrenheit omzet naar Celsius
Je kan deze toevoegen onder de functie zorro
Tip: celsius=(fahrenheit-32)*5/9
Creëer in je werkblad twee kolommen waarvan de eerste de fahrenheittemperaturen van 25, 30, 35, … 85 bevat en de tweede de corresponderende celsiuswaarden
Creëer nu een functie CelsiusNoFreeze die de Celsiuswaarde teruggeeft voor temperaturen boven het vriespunt en 0 voor temperaturen eronder
Kopieer hiervoor de functie Celsius en pas ze aan
Gebruik een If-blok of de Iif-functie (zie on-line help)
Resultaat: zie functie1.xls
Alternatief:
Function CelsiusNoFreeze(fDegrees As Double) As Double
CelsiusNoFreeze = (fDegrees - 32) * 5 / 9
If CelsiusNoFreeze andlt;= 0 Then
CelsiusNoFreeze = 0
End If
End Function Function Celsiusnofreeze(x As Double) As Double
Celsius = (x - 32) * 5 / 9
Celsiusnofreeze = IIf(Celsius andlt; 0, 0, Celsius)
End Function
VBA 5: VBA 5 Open dagen.xls; dit werkblad bevat een aantal datums in kolom A, en een formule in kolom B die het aantal dagen berekent in de betreffende maand
Creëer een VBA-functie dagen die het zelfde resultaat berekent als de formule
Bereken in kolom C het aantal dagen in de maand door gebruik van de gecreëerde functie dagen
Opmerking:
De meeste functies in VBA hebben de zelfde naam als in Excel, behalve Date die in VBA DateSerial heet
Weetje: voor Excel is de 0de dag van de volgende maand gelijk aan de laatste dag van de huidige maand!
Merk ook hier op dat het niet nodig is om speciaal rekening te houden met de overgang van maand 12 naar maand 1 (december naar januari): Excel vangt dit speciaal geval zelf op…
Oplossing: dagen1.xls
Function dagen(datum As Date) As Integer
y = Year(datum)
m = Month(datum)
d = DateSerial(y, m+1, 0)
dagen = Day(d)
End Function
VBA 5 (vervolg): VBA 5 (vervolg) Kopieer nu dagen.xls naar b.v. test.xls; en gebruik hier de dagen functie uit dagen1.xls; tip: noteer ze als dagen1.xls!dagen Hiermee kun je de zelf aangemaakte functie 'dagen' uit het vorige werkblad ook in dit document gebruiken... Hiervoor moet dagen1.xls wel geopend zijn in Excel.
Werkt de oplossing als je dagen1.xls sluit? Neen.
Oplossing: dagen2.xls
VBA 6: Open animatie.ppt en maak een werkbalk met daarop drie knopjes die gekoppeld zijn met de macro’s
no, gekoppeld met dontanimate: schakel de animatie van het momenteel geselecteerd object uit
d1, gekoppeld met dissolve1: animeer het momenteel geselecteerde tekstvak, gegroepeerd volgens niveau 1 alinea’s
d2, gekoppeld met dissolve2: animeer het momenteel geselecteerde tekstvak, gegroepeerd volgens niveau 2 alinea’s
animatie.ppt bevat reeds de macro dontanimate; de andere macro’s lijken er redelijk sterk op; het is de bedoeling dat je de on-line help en de object browser gebruikt om de gepaste commando’s terug te vinden
Methode: de regel shp In ActiveWindow.Selection.ShapeRange in het voorbeeldje duidt aan dat shp een object is van de klasse ShapeRange. Met de objectbrowser kun je nagaan welke attributen de klasse ShapeRange kan meekrijgen. Zo vind je TextFrame terug, en met de rechtermuisknop kan je in de objectbrowser kiezen voor 'Help', waardoor je de on-line help over de betreffende functie opvraagt
Test de goede werking (opmerking: het is niet de bedoeling dat de macro’s in alle omstandigheden foutloos werken) De macro werkt alleen op tekstvakken, niet op grafische objecten!!
Resultaat: animatie1.ppt (zonder de werkbalk, vermits die niet kan worden opgeslagen in een ppt-bestand) Je kunt de broncode van de modeloplossing hierin terugvinden... Opgelet: om macro’s te kunnen uitvoeren, moet je wel zorgen dat het beveiligingsniveau ('Tools', 'Macro', 'Security…') niet op 'High' staat. Deze optie zorgt ervoor dat alle macro’s genegeerd worden… VBA 6
VBA 6 (vervolg): VBA 6 (vervolg) Sub dontanimate()
For Each shp In ActiveWindow.Selection.ShapeRange
With shp.AnimationSettings
.Animate = msoFalse
End With
Next
End Sub Sub dissolve1()
For Each shp In ActiveWindow.Selection.ShapeRange
With shp.AnimationSettings
.Animate = msoTrue
.EntryEffect = ppEffectDissolve
If shp.TextFrame.HasText Then
.TextLevelEffect = ppAnimateByFirstLevel
End If
End With
Next
End Sub Sub dissolve()
For Each shp In ActiveWindow.Selection.ShapeRange
With shp.AnimationSettings
.Animate = msoTrue
.EntryEffect = ppEffectDissolve
If shp.TextFrame.HasText Then
.TextLevelEffect = ppAnimateByAllLevels
End If
End With
Next
End Sub
Sub dissolve2()
For Each shp In ActiveWindow.Selection.ShapeRange
With shp.AnimationSettings
.Animate = msoTrue
.EntryEffect = ppEffectDissolve
If shp.TextFrame.HasText Then
.TextLevelEffect = ppAnimateBySecondLevel
End If
End With
Next
End Sub
VBA 7: VBA 7 Voeg in Word een sub-menu zorro toe boven-aan het Format menu;
zorro laat toe het font in te stellen op Courier New of op Arial
Test het menu en verwijder het weer
Door bij 'Tools', 'Customize…', 'Commands', 'New menu' (volledig onderaan de lijst) te selecteren, kun je dit meeslepen naar de bovenste menubalk. Deze zal automatisch uitklappen als je erover beweegt met het meegesleepte icoon, en zo kun je een submenu toevoegen op een plaats naar keuze. Kies dan in het dialoogvenster voor 'Fonts', en sleep de gewenste lettertypes compleet analoog met voorgaande naar het betreffende submenu.
Tip: in het 'Commands'-tabblad van 'Customize…' vind je 'New Menu'; sleep dit naar de gepaste plaats; klik met de rechtermuistoets op het nieuwe menu om de naam te veranderen
VBA 8: VBA 8 Voeg een functie MFunc(x) toe in Excel die berekent:
Tip: in VBA kan je alle bestaande werkbladfuncties oproepen maar om een of andere reden heeft Sqrt een andere naam gekregen in VBA dan in Excel
Om de correcte naam te zoeken, open je de Object Browser (tip: 'View'-menu); ga naar worksheet functions en zoek (b.v. met de verrekijker of door te bladeren) naar iets dat gelijkt op sqrt Onder 'View', 'Object Browser'. Je krijgt dan een scherm als volgt:
VBA 8 (vervolg): VBA 8 (vervolg) Eens de correcte naam gevonden, keer je terug naar 'Code View' en gebruik je de gevonden functie in jouw functie
Pas het resultaat toe op de getallen 1 … 12 en vergelijk met de waarde die je met een formule in Excel berekent
Resultaat: functie2.xls Function MFunc(x)
MFunc = Sqr(1 + Sqr(x))
End Function
VBA 9.1: VBA 9.1 Op http://j-walk.com/ss/excel/tips/tip30.htm vind je VBA-functies waarmee je de laatste niet-lege cel in een bepaalde rij of kolom kan opsporen
Open last.xls en voeg de functies lastinrow en lastincolumn toe
Bereken in 50 opeenvolgende cellen in de eerste kolom (startend met A2) de laatste waarde in de corresponderende rijen
Bereken in 50 opeenvolgende cellen in de eerste rij (startend met B1) de laatste waarde in de corresponderende kolommen
Verklaar de fouten die je ziet en de foutmeldingen die optreden
Resultaat: last1.xls
Letterlijk zoals op de webpagina: Function LASTINROW(rnginput As Range) As Variant
Dim workrange As Range
Dim i As Integer, CellCount As Integer
Application.Volatile
Set workrange = rnginput.Rows(1).EntireRow
Set workrange = Intersect(workrange.Parent.UsedRange, workrange)
CellCount = workrange.Count
For i = CellCount To 1 Step -1
If Not IsEmpty(workrange(i)) Then
LASTINROW = workrange(i).Value
Exit Function
End If
Next i
End Function Function LASTINCOLUMN(rnginput As Range) As Variant
Dim workrange As Range
Dim i As Integer, CellCount As Integer
Application.Volatile
Set workrange = rnginput.Columns(1).EntireColumn
Set workrange = Intersect(workrange.Parent.UsedRange, workrange)
CellCount = workrange.Count
For i = CellCount To 1 Step -1
If Not IsEmpty(workrange(i)) Then
LASTINCOLUMN = workrange(i).Value
Exit Function
End If
Next i
End Function
VBA 9.2: VBA 9.2 Pas de VBA-code in last1.xls aan zodat lastinrow en lastincolumn niet langer een waarde terugleveren, maar een referentie naar de laatste cel
Ga als volgt te werk
Verwijder de variant type declaratie in de bovenste lijn van de functiedefinitie
Vervang de lijn LASTINCOLUMN = workrange(i).value
door set LASTINCOLUMN = workrange(i) (idem voor lastinrow)
Voeg boven de eerste rij een rij toe waarin het rijnummer van het laatste element wordt berekend
Voeg voor de eerste kolom een kolom toe waarin het kolomnummer van het laatste element wordt berekend
Oplossing: last2.xls
Voeg wel een rij met =ROW(lastincolumn(x)) toe om het rijnummer weer te geven van de gevonden referentie. Idem voor COLUMN. Als je geen referentie teruglevert kan je b.v. niet het kolomnummer berekenen van het laatste element. Een functie die een referentie teruglevert kan ook dienen om b.v. een formule in dat laatste element te stoppen.
wordt vervangen door
Analoog voor LASTINROW
Opgepast: de reeds ingevulde cellen met =RAND() worden telkens herberekend als er ergens nieuwe waarden worden toegevoegd.
Een foutmelding die wel eens durft optreden maakt gewag van 'circular references'. Wanneer een rij/kolom nog geen waarden van de gebruiker heeft meegekregen, is de cel waarin de functie wordt aangeroepen zelf de laatste cel, waardoor Excel wat in de war geraakt.
…
If Not IsEmpty(workrange(i)) Then
LASTINCOLUMN = workrange(i).Value
Exit Function
…
…
If Not IsEmpty(workrange(i)) Then
LASTINCOLUMN = workrange(i)
Exit Function
…