Excel-Scripte

From NJH-Wiki

Jump to: navigation, search

Contents

Autor

Frank Prößdorf

Sortieren nach einer der Spalten

Wollen wir eine bestimmte Menge von Spalten nach einer dieser Spalten sortieren, so können wir zum Beispiel wie folgt vorgehen. Zunächst selektieren wir die zu sortierende Spaltenmenge:

Columns("A:D").Select

Und dann sortieren wir sie, wobei wir als Sortierkriterium eine bestimmte Spalte angeben:

Selection.Sort Key1:=Range("D2"), Order1:=xlAscending, Header:=xlGuess, _
    OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom


Formatieren der Kopfzeile

Um mal ein Beispiel zu zeigen, wie man eine Kopfzeile formatieren könnte:

' Erstelle den Rahmen
Rows(1).Select
With Selection.Borders(xlEdgeLeft)
    .LineStyle = xlContinuous
    .Weight = xlThin
    .ColorIndex = xlAutomatic
End With
With Selection.Borders(xlEdgeTop)
    .LineStyle = xlContinuous
    .Weight = xlThin
    .ColorIndex = xlAutomatic
End With
With Selection.Borders(xlEdgeBottom)
    .LineStyle = xlContinuous
    .Weight = xlThin
    .ColorIndex = xlAutomatic
End With
With Selection.Borders(xlEdgeRight)
    .LineStyle = xlContinuous
    .Weight = xlThin
    .ColorIndex = xlAutomatic
End With
With Selection.Borders(xlInsideVertical)
    .LineStyle = xlContinuous
    .Weight = xlThin
    .ColorIndex = xlAutomatic
End With

' Erstelle die Farbe
With Selection.Interior
    .ColorIndex = 40
    .Pattern = xlSolid
    .PatternColorIndex = xlAutomatic
End With


Hinzufügen eines Buttons in die Excel Menüleiste

Im VBA Editor verändern wir nun "DieseArbeitsmappe", welche als Microsoft Excel Objekt im Makro gespeichert ist. Hier fügen wir zwei Funktionen ein. Die erste Funktion dient dazu, den Button beim Hinzufügen des Makros durch den AddIn-Manager in die Menüleiste zu packen, und die zweite dient dazu ihn aus derselben beim Entfernen des akros ebenfalls zu löschen.

Zum Hinzufügen dient also folgende Funktion:

Private Sub Workbook_AddinInstall()
    With Application.CommandBars("Worksheet Menu Bar").Controls.Add(Type:=msoControlButton)
        .DescriptionText = "Button1"
        .TooltipText = "Button1"
        .Caption = "Button1"
        .Style = msoButtonCaption
        .OnAction = "Button1"
    End With
End Sub

Und zum Löschen nutzen wir:

Private Sub Workbook_AddinUninstall()
    On Error Resume Next
    Application.CommandBars("Worksheet Menu Bar").Controls("Button1").Delete
End Sub


Umwandeln des Zahlenformats

Wir wollen nun einmal das Zahlenformat für einen bestimmten Zellbereich von dem zeitähnlichen Format "02:00" in das Dezimalformat "02,00" umwandeln. Hierzu wollen wir zunächst die Anzahl der Zeilen und Spalten herausbekommen:

' Bestimme die Zeilen und Spaltenzahl
zeilenanzahl = ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Row
spaltenanzahl = ActiveSheet.Cells(1, Columns.Count).End(xlToLeft).Column

Nun bestimmen wir den Bereich, den wir entsprechend formatieren möchten, z.B.:

' Bestimme den zu formatierenden Bereich
xwert = "a1"
ywert = "a" & zeilenanzahl

Und nun wandeln wir die betroffenen Zellen um:

' Selektiere den Bereich
Range(xwert, ywert).Select
        For Each zl In ActiveWindow.RangeSelection
            wert = zl.Value
            wert = wert * 24              ' um auf dei richtige Entsprechung zu kommen
            zl.NumberFormat = "#,##0.00"  ' ändere das Nummernformat
            zl.Value = wert
        Next


Ausrichtung für Zellenbereich ändern

Wollen wir für einen bestimmten Zellenbereich die Ausrichtung der Werte ändern, so nutzen wir folgenden Code:

xwert = "c2"
ywert = "c" & zeilenanzahl

Range(xwert, ywert).Select
    With Selection
        .HorizontalAlignment = xlRight
    End With


Teilstring aus String filtern

Wir wollen nun aus dem Beispielstring: "Uhrzeit: (02:00 - 04:00)" den folgenden Teil rausziehen: "02:00 - 04:00". Hierzu werden wir zunächst nach der Stelle suchen, an der in Zelle (1, 1) das erste Mal eine "0" auftaucht:

start = InStr(Cells(1, 1), "0")

Nun wollen wir das Ende des herauszuziehenden Strings erhalten. Dazu suchen wir nach der schliessenden Klammer.

ende = InStr(Cells(1, 1), ")")

