Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: Datenfeld oder benutzerdefinierter Typ erwartet

Datenfeld oder benutzerdefinierter Typ erwartet
Martin
Hallo,
nachdem ich mir nun schon die halbe Nacht um die Ohren geschlagen habe, frage ich euch um Rat. Es geht um die Problematik ein Array von einem Makro an ein anderes Makro zu übertragen. Leider erhalte ich immer die Fehlermeldung "Unverträglicher Typ: Datenfeld oder benutzerdefinierter Typ erwartet". Wie kann ich das Array von dem Makro "ArrayTest" an das Makro "Sortiermakro" übergeben? Ich hoffe, dass mir hier jemand helfen kann ;-)
Viele Grüße
Martin
Option Explicit
Sub ArrayTest()
Dim j As Long, i As Long
'Array anlegen und mit Daten füllen
Dim TestArray As Variant
ReDim TestArray(1 To 50, 1 To 10)
For j = 1 To UBound(TestArray, 1)
For i = 1 To UBound(TestArray, 2)
TestArray(j, i) = j + i - 2
Next i
Next j
'Hier mein Problem: Array an anderes Makro übergeben
Call Sortiermakro(TestArray)
End Sub
Sub Sortiermakro(DatenArray As Variant)
Dim Arrk As Variant
Arrk = Array(-2, -3)
Call prcSort(Arrk, DatenArray)
End Sub
'Quicksort mit mehreren Sortierkriterien
'  Parameter:  arrK = Sortkey(s)
'              arrD = zu sortierendes Array
'  Ist die Zahl positiv, wird aufsteigend, sonst absteigend sortiert.
Public Sub prcSort(Arrk As Variant, arrD() As Variant)
Dim iiK As Integer, nnB As Long, nnC As Long, nArrZ() As Long
Dim nnZ As Long, nnA As Long, vntTemp As Variant
ReDim nArrZ(0 To 1, 0 To UBound(arrD) * 2)
nArrZ(0, 0) = LBound(arrD)                ' Array für den 1. Sortierlauf
nArrZ(0, 1) = UBound(arrD)
nnZ = 1
For iiK = LBound(Arrk) To UBound(Arrk)
If Arrk(iiK)  0 Then                 ' Wenn eine Spalte angegeben
nnA = -1
For nnB = 0 To nnZ Step 2           ' Schleife zum sortieren der Bereiche
If nArrZ(0, nnB)  nArrZ(0, nnB + 1) Then   ' Sortieren, wenn Zeilenzahl > 1
Call prcQSort(CLng(nArrZ(0, nnB)), _
CLng(nArrZ(0, nnB + 1)), CInt(Abs(Arrk(iiK))), _
CBool(Arrk(iiK) > 0), arrD())
nnA = nnA + 2                       ' sortierten Bereich merken
nArrZ(1, nnA - 1) = nArrZ(0, nnB)
nArrZ(1, nnA) = nArrZ(0, nnB + 1)
End If
Next
nnZ = -1
For nnB = 0 To nnA Step 2  'Durchsuchen der sortierten Spalte nach Wertewechsel
vntTemp = arrD(nArrZ(1, nnB), Abs(Arrk(iiK))) '1. Zeile des zu sort. Bereichs
nnZ = nnZ + 1
nArrZ(0, nnZ) = nArrZ(1, nnB)
For nnC = nArrZ(1, nnB) To nArrZ(1, nnB + 1)  ' Suche nach Wechsel im Bereich
If vntTemp  arrD(nnC, Abs(Arrk(iiK))) Then
nnZ = nnZ + 2
nArrZ(0, nnZ - 1) = nnC - 1
nArrZ(0, nnZ) = nnC
vntTemp = arrD(nnC, Abs(Arrk(iiK)))
End If
Next
nnZ = nnZ + 1                                 ' letzte Zeile im Bereich
nArrZ(0, nnZ) = nArrZ(1, nnB + 1)
Next nnB
End If
Next iiK
End Sub
Private Sub prcQSort(lngLB As Long, lngUB As Long, iiZ As Integer, _
bAufAb As Boolean, arrD())
Dim iiK As Integer, nnB As Long, nnC As Long, vntTemp As Variant, vntBuffer As Variant
nnB = lngLB
nnC = lngUB
vntBuffer = arrD((lngLB + lngUB) \ 2, iiZ)
Do
If bAufAb Then
Do While arrD(nnB, iiZ)  vntBuffer: nnB = nnB + 1: Loop
Do While vntBuffer > arrD(nnC, iiZ): nnC = nnC - 1: Loop
End If
If nnB  arrD(nnC, iiZ) Then
For iiK = LBound(arrD, 2) To UBound(arrD, 2)
vntTemp = arrD(nnB, iiK)
arrD(nnB, iiK) = arrD(nnC, iiK)
arrD(nnC, iiK) = vntTemp
Next
End If
nnB = nnB + 1
nnC = nnC - 1
ElseIf nnB = nnC Then
nnB = nnB + 1
nnC = nnC - 1
End If
Loop Until nnB > nnC
If lngLB 

