Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

[XL2003 SP3] Nicht vorhandenen Verweis "entfernen" per VBA

310 views
Skip to first unread message

Jörg Eisenträger

unread,
Mar 12, 2009, 3:38:37 PM3/12/09
to
Hallo,

bei einem unserer Datenbanksysteme wurde in einer neuen Version die
VBA-API geändert. :-(
In bestimmten Exceldateien muss deshalb jetzt ein neuer Verweis
eingebunden werden. In den Vorlagen für neue Dateien haben wir das
gemacht, kein Problem.

Beim Öffnen von alten Dateien möchte ich die Verweise per Makro
austauschen, wenn der neue noch nicht drin ist. Dabei entsteht das
Problem, das der alte Verweis in der Verweisliste oft wie folgt
angegeben ist:
[X] NICHT VORHANDEN: VerweisNameAlt

In einer Schleife zur Auflistung der Verweisnamen, z. B.
For i = 1 To ActiveWorkbook.VBProject.References.Count
MsgBox ActiveWorkbook.VBProject.References(i).Name
Next i
führt der Eintrag "NICHT VORHANDEN: VerweisNameAlt" zu einem
Laufzeitfehler bei der Ermittlung der Name-Eigenschaft. Obwohl er in
References.Count mitgezählt wird, hat er offenbar keinen richtigen
Namen.

Wie kann ich den Index oder Namen(?) dieses angekreuzten Eintrags per
VBA ermitteln, um den Eintrag dann zu entfernen (z. B. mit
.References.Remove .References(i) )?


Gruß
Jörg
--
LPs auf CD brennen - so geht's: http://www.joergei.de/
E-Mail-Adresse existiert, wird aber nicht gelesen.

Michael v. Fondern

unread,
Mar 12, 2009, 4:00:41 PM3/12/09
to
Hallo Jörg,

> In einer Schleife zur Auflistung der Verweisnamen, z. B.
> For i = 1 To ActiveWorkbook.VBProject.References.Count
> MsgBox ActiveWorkbook.VBProject.References(i).Name
> Next i
> führt der Eintrag "NICHT VORHANDEN: VerweisNameAlt" zu einem
> Laufzeitfehler bei der Ermittlung der Name-Eigenschaft. Obwohl er in
> References.Count mitgezählt wird, hat er offenbar keinen richtigen
> Namen.
>
> Wie kann ich den Index oder Namen(?) dieses angekreuzten Eintrags per
> VBA ermitteln, um den Eintrag dann zu entfernen (z. B. mit
> .References.Remove .References(i) )?

ohne es getestet zu haben: hast du schon mal versucht,
Application.DisplayAlerts = False
zu setzen, bevor du den obigen Aufruf machst?

(anschließend
Application.DisplayAlerts = True
nicht vergessen)

Grüße

- Michael -

Jörg Eisenträger

unread,
Mar 16, 2009, 1:48:04 PM3/16/09
to

Hallo Michael,

>> Verweis "NICHT VORHANDEN: VerweisNameAlt" entfernen per VBA

>ohne es getestet zu haben: hast du schon mal versucht,
> Application.DisplayAlerts = False
>zu setzen, bevor du den obigen Aufruf machst?

Es hat sich herausgestellt, dass .DisplayAlerts = False und On Error
Resume Next zwar die Laufzeitfehlermeldung unterdrücken, trotzdem läuft
jeder Versuch, per VBA etwas mit dem nicht vorhandenen Verweis zu
machen, in einen Fehler - egal, ob man ihn per Name oder per Index
anspricht.

Letztendlich habe ich es so gemacht wie hier beschrieben:
http://www.vbaexpress.com/kb/getarticle.php?kb_id=272

Ist aber unbefriedigend, dass die "missing references" nur händisch
entfernt werden können. Wäre schön, wenn es doch eine VBA-Lösung gäbe.

Thomas Ramel

unread,
Mar 16, 2009, 4:07:30 PM3/16/09
to
Grüezi Jörg

Jörg Eisenträger schrieb am 16.03.2009

>>> Verweis "NICHT VORHANDEN: VerweisNameAlt" entfernen per VBA
>
>>ohne es getestet zu haben: hast du schon mal versucht,
>> Application.DisplayAlerts = False
>>zu setzen, bevor du den obigen Aufruf machst?
>
> Es hat sich herausgestellt, dass .DisplayAlerts = False und On Error
> Resume Next zwar die Laufzeitfehlermeldung unterdrücken, trotzdem läuft
> jeder Versuch, per VBA etwas mit dem nicht vorhandenen Verweis zu
> machen, in einen Fehler - egal, ob man ihn per Name oder per Index
> anspricht.

Ja, das ist wohl korrekt so - VBA reagiert dann mit den 'nettesten'
Meldungen und meckert Code an, der an sich völlig in Ordnung ist.

> Letztendlich habe ich es so gemacht wie hier beschrieben:
> http://www.vbaexpress.com/kb/getarticle.php?kb_id=272
>
> Ist aber unbefriedigend, dass die "missing references" nur händisch
> entfernt werden können. Wäre schön, wenn es doch eine VBA-Lösung gäbe.

*Musst* du denn harte Verweise verwenden oder wäre eine Lösung mit 'late
binding' denkbar?

Anwendungen mit 'late binding' sind auf ändernde Bibliotheken viel weniger
anfällig als solche mit 'early binding'. Im Netz gibt es einiges an
Literatur und Stoff zu diesem Thema.


Mit freundlichen Grüssen
Thomas Ramel

--
- MVP für Microsoft-Excel -
[Vista Ultimate SP-1 / xl2007 SP-1]

Jörg Eisenträger

unread,
Mar 16, 2009, 4:59:39 PM3/16/09
to

Hallo Thomas,

>*Musst* du denn harte Verweise verwenden oder wäre eine Lösung mit 'late
>binding' denkbar?

Bei den alten Dokumenten ist der Zug abgefahren, die haben nun mal den
Verweis per early binding drin. Und um diese geht es.

Die neue API-dll wollte ich mit late binding einbinden. Leider liefert
mir hierbei immer und reproduzierbar die API-Anwendung den berühmten run
time error 429. Die haben da wohl noch einen Bug drin. Da hoffe ich noch
auf eine ausgereiftere Version

0 new messages