Alle unsere Tipps (Home)
Übersicht Buch- und Hobby-Tipps


Ein paar Tipps zu Excel VBA Makros

Damit meine Seite excel-tipps.php nicht noch länger wird, habe ich Tipps, die sich nur mit Excel VBA beschäftigen, hier ausgelagert. VBA ist die Programmiersprache Visual Basic, mit der man Makros für Excelschreiben kann.

Inhalt:



Zufallszahlen erzeugen

Gegen die übliche Langeweile benötige ich in fast jeder Programmiersprache, die ich bisher kenne, gelegentlich Zufallszahlen.
Solche Befehle gibt es auch in jeder Programmiersprache, aber sie arbeiten recht unterschiedlich, und ich kann sie mir einfach nicht merken.
Also baue ich mir immer erst mal eine Funktion Zufall(), die mir ganze Zahlen in einem Bereich "von/bis" erzeugen kann:

Public Function Zufall(ByVal Untergrenze As Long, ByVal Obergrenze As Long) As Long 'ganzzahlige Zufallszahlen im Intervall von a bis b erzeugen 'Excel erzeugt eigentlich nur Zahlen im Bereich von: '0 <= rnd() < 1 Randomize ' Zufallszahlengenerator initialisieren. ' Das kann auch einmalig am Anfang des Programms stehen. Dim ii As Long If Obergrenze < Untergrenze Then ' Grenzen wenn nötig tauschen ii = Obergrenze Obergrenze = Untergrenze Untergrenze = ii End If Zufall = Int((Obergrenze - Untergrenze + 1) * Rnd + Untergrenze) End Function

Ohne VBA sähe es so aus (Obergrenze in A1, Untergrenze in B1):

= ABRUNDEN( (A1 - B1 + 1) * zufallszahl() + B1 ; 0)

Bei diesen beiden Funktionen können gleiche Zahlen mehrfach auftreten.
Falls zufällige Dezimalzahlen benötigt werden, teilt man das Ergebnis je nach Wunsch durch 10, 100 usw.
zum Seitenanfang




Formeln mit VBA in Zellen schreiben

Mit VBA kann man Formeln in als String in Zellen schreiben. Wenn man es aber mit .Formula macht, z. B. mit

Range("B2").Formula = "=AVERAGE(A2:A30)" 'oder MeineFormel = "=IF(A2>50 , A2 & "" ist zu groß!"" , A2)" Range("C2").Formula = MeineFormel

muss man englische Ausdrücke und Funktionsnamen in die Formel schreiben; außerdem Komma statt Semikolon und Dezimalpunkt statt Dezimalkomma.

Mit .FormulaLocal kann man die gewohnten deutschen Bezeichnungen benutzen:

Range("B2").FormulaLocal = "=MITTELWERT(A2:A30)" 'oder MeineFormel = "=WENN(A2>50 ; A2 & " & Chr(34) & " ist zu groß!" & Chr(34) & " ; A2)" Range("C2").FormulaLocal = MeineFormel

Wenn die bearbeitete Excel-Mappe international kompatibel sein soll, ist .Formula zu bevorzugen.

Im Formelstring vorkommende Anführungszeichen müssen in beiden Sprachvarianten verdoppelt oder durch Verwendung von Chr(34) dargestellt werden.

Matrixformeln können mit .FormulaArray in Zellen geschrieben werden. FormulaArray funktioniert nur mit englischen Ausdrücken.
zum Seitenanfang



VBA: Pfad, Dateiname und Dateiendung trennen

Zum Zerlegen eines Strings in Pfad, Dateiname und Dateiendung helfen folgende Funktionen:

Function Pfadname_von(aa) As String 'Pfadname abtrennen Pfadname_von = Left(aa, InStrRev(aa, "\") - 1) End Function Function Dateiname_von(aa) As String 'Dateiname abtrennen Dateiname_von = Mid(aa, InStrRev(aa, "\") + 1) End Function Function Dateiendung_von(aa) As String 'Dateiendung (mit Punkt) abtrennen If InStrRev(aa, ".") = 0 Then Dateiendung_von = "" Exit Function End If Dateiendung_von = Mid(aa, InStrRev(aa, ".")) End Function

zum Seitenanfang


VBA: Aktuelle Seite drucken

Wenn man mit Word nur eine Seite eines längeren Dokuments drucken will, kann man dort bei Drucken "Aktuelle Seite drucken" anklicken. In Excel gibt es diese Funktion leider gar nicht. Man kann höchstens einen Teil einer Exceltabe markieren und dann den markierten Bereich drucken lassen.
Nach langem Suchen habe ich im Archiv des leider nicht mehr aktiven Forums spotlight.de ein paar Gedanken dazu gefunden und sie zu volgendem Makro zusammengebaut:

Sub AktuelleSeiteDrucken() Dim Seite As Long Application.ScreenUpdating = False 'Weniger Geflacker ActiveWindow.View = xlPageBreakPreview Seite = SeitenNr() ActiveWindow.View = xlNormalView ActiveWindow.SelectedSheets.PrintOut From:=Seite, To:=Seite Application.ScreenUpdating = True End Sub Function SeitenNr() As Long Dim x As Long Dim Zelle As Range Dim HBs As Long, VBs As Long, H As Long, V As Long Set Zelle = ActiveCell HBs = ActiveSheet.HPageBreaks.Count VBs = ActiveSheet.VPageBreaks.Count H = 1 V = 1 For x = 1 To HBs If ActiveSheet.HPageBreaks(x).Location.Row <= Zelle.Row Then H = H + 1 Else Exit For End If Next For x = 1 To VBs If ActiveSheet.VPageBreaks(x).Location.Column <= Zelle.Column Then V = V + 1 Else Exit For End If Next SeitenNr = H + (V - 1) * (HBs + 1) End Function


Dieses Makro sollte in einem Modul einer Excel-Mappe stehen, und man könnte es z. B. der Kombination Strg+q zuordnen. Man muss dann nur noch eine Zelle in der gewünschten Tabelle dieser Mappe markieren, und das Modul druckt dann die Seite, in der diese Zelle liegt, aus. zum Seitenanfang


VBA-Bücher

Und noch ein paar Bücher zur Einführung in die VBA-Programmierung:




VBA-Links

zum Seitenanfang




© Klicktipps® (www.Klicktipps.de):
Dieser Ausdruck ist nur für den eigenen Gebrauch freigegeben.
Eine Vervielfältigung ist nicht gestattet und auch wenig sinnvoll,
da sich der Inhalt durch Aktualisierungen häufig ändert.