Für den folgenden Befehl brauchen wir nun die Länge des Teilstrings, welche wir durch simple Subtraktion erhalten:

ende = ende - start

Und nun geben wir den Teilstring wieder in die Zelle zurück:

Cells(1, 1) = Mid$(Cells(1, 1), start, ende)

Wenn es darum geht das erste Zeichen weg zu schneiden, wenn es eine bestimmte Bedingung erfüllt ist folgender Code nützlich:

If Left(string, 1) = "0" Then
  string = Right(string, Len(string) - 1)
End If

Mit diesem Beispiel wird die führende 0 in einem String weggeschnitten, wenn sie existiert.

Spalte und Zeile finden, in der ein bestimmtes Wort steckt

Es soll die Tabelle nach einem Wort durchsucht werden. Wird dieses Wort das erste Mal gefunden, wird die Spalte und Zeile, in der es steht, in einer Variablen gespeichert.

Dim FoundCell As Range

With Worksheets(1)
  On Error Resume Next
  Set FoundCell = .Cells.Find("Wort", LookIn:=xlValues)
  If Not FoundCell Is Nothing Then
    col1 = CInt(FoundCell.Column)
    row1 = CInt(FoundCell.Row)
  End If
  On Error GoTo 0
End With


Exceldatei durch Buttonklick öffnen

Durch Klick auf einen Button soll eine Exceldatei ausgesucht und danach geöffnet werden können. Dieser Codeblock soll durch Klicken auf den Button ausgeführt werden:

Dim varRetVal As Variant
    
varRetVal = Application.GetOpenFilename( _
  FileFilter:="Microsoft Excel-Dateien (*.xls), *.xls", _
  Title:="Exceldatei wählen")

If varRetVal = False Then Exit Sub
          
On Error Resume Next
Workbooks.Open FileName:=varRetVal
If Err > 0 Then
  MsgBox "Exceldatei konnte nicht gefunden oder geöffnet werden.", vbExclamation, "Dateifehler"
  Exit Sub
End If

Assoziatives Array

Ein wirkliches assoziatives Array gibt es in Visual Basic ja nicht. Hierfür wurde eine Struktur entwickelt, die sich Dictionary nennt. Dieses kann, mehr oder minder schön, alle Aufgaben eines assoziativen Arrays.

Initialisiert wird das ganze durch die Erstellung eines Objekts:

Dim array
Set array = CreateObject("Scripting.Dictionary")

Einträge werden über Add hinzugefügt und Remove gelöscht. Diese Funktionen werden als Methoden des Objekts aufgerufen:

array.Add key, value
array.Remove key

Wenn man auf einen Eintrag zugreifen möchte:

If array.exists(key) Then
  .Cells(1, 1).Value = array(key)
End If

Sollen alle Einträge des Dictionarys aufgelistet werden, so kann das zum Beispiel so aussehen:

keys = array.keys
For i = 1 To array.count
  .Cells(i, 1).Value = keys(i)
Next i

items = array.items
For i = 1 To array.count
  .Cells(i, 2).Value = items(i)
Next i


Fehlerbehandlung

Fehler tauchen leider immer wieder mal auf. Um sie irgendwie abzufangen und besser auswerten zu können, folgt hier ein kleiner ErrorHandler.

Es kann sinnvoll sein, dass eine Funktion zurückgibt ob sie fehlerfrei durchlaufen wurde. Hierzu kann man sie als Boolean deklarieren.

Function funktion(datei As String) As Boolean

Erfolgt bei einer Anweisung ein Fehler, so wollen wir, dass mit der nächsten Anweisung fortgefahren wird:

On Error Resume Next

So bald wir an eine Stelle kommen, bei der ein Fehler auftreten kann, sollten wir diesen abfangen. Das kann zum Beispiel sein, wenn eine Datei geöffnet werden soll. Wenn es also einen Fehler gibt, schicken wir eine Nachricht an den Benutzer, zeigen an, dass die Datei nicht geöffnet wurde und gehen zum Bereich Fehler.

oExl.Workbooks.Open datei
If Err > 0 Then
  MsgBox "Exceldatei konnte nicht gefunden oder geöffnet werden.", vbExclamation, "Dateifehler"
  Set oExl = Nothing
  GoTo Fehler
End If

So verfahren wir an jeder Stelle, an der ein Fehler auftauchen kann.

Wenn am Ende der Funktion kein Fehler aufgetaucht ist, geben wir wahr zurück und beenden die Funktion:

funktion = True
Exit Function

Ist doch ein Fehler aufgetaucht, so haben wir diesen zum Bereich Fehler geschickt. In diesem schließen wir jetzt zum Beispiel die Datei, wenn sie geöffnet sein sollte und geben anschließend falsch als Funktionsergebnis zurück.

Fehler:
  If Not oExl Is Nothing Then
    oExl.ActiveWorkbook.Close SaveChanges:=False
    oExl.Quit
  End If
    
  funktion = False

End Function
Personal tools