Anzeige
Leider klappt es immer noch nicht...
22.02.2011 11:19:29
Martin
Hallo Oberschlumpf,
vielen Dank für deine Antwort. Leider bin ich trotzdem nicht weitergekommen und erhalte weiterhin die Fehlermeldung "Unverträglicher Typ: Datenfeld oder benutzerdefinierter Typ erwartet". Vermutlich liegt es daran, dass in dem Beispiel ein eindimensionales Array als String übergeben wird. Ich möchte jedoch ein zweidimensionales Array weitergeben. Hast du vielleicht eine weitere Idee?
Viele Grüße
Martin
Anzeige
AW: Leider klappt es immer noch nicht...
22.02.2011 11:54:20
Oberschlumpf
Hi
Anstelle einer Sub könntest du ja dein Array auch an eine Function übergeben.
Hier steht, wie es geht:
http://www.computerhilfen.de/hilfen-14-91899-0.html
Hilfts?
Ciao
Thorsten
Klappt auch nicht, vermutlich muss ein Profi heran
22.02.2011 12:27:44
Martin
Hallo Thorsten,
vielen Dank für den erneuten Vorschlag. Aber leider erscheint nach wie vor die selbe Fehlermeldung. Vielleicht schaut auch noch ein Excel-Profi über meinen Code und weiß Rat.
Viele Grüße
Martin
Option Explicit
Sub ArrayTest()
Dim j As Long, i As Long
'Array anlegen und mit Daten füllen
Dim TestArray As Variant
ReDim TestArray(1 To 50, 1 To 10)
For j = 1 To UBound(TestArray, 1)
For i = 1 To UBound(TestArray, 2)
TestArray(j, i) = j + i - 2
Next i
Next j
'Hier mein Problem: Array an anderes Makro übergeben
Sortiermakro (TestArray)
End Sub
Function Sortiermakro(DatenArray As Variant)
Dim Arrk As Variant
Arrk = Array(-2, -3)
Call prcSort(Arrk, DatenArray)
End Function
'Quicksort mit mehreren Sortierkriterien
'  Parameter:  arrK = Sortkey(s)
'              arrD = zu sortierendes Array
'  Ist die Zahl positiv, wird aufsteigend, sonst absteigend sortiert.
Public Sub prcSort(Arrk As Variant, arrD() As Variant)
Dim iiK As Integer, nnB As Long, nnC As Long, nArrZ() As Long
Dim nnZ As Long, nnA As Long, vntTemp As Variant
ReDim nArrZ(0 To 1, 0 To UBound(arrD) * 2)
nArrZ(0, 0) = LBound(arrD)                ' Array für den 1. Sortierlauf
nArrZ(0, 1) = UBound(arrD)
nnZ = 1
For iiK = LBound(Arrk) To UBound(Arrk)
If Arrk(iiK)  0 Then                 ' Wenn eine Spalte angegeben
nnA = -1
For nnB = 0 To nnZ Step 2           ' Schleife zum sortieren der Bereiche
If nArrZ(0, nnB)  nArrZ(0, nnB + 1) Then   ' Sortieren, wenn Zeilenzahl > 1
Call prcQSort(CLng(nArrZ(0, nnB)), _
CLng(nArrZ(0, nnB + 1)), CInt(Abs(Arrk(iiK))), _
CBool(Arrk(iiK) > 0), arrD())
nnA = nnA + 2                       ' sortierten Bereich merken
nArrZ(1, nnA - 1) = nArrZ(0, nnB)
nArrZ(1, nnA) = nArrZ(0, nnB + 1)
End If
Next
nnZ = -1
For nnB = 0 To nnA Step 2  'Durchsuchen der sortierten Spalte nach Wertewechsel
vntTemp = arrD(nArrZ(1, nnB), Abs(Arrk(iiK))) '1. Zeile des zu sort. Bereichs
nnZ = nnZ + 1
nArrZ(0, nnZ) = nArrZ(1, nnB)
For nnC = nArrZ(1, nnB) To nArrZ(1, nnB + 1)  ' Suche nach Wechsel im Bereich
If vntTemp  arrD(nnC, Abs(Arrk(iiK))) Then
nnZ = nnZ + 2
nArrZ(0, nnZ - 1) = nnC - 1
nArrZ(0, nnZ) = nnC
vntTemp = arrD(nnC, Abs(Arrk(iiK)))
End If
Next
nnZ = nnZ + 1                                 ' letzte Zeile im Bereich
nArrZ(0, nnZ) = nArrZ(1, nnB + 1)
Next nnB
End If
Next iiK
End Sub
Private Sub prcQSort(lngLB As Long, lngUB As Long, iiZ As Integer, _
bAufAb As Boolean, arrD())
Dim iiK As Integer, nnB As Long, nnC As Long, vntTemp As Variant, vntBuffer As Variant
nnB = lngLB
nnC = lngUB
vntBuffer = arrD((lngLB + lngUB) \ 2, iiZ)
Do
If bAufAb Then
Do While arrD(nnB, iiZ)  vntBuffer: nnB = nnB + 1: Loop
Do While vntBuffer > arrD(nnC, iiZ): nnC = nnC - 1: Loop
End If
If nnB  arrD(nnC, iiZ) Then
For iiK = LBound(arrD, 2) To UBound(arrD, 2)
vntTemp = arrD(nnB, iiK)
arrD(nnB, iiK) = arrD(nnC, iiK)
arrD(nnC, iiK) = vntTemp
Next
End If
nnB = nnB + 1
nnC = nnC - 1
ElseIf nnB = nnC Then
nnB = nnB + 1
nnC = nnC - 1
End If
Loop Until nnB > nnC
If lngLB 

