Bugs, Probleme und Spezialitäten (Excel und VBA)
![]()
| 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
|
![]()
| Verwandte Themen und Seiten » Updates, Service Releases und Service Packs » Verfügbare Hotfixes » XLimits: Limitationen, Spezifikationen und Grenzen |
![]()
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)
![]()
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...)
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...)
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.
... ... ... ...
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)
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.
Excel: Anzeige des Arbeitsmappe-Fensters wird nicht vollständig aktualisiert
Zusammenfassung
Suchen nach: ""
Ersetzen durch: "'$$$"
Alle Ersetzen
Rückgängig
Excel-VBA: Validation.Value sagt nicht immer die Wahrheit
Zusammenfassung
Abfragen von Selection.Validation.Value
![]()
Zuletzt aktualisiert am 6.09.2004
/ 20:45 Uhr
© 2002-2004 by Philipp von Wartburg, CH-8917 Oberlunkhofen
Alle Rechte vorbehalten