Live-Forum - Die aktuellen Beiträge
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: vba array Abfrage ob exist

vba array Abfrage ob exist
21.06.2017 11:25:26
yummi
Hallo Zusammen,
ich habe ein eindimensionales array
Public Myarr() as String
Da es 2 verschiedene Bedienmöglichkeiten für den User gibt, muss ich abfragen, ob das array schon mit Werten befüllt ist oder ob ich das noch machen muss.
Mit UBound geht es nicht, da das array noch nicht dimensioniert ist. IsArray liefert true, auch wenn es noch nicht dimensioniert ist.
Kennt noch jemand eine Möglichkeit abzufragen, ob das array schon dimensioniert ist?
Danke
yummi
Anzeige

17
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: vba array Abfrage ob exist
21.06.2017 11:30:19
Zwenn
Hallo yummi,
Du deklarierst eine Variable vom Typ Boolean. Wenn eine der beiden Methoden, die das Array dimensionieren 'zuschlägt', setzt Du die Variable auf True. Da wo benötigt, fragst du sie vorher einfach ab.
Viele Grüße,
Zwenn
AW: vba array Abfrage ob exist
21.06.2017 11:46:09
yummi
Hallo Zwenn,
der "Umweg" ist zwar nicht schön, aber machbar. Mir ist gerade noch eine andere Möglichkeit eingefallen
On Error Resume Next
lResult = UBound(Myarr)
If CBool(Err.Number 0) Then
dann muss ich nur an eine Stelle ran.
Trotzdem Danke
yummi
Anzeige
AW: vba array Abfrage ob exist
21.06.2017 11:56:46
Zwenn
Ob das ein kleinerer Umweg ist, wage ich zu bezweifeln ;-) Lösungen gibt es aber bekanntlich immer mehrere :-)
AW: vba array Abfrage ob exist
21.06.2017 11:49:38
Daniel
Hi
deklariere die Variable zunächst ganz offen als unbestimmte Variant-Variable:
Public Myarr
und lege Dimension und Typ dann erst beim Befüllen mit ReDim fest.
dann kannst du mit IsEmpty(Myarr) ermitteln, ob die Variable schon werte hat:
If IsEmpty(Myarr) Then
'--- Variable ist leer
Else
'--- Variable hat Werte
End if
Gruß Daniel
Anzeige
AW: vba array Abfrage ob exist
21.06.2017 11:53:45
yummi
Hallo daniel,
IsEmpty hatte ich schon probiert, liefert mir auch bei nicht initialisierten False zurück
Gruß
yummi
AW: vba array Abfrage ob exist
21.06.2017 12:43:17
Daniel
Hi
teste mal genau.
vielleicht bestand noch eine Initialisierung aus einem alten Lauf.
"Globale" Variablen werden ja beim Makrostart nicht zurückgesetzt und behalten ihren Wert.
drücke mal vor dem Test den Button "Zurücksetzen", das löscht dann auch die globalen Variablen.
Gruß Daniel
Anzeige
AW: vba array Abfrage ob exist
21.06.2017 13:44:42
Nepumuk
Hallo yummi,
ein Beispiel:
Option Explicit

Private Declare Function SafeArrayGetDim Lib "oleaut32.dll" ( _
    ByRef psa() As Any) As Long

Public Myarr() As String

Public Sub Test1()
    Call Test2
    Redim Myarr(1 To 10)
    Call Test2
End Sub

Public Sub Test2()
    If SafeArrayGetDim(Myarr) = 0 Then
        Call MsgBox("nicht dimensioniert")
    Else
        Call MsgBox("dimensioniert")
    End If
End Sub