Anzeige
AW: Datenfeld oder benutzerdefinierter Typ erwartet
22.02.2011 13:42:04
Rudi
Hallo,
nimm mal überall hinter arrD die () weg.
Gruß
Rudi
Ja, jetzt funktioniert es! Aber warum?
22.02.2011 14:02:24
Martin
Hallo Rudi,
vielen Dank für den hilfreichen Tipp, nun scheint alles zu funktionieren. Könntest du mir bitte _ erklären was es mit dem "()" auf sich hat? Kannst du mir auch den Unterschied zwischen

Dim TestArray As Variant
und

Dim TestArray()
erklären?
Ich freue mich natürlich sehr, dass nun alles klappt und bin dir dafür auch äußerst dankbar. Perfekt wäre es nun, wenn verstehen würde, warum es nun so gut klappt.
Viele Grüße
Martin
Anzeige
;
Anzeige
Anzeige

Infobox / Tutorial

Datenfeld oder benutzerdefinierter Typ erwartet in VBA


Schritt-für-Schritt-Anleitung

  1. Array erstellen und füllen: Erstelle ein zweidimensionales Array in deinem Makro. Beispiel:

    Dim TestArray As Variant
    ReDim TestArray(1 To 50, 1 To 10)
    For j = 1 To UBound(TestArray, 1)
       For i = 1 To UBound(TestArray, 2)
           TestArray(j, i) = j + i - 2
       Next i
    Next j
  2. Array übergeben: Um das Array an ein anderes Makro oder eine Funktion zu übergeben, stelle sicher, dass du die Parameter korrekt definierst. Beispiel:

    Call Sortiermakro(TestArray)

    oder in einer Funktion:

    Sortiermakro TestArray
  3. Datenfeld korrekt deklarieren: Achte darauf, dass die Parameter der aufgerufenen Sub oder Function korrekt als Variant deklariert werden:

    Sub Sortiermakro(DatenArray As Variant)

Häufige Fehler und Lösungen

  • Fehler: "Unverträglicher Typ: Datenfeld oder benutzerdefinierter Typ erwartet"

    • Lösung: Überprüfe, ob du das Array korrekt übergibst. Achte darauf, dass du die Klammern bei der Übergabe eines Arrays weglässt, zum Beispiel:
      Sortiermakro TestArray
  • Fehler: "End Sub erwartet"

    • Lösung: Stelle sicher, dass alle deine Subroutinen und Funktionen korrekt mit End Sub oder End Function abgeschlossen sind.

Alternative Methoden

  • Verwendung von Funktionen anstelle von Subs: Du kannst dein Array auch an eine Funktion übergeben, die dann das Array bearbeitet und zurückgibt. Beispiel:

    Function Sortiermakro(DatenArray As Variant) As Variant
      ' Bearbeitung des Arrays
      Sortiermakro = DatenArray ' Rückgabe des bearbeiteten Arrays
    End Function

Praktische Beispiele

Hier ist ein einfaches Beispiel, wie du ein zweidimensionales Array in einem VBA-Makro erstellen und übergeben kannst:

Option Explicit

Sub ArrayTest()
    Dim TestArray As Variant
    ReDim TestArray(1 To 5, 1 To 5)

    ' Füllung des Arrays
    Dim j As Long, i As Long
    For j = 1 To 5
        For i = 1 To 5
            TestArray(j, i) = j * i
        Next i
    Next j

    ' Übergabe des Arrays
    Call Sortiermakro(TestArray)
End Sub

Sub Sortiermakro(DatenArray As Variant)
    ' Sortiere oder bearbeite das DatenArray hier
End Sub

Tipps für Profis

  • Achte darauf, dass du bei der Übergabe von Arrays die Typen korrekt angibst, um Fehler wie "vba erwartet datenfeld" zu vermeiden.
  • Nutze Option Explicit am Anfang deiner Module, um sicherzustellen, dass alle Variablen deklariert sind.

FAQ: Häufige Fragen

1. Was ist der Unterschied zwischen Dim TestArray As Variant und Dim TestArray()? Der erste Ausdruck erstellt ein Variant, das als Array verwendet werden kann, während der zweite Ausdruck ein leeres Array deklariert, das später mit ReDim dimensioniert werden muss.

2. Warum erhalte ich immer noch die Fehlermeldung "Unverträglicher Typ"? Stelle sicher, dass du die Klammern bei der Übergabe des Arrays weglässt. Die korrekte Syntax ist Sortiermakro TestArray, nicht Sortiermakro(TestArray).

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