Bugs, Probleme und Spezialitäten (Excel und VBA)

WB01727_.gif (1537 Byte)

Summary

Wer kennt sie nicht, die lieben Bugs! Viele der vermeintlichen Bugs stellen sich jedoch als Features oder ungenügend (bis gar nicht) dokumentierte Funktionen heraus. Manchmal verhält sich auch Excel vielleicht nicht gerade so, wie man es eigentlich erwarten würde. Echte Excel-Bugs existieren meiner Meinung nach aber nur wenige.

Leserprofil
Alle Excel-Anwender ohne spezielle Fachkenntnisse

 

WB01727_.gif (1537 Byte)

Info Verwandte Themen und Seiten
» Updates, Service Releases und Service Packs

» Verfügbare Hotfixes
» XLimits: Limitationen, Spezifikationen und Grenzen

WB01727_.gif (1537 Byte)

Inhaltsübersicht

Das Number-Zeichen (#) für Datumsausdrücke und die Weekday-Funktion (VBA)

Der Bug der Cells-Eigenschaft (Excel-VBA)

Die Spezialitäten des Range-Objektes (Excel-VBA)

Die Selection-Eigenschaft und ihre Tücken (Excel-VBA)

Performance-Probleme bei Verwendung von "On Error Resume Next" (Excel 2000-VBA)

Fehler bei der automatischen Benennung eines kopierten Arbeitsblattes (Excel)

VBA-Makro läuft nicht bei als Gruppe selektierten Arbeitsblättern (Excel-VBA)

Anzeige des Arbeitsmappe-Fensters wird nicht vollständig aktualisiert (Excel)

Validation.Value sagt nicht immer die Wahrheit (Excel-VBA)

 

Übersicht

 

WB01727_.gif (697 Byte)

VBA: Das Number-Zeichen (#) für Datumsausdrücke und die Weekday-Funktion

Zusammenfassung
Das Beispiel zur Weekday-Funktion in der VBA-Onlinehilfe (Office 97) funktioniert nicht. Man könnte jetzt einfach ein anderes, diesmal lauffähiges Beispiel in der nächsten Ausgabe der Onlinehilfe abdrucken. Aber ganz so einfach machte ich es mir nicht und wollte den Grund wissen, weshalb das Beispiel nicht lauffähig ist. Dies ist der Code aus der VBA-Hilfe:

Dim Datum1, Wochentag1
Datum1 = #12. Februar 1969#     ' Datum zuweisen.
Wochentag1 = Weekday(Datum1)    ' Wochentag1 enthält 4, da Datum1 einen Mittwoch darstellt.

(Beschreibung folgt...)

Übersicht

 


Excel-VBA: Der Bug der Cells-Eigenschaft

Zusammenfassung
Möchten Sie mal Ihren PC leiden sehen? Nichts leichter als das!

Wichtig!
Die hier vorgestellte VBA-Anweisung kann zum Systemabsturz führen. Es werden jedoch keine Hardware-Teile beschädigt, keine Office-Installationen zerstört oder keine Dateien von der Festplatte gelöscht. Dennoch übernehmen Sie selbst die volle Verantwortung, wenn Sie die Anweisung ausführen.

Starten Sie Excel 2000 oder Excel XP, öffnen den VBA-Editor und geben im Direktfenster diese kleine unscheinbare Anweisung ein:
  ?Cells

Nach etwa einer halben Minute wird sich Ihr PC zu Tode quälen. Excel 97 ist ironischerweise immun und zeigt lediglich den Laufzeitfehler Nr. 7 "Nicht genügend Speicher".

(Beschreibung folgt...)

Übersicht

 


Excel-VBA: Die Spezialitäten des Range-Objektes

Zusammenfassung
Auch das häufig verwendete Range-Objekt besitzt einen Bug. Er fällt zwar kaum auf, ist aber sehr einfach zu produzieren. Damit Sie nicht nur erkennen, wie sondern auch weshalb der Fehler auftritt, wird das Range-Objekt so lange schrittweise analysiert, bis die Ursache gefunden ist.

Vorgehen
Geben Sie zuerst folgende Anweisung im Direktfenster des VBA-Editors ein:
  ?Range("A1").Value
Das ausgegebene Ergebnis zeigt den Wert der Zelle A1. Kein Problem also.

Geben Sie jetzt folgende Anweisung ein:
  ?Range("A1:A2").Value
Jetzt erscheint kein Ergebnis sondern der Laufzeitfehler Nr. 13 "Typen unverträglich". Das ist nachvollziehbar, da der Wert der beiden Zellen A1 und A2 nicht ermittelt werden kann. Das ist normal bei mehreren Zellen beziehungsweise bei Bereichen.

Geben Sie nun diese Anweisung ein:
  ?Range("A1:BY64935").Value
Auch hier erscheint der Laufzeitfehler Nr. 13 "Typen unverträglich", und zwar aus gleichem Grund wie bei der vorhergehenden Anweisung mit dem Range über zwei Zellen. Aber ist Ihnen aufgefallen, dass zwischen Drücken der Enter-Taste und Erscheinen der Fehlermeldung viel Zeit verstrichen ist?

Geben Sie nochmals die letzte Anweisung ein, öffnen aber vorher den NT Task-Manager oder ein ähnliches Tool, welches laufend die aktuelle CPU- und Speicherauslastung anzeigt. Die Anweisung lautet:
  ?Range("A1:BY64935").Value
Wenn Sie jetzt die Prozessor- und Speicherauslastung beobachten, werden Sie Zeuge, wie Ihr Rechner all seine Kräfte zusammenrafft und sich bemüht, die VBA-Anweisung auszuführen. Immerhin umfasst der Bereich A1 bis BY64935 rund 5 Millionen Zellen (daher die Angabe BY64935)! Je nach Windows-Version, Grösse des physischen sowie virtuellen Arbeitsspeichers kann es sehr lange bis zur Rückmeldung (sprich Fehlermeldung) dauern. Wenn Ihr Rechner wenig physisches RAM aber eine grössere Speicherauslagerungsdatei besitzt, hat Windows ziemlich Mühe mit dem Swappen (d.h. Schreiben der Speicherblöcke auf die Harddisk). Auf meinem Testrechner (300 MHz CPU, 130 MB RAM gesamt, NT 4, Excel 97) schnappte sich Excel das gesamte verfügbare RAM, welches sich beim Testen auf ca. 80 MB belief, also etwa das 20-fache, was Excel gewöhnlich benötigt.

Wenn Sie den Bug herausfordern wollen, geben Sie zum Schluss noch diese Anweisung ein:
  ?Range("A1:IV65536").Value
Es ist anzunehmen, dass die Ausführung dieser Anweisung nie beendet werden kann. Je nach Grösse des verfügbaren Arbeitsspeichers werden Minuten verstreichen, bis die Fehlermeldung erscheint. Es kommt auch vor, dass sich Windows verhängt oder ganz verabschiedet, da für alle anderen Prozesse (ausser Excel) kein Speicher mehr zur Verfügung steht.

... ... ... ...

Übersicht

 


Excel-VBA: Die Selection-Eigenschaft und ihre Tücken

Zusammenfassung
Die Selection-Eigenschaft des Application-Objektes besitzt nicht einen echten Bug aber eine spezielle Eigenheit. Wenn man beispielsweise mit Kommentaren oder Zeichnungsobjekten arbeitet, sollte man diese Eigenheit unbedingt kennen und berücksichtigen.

Vorgehen
Wie der Name schon sagt, wird Select ganz allgemein dazu verwendet, um irgendwelche Objekte wie zum Beispiel Zellen oder Kommentare eines (spezifizierten) Bereiches zu selektieren. Mit folgender Anweisung markieren Sie beispielsweise die Zellen des Bereiches A1 bis C3:
  Range("A1:C3").Select
Das ist soweit verständlich.

Auch diese Anweisung funktioniert tadellos:
  ActiveCell.SpecialCells(xlCellTypeComments).Select
Da ActiveCell vom Typ Range ist und für einen Bereich steht, der genau eine Zelle umfasst, wird SpecialCells bzw. Select auf das gesamte Arbeitsblatt angewendet.

Vergleichen wir das einmal mit der Selection-Eigenschaft des Application-Objektes. Selection gibt ein Objekt zurück und wird in VBA-Programmen in der Regel dazu verwendet, um den aktuell selektierten Bereich als Range-Objekt zu erhalten.

Legen Sie ein leeres Arbeitsblatt an, schreiben in die Zelle A1 den Text "Ohne Kommentar", in Zelle C6 "Mit Kommentar" und fügen dieser Zelle C6 einen Kommentar mit beliebigem Text hinzu. Wichtig ist, dass die Excel-Option für Kommentar-Ansicht auf "Kommentare und Indikatoren" eingestellt ist. Der hinzugefügte Kommentar ist somit immer sichtbar. Selektieren Sie die Zelle A1, öffnen den VBA-Editor und geben im Direktfenster folgende Anweisung ein:
  ActiveCell.SpecialCells(xlCellTypeComments).Select
Kein Problem. Alle Kommentar-Zellen (in unserem Fall C6) werden selektiert. Selektieren Sie jetzt in Excel wieder die Zelle A1 und geben dann im Direktfenster diese Anweisung ein:
  Selection.SpecialCells(xlCellTypeComments).Select
Ebenfalls kein Problem. Es wird ebenfalls C6 markiert.

Nun selektieren Sie wieder die Zelle A1 und dann den Kommentar von Zelle C6, aber nicht die Zelle selbst sondern nur das Kommentar-Objekt (in der Regel ein Rechteck). Jetzt wird folgende Anweisung eingegeben:
  ActiveCell.SpecialCells(xlCellTypeComments).Select
Als Ergebnis wird wie erwartet die Zelle C6 markiert. Nochmal zurück zu Excel, die Zelle A1 selektieren und dann wieder das Kommentar-Objekt. Im Direktfenster wird diese Anweisung ausgeführt:
  Selection.SpecialCells(xlCellTypeComments).Select
Was passiert? Der Laufzeitfehler Nr. 438 "Objekt unterstützt diese Eigenschaft oder Methode nicht" erscheint!

OK. Sie werden jetzt vielleicht denken, dass die Fehlermeldung ja logisch ist, da nicht eine Zelle sondern das Kommentar-Objekt aktiviert ist. Ist wirklich keine Zelle aktiv? Geben Sie als Test dies ein:
  ?ActiveCell.Value
Sie erhalten "Ohne Kommentar" zurück, was beweist, dass eine aktive Zelle existiert.

Welches ist die Ursache der Fehlermeldung?
Erfahrene Excel-Programmierer werden den Grund der Fehlermeldung schnell erkennen. Die Ursache liegt in der Definition der Selection-Eigenschaft. Selection gibt nämlich schlicht ein 'Objekt' zurück und nicht ein Range-Objekt. Die Deklaration lautet "Property Selection As Object" im Gegensatz zu beispielsweise der Cells-Eigenschaft "Property Cells As Range". In unserem Problemfall war das referenzierte Objekt ein Kommentar und nicht ein Bereich. Weil Kommentare über keine SpecialCells-Funktion verfügen, wurde der Fehler "Objekt unterstützt diese Eigenschaft oder Methode nicht" ausgelöst.

Was muss bei der Programmierung beachtet werden?
Die Verwendung von Selection als Behälter bzw. Platzhalter für den aktuellen Bereich ist einfach und weit verbreitet. In gewissen Situationen besteht jedoch die Gefahr, dass Selection nicht das erwartete Objekt enthält beziehungsweise den erwarteten Objekttyp aufweist. Wie am Beispiel eines Kommentares zu erkennen ist, ist die Verwendung von ActiveCell gegenüber Selection viel sicherer.

Dieser Code würde bei markiertem Kommentar-Objekt nicht korrekt funktionieren, da Selection in dieser Situation den Objekttyp "TextBox" besitzt und daher die Comment-Eigenschaft nicht kennt:

If Not Selection.Comment Is Nothing Then
   MsgBox Selection.Comment.Text

Else
   MsgBox "Zelle ohne Kommentar"
End If

Die Variante mit ActiveCell dagegen würde auch in diesem Fall korrekt ausgeführt:

If Not ActiveCell.Comment Is Nothing Then
   MsgBox ActiveCell.Comment.Text

Else
   MsgBox
"Zelle ohne Kommentar"
End If

Gelegentlich wird von VBA-Programmierern auch die "On Error Resume Next"-Anweisung eingesetzt, um bei Zellen ohne Kommentar den Laufzeitfehler Nr. 91 "Objektvariable oder With-Blockvariable nicht festgelegt" azufangen. Es wird dabei (vorbildlich) mittels der Codezeile "If Err Then" auf sämtliche Laufzeitfehler getestet, eine Hinweismeldung (MsgBox) eingeblendet und schliesslich mit "On Error GoTo 0" die Unterbrechung der Programmausführung im Falle von Laufzeitfehlern wieder eingeschaltet:

On Error Resume Next
MsgBox Selection.Comment.Text
If Err Then
   MsgBox "Zelle ohne Kommentar"
End If
On Error GoTo 0

Was meinen Sie: Funktioniert der obige Beispielcode korrekt?

Die Antwort ist Nein. Auch wenn die aktive Zelle einen Kommentar besitzt, wird die Meldung "Zelle ohne Kommentar" angezeigt, weil sowohl Laufzeitfehler Nr. 438 "Objekt unterstützt diese Eigenschaft oder Methode nicht" wie auch Laufzeitfehler Nr. 91 (den man eigentlich abfangen wollte) identisch behandelt werden. Würde man im obigen Beispiel 'Selection' durch 'ActiveCell' ersetzen, würde der Code korrekt funktionieren, da der Laufzeitfehler Nr. 438 bei ActiveCell gar nicht auftreten kann.

Mit der TypeName-Funktion kann übrigens der Objekttyp des Selection-Objektes ermittelt werden:
  ?TypeName(Selection)   (ergibt "Range" bei Zellen bzw. "TextBox" bei Kommentaren)

Übersicht

 


Excel 2000-VBA: Performance-Probleme bei Verwendung von "On Error Resume Next"

Zusammenfassung
VBA von Excel 2000 besitzt einen unscheinbaren Bug, der die Ausführungsgeschwindigkeit eines VBA-Programmes stark beeinträchtigt.

Übersicht

 


Excel: Anzeige des Arbeitsmappe-Fensters wird nicht vollständig aktualisiert

Zusammenfassung
Suchen nach: ""
Ersetzen durch: "'$$$"
Alle Ersetzen
Rückgängig

Übersicht

 


Excel-VBA: Validation.Value sagt nicht immer die Wahrheit

Zusammenfassung
Abfragen von Selection.Validation.Value

Übersicht

WB01727_.gif (1537 Byte)

Haben Sie Fragen, Anregungen oder einen Fehler entdeckt?
Senden Sie mir ein Mail

Zuletzt aktualisiert am 6.09.2004 / 20:45 Uhr
© 2002-2004 by Philipp von Wartburg, CH-8917 Oberlunkhofen
Alle Rechte vorbehalten