Gruß
Nepumuk
Anzeige
AW: vba array Abfrage ob exist
21.06.2017 15:29:45
yummi
Hallo Nepumuk,
schöne Lösung, gefällt mir gut. Gibt es irgendwo eine Auflistung welche derartige Funktionen es gibt?
Danke
yummi
AW: warum der Aufwand...
21.06.2017 16:08:50
Daniel
wenn man die erstdeklaration richtig macht (als Variant: Public Myarr), funktioniert die Abfrage mit If IsEmpty(Myarr) genauso gut.
Gruß Daniel
AW: warum der Aufwand...
21.06.2017 16:18:35
Nepumuk
Hallo Daniel,
wo siehst du den Aufwand? In der einen Deklarationszeile?
Dafür kann das Array als String deklariert werden was nicht nur wesentlich schneller ist und zudem erheblich weniger Speicher benötigt.
Gruß
Nepumuk
Anzeige
AW: warum der Aufwand...
21.06.2017 16:39:57
Daniel
Der Aufwand besteht darin, das Thema "API-Funktionen" zu erlernen und ggf für eventuelle Nachfolger und Vertreter entsprechend zu dokumentieren. (diese Funktionen sind halt nicht bestand der Online-Hilfe).
Die Deklaration als String kann beim Redim immer noch erfolgen.
Gruß Daniel
AW: warum der Aufwand...
21.06.2017 17:04:00
Nepumuk
Hallo Daniel,
dann wird es Zeit deinen Horizont zu erweiterst.
API's sind extra dafür da in Excel Programme zu ermöglichen die mit reinem VBA nicht, oder nur mit Krücken zu verwirklichen sind. Die gehören für mich zu einem modernen Programmierstiel unbedingt dazu. Ich gehe sogar soweit alles was geht mit API's zu machen denn die sind meistens um den Faktor 100 schneller als das entsprechende VBA-Äquivalent.
Zudem, auch wenn du den Variant als String-Array definierst ist es immer noch ein Variant von Untertype String.
Gruß
Nepumk
Anzeige
AW: warum der Aufwand...
21.06.2017 17:30:54
Daniel
ja, mag sein.
ich bevorzuge es aber, bevor man die Kreise des Horzionts weiter zieht, die weißen Flecken innerhalb des Horizonts zu füllen.
Gruß Daniel
...Zumal man sich dabei zusätzlich abhängig ...
21.06.2017 20:12:12
Luc:-?
…von Windows-Änderungen machen würde, Daniel (& Max);
das mag für Komplett-Projekte, für die auch Wartungsleistungen vereinbart wurden, angehen, kaum aber für kostenfreie Lösungen aus INet-Xl-Foren…
Gruß, Luc :-?
Besser informiert mit …
Anzeige
welche Abhängigkeit?
21.06.2017 20:22:06
Nepumuk
Hallo Luc,
in den letzten 20 Jahren hat sich bezüglich API's nichts geändert. Es sind nur ein paar Bibliotheken dazu gekommen. Da hat sich in VBA mehr getan.
Gruß
Nepumuk
Ah, so; ich meinte abundan mal gelesen zu ...
22.06.2017 00:28:26
Luc:-?
…haben, Max,
dass dieunddie Bibliothek jetzt anders heißt. Das hat mich bisher von API-Verwendung abgeschreckt. Und da ich das ja nicht berufsmäßig betreibe und mich noch dazu auf bestimmte, ebenfalls noch nicht vollends „erforschte“ vbXl-Gebiete spezialisiert habe, war mir das bisher zu „heiß“. Außerdem muss man dann ja auch immer wissen bzw erst herausfinden, welche Bibliothek wofür geeignet ist. Und das ist dann ja ein eigenes Kapitel, dass ich dank anderer bzw weiter­führender Interessen wohl kaum noch „aufzuschlagen“ die Zeit und Muße haben werde…
Morrn, Luc :-?
Anzeige
;

Forumthreads zu verwandten Themen

Anzeige
Entdecke relevante Threads

Schau dir verwandte Threads basierend auf dem aktuellen Thema an

Alle relevanten Threads mit Inhaltsvorschau entdecken
Anzeige
Anzeige

Infobox / Tutorial

VBA Array Abfrage: Prüfen, ob ein Array existiert


Schritt-für-Schritt-Anleitung

Um in VBA zu prüfen, ob ein Array bereits existiert oder leer ist, kannst Du folgende Schritte ausführen:

  1. Deklaration des Arrays: Beginne mit der Deklaration des Arrays. Du kannst es als Public Myarr() deklarieren.

    Public Myarr() As String
  2. Überprüfung, ob das Array leer ist: Eine gängige Methode ist die Verwendung von On Error Resume Next, um einen Fehler abzufangen, wenn das Array nicht dimensioniert ist.

    On Error Resume Next
    lResult = UBound(Myarr)
    If Err.Number <> 0 Then
       MsgBox "Das Array ist nicht dimensioniert."
    Else
       MsgBox "Das Array ist dimensioniert."
    End If
    On Error GoTo 0
  3. Initialisierung des Arrays: Wenn Du das Array mit Werten füllen möchtest, kannst Du dies mit ReDim tun.

    ReDim Myarr(1 To 10)
  4. Prüfen auf Werte im Array: Um zu prüfen, ob ein bestimmter Wert im Array vorhanden ist, kannst Du eine Schleife verwenden.

    Dim valueToCheck As String
    valueToCheck = "DeinWert"
    Dim exists As Boolean
    exists = False
    
    For i = LBound(Myarr) To UBound(Myarr)
       If Myarr(i) = valueToCheck Then
           exists = True
           Exit For
       End If
    Next i
    
    If exists Then
       MsgBox "Wert ist im Array vorhanden."
    Else
       MsgBox "Wert ist nicht im Array vorhanden."
    End If

Häufige Fehler und Lösungen

  • Fehler: UBound gibt einen Fehler zurück: Dies geschieht, weil das Array nicht dimensioniert ist. Verwende On Error Resume Next, um diesen Fehler abzufangen.

  • Fehler: IsEmpty gibt False zurück: Dies kann passieren, wenn das Array global deklariert wurde und bei einem vorherigen Lauf bereits Werte hatte. Stelle sicher, dass Du die Variablen zurücksetzt.


Alternative Methoden

  • Verwendung von Variant: Du kannst das Array als Variant deklarieren und dann mit IsEmpty prüfen.

    Public Myarr As Variant
    If IsEmpty(Myarr) Then
       MsgBox "Das Array ist leer."
    End If
  • API-Funktion: Eine weitere Möglichkeit besteht darin, die API-Funktion SafeArrayGetDim zu verwenden, um die Dimension des Arrays abzufragen.


Praktische Beispiele

Hier ist ein einfaches Beispiel, um die Funktionsweise zu demonstrieren:

Public Myarr() As String

Sub TestArray()
    ' Prüfen, ob das Array dimensioniert ist
    On Error Resume Next
    If UBound(Myarr) < LBound(Myarr) Then
        MsgBox "Array ist leer oder nicht dimensioniert."
    Else
        MsgBox "Array ist dimensioniert."
    End If
    On Error GoTo 0

    ' Dimensionierung des Arrays
    ReDim Myarr(1 To 5)
    Myarr(1) = "Wert1"
    Myarr(2) = "Wert2"

    ' Prüfen auf Werte im Array
    If IsArray(Myarr) Then
        MsgBox "Array hat Werte."
    End If
End Sub

Tipps für Profis

  • Verwende Option Explicit: Dies hilft, Tippfehler bei Variablen zu vermeiden und die Codequalität zu verbessern.
  • Initialisiere Arrays immer: Vermeide Fehler, indem Du alle Arrays vor der Verwendung initialisierst.
  • Nutze Debug.Print: Verwende diese Funktion, um Werte während der Entwicklung zu überprüfen, ohne Dialogfenster zu verwenden.

FAQ: Häufige Fragen

1. Wie kann ich prüfen, ob ein Array leer ist? Verwende On Error Resume Next in Kombination mit UBound, um festzustellen, ob das Array dimensioniert ist.

2. Was ist der Unterschied zwischen IsEmpty und UBound? IsEmpty prüft, ob eine Variable einen Wert hat, während UBound die obere Grenze eines Arrays zurückgibt und einen Fehler auslöst, wenn das Array nicht dimensioniert ist.

3. Wie kann ich sicherstellen, dass mein Array immer einen Standardwert hat? Du kannst das Array mit ReDim initialisieren und ihm Standardwerte zuweisen, um sicherzustellen, dass es nicht leer bleibt.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige