2016-03-20 12 views
1

ich einen User Defined Type, Entscheidung habe:Wie Array von benutzerdefinierten Typen zurückzukehren, und dann als Argument übergibt in VBA

Public Type Decision 
    choice As String 
    cost As Double 
End Type 

Ich versuche, eine Reihe von meiner UDTs zu verwenden, um die Ergebnisse zu speichern, eines dynamischen Programms (Auswahl und Kosten für eine Bühne/einen Staat).

Public Function DPSolve(arg1, arg2, ...) as Decision 
     Dim Table() As Decision 
     ReDim Table(arg1, arg2+ 1) 

     'do stuff that fills each Table().choice and Table().cost 

     'return Table() 
     DPSolve = Table() 
End Function 

Wenn ich will, um dann das Ergebnis dieser Funktion auf eine neue Funktion übergeben (sagen, drucken Sie die Tabelle() in Excel oder mehr Arbeit tun, um die Tabelle() belegt wird, wie kann ich dies tun ?

ich versuche

Sub Main 
    Dim x as variant 

    x = DPSolve(arg1, arg2, ...) 

    Function2(x) 
End Main 

aber ich erhalte die folgende Fehlermeldung: Compile Error

ich versucht habe, x ein Array zu machen, aber ich erhalte eine „ca nicht dem Array "Fehler zuweisen. Ich habe auch versucht, x eine Entscheidung zu treffen, aber das hat auch nicht funktioniert. Der Code befindet sich in einem Modul.

Danke!

Antwort

3

Also DPSolve soll ein Array von Decision s zurückgeben. Und x() soll auch ein Array von Decision s sein.

Public Type Decision 
    choice As String 
    cost As Double 
End Type 

Public Function DPSolve(arg1, arg2) As Decision() 
     Dim Table() As Decision 
     ReDim Table(arg1, arg2 + 1) 

     'do stuff that fills each Table().choice and Table().cost 

     'return Table() 
     DPSolve = Table() 
End Function 

Sub Main() 
    Dim x() As Decision 

    x = DPSolve(2, 2) 

End Sub 

Funktioniert für mich. Beispiel:

Public Type Decision 
    choice As String 
    cost As Double 
End Type 

Public Function DPSolve(arg1, arg2) As Decision() 
     Dim Table() As Decision 
     ReDim Table(arg1, arg2 + 1) 

     'do stuff that fills each Table().choice and Table().cost 

     Table(1, 2).choice = "choice1,2" 
     Table(1, 2).cost = 123.45 

     'return Table() 
     DPSolve = Table() 
End Function 

Sub Main() 
    Dim x() As Decision 

    x = DPSolve(2, 2) 

    MsgBox x(1, 2).choice 
    MsgBox x(1, 2).cost 


End Sub 

Um mit "Kann nicht zu einem Array zuweisen" klar zu sein. Sie können ein dimensioniertes und gefülltes Array vom Typ "Type" und "Größe" keinem anderen Array vom Typ "Type" und "Größe" zuweisen. Aber Sie können sicherlich eine gefüllte Array zu einem Typ dimensioniert aber nicht Größe dimensionierte Array zuweisen.

Sub test() 

Dim arr1(3) As String 
Dim arr2() As String 

arr1(0) = "Value 0" 
arr1(1) = "Value 1" 
arr1(2) = "Value 2" 
arr1(3) = "Value 3" 

arr2 = arr1 

MsgBox Join(arr2, ", ") 

End Sub 
+0

Ich habe nie verstanden, warum MS Casting zu Varianten von VT_USERDEFINED nicht unterstützt ... – Comintern

+0

Ich habe dies versucht, aber bekam einen Fehler "kann nicht zu Array zuweisen". Ich glaube nicht, dass Sie Arrays wie a1() = a2() in VBA zuweisen können. Siehe https://msdn.microsoft.com/en-us/library/office/gg264711.aspx – Mark

+0

Sicher haben Sie genau diesen Code ausprobiert? 'Öffentliche Funktion DPSolve (arg1, arg2) Als Decision()' notiere die Klammern hinter 'Decision()'. –

0

Der Fehler bedeutet, dass Sie einer Variante keinen definierten Typ zuordnen können. So benötigen Sie entweder den Typ der variablen

Public Type Decision 
    choice As String 
    cost As Double 
End Type 

Public Sub DPSolve(source, arg1, arg2) 
    ReDim source(arg1, arg2 + 1) 
End Sub 

Sub Main() 
    Dim x() As Decision 
    DPSolve x, 4, 4 
End Sub 

definiert haben oder wenn Sie wirklich eine Variante verwenden möchten, dann müssen Sie eine Klasse verwenden:

Public Sub DPSolve(source, arg1, arg2) 
    Dim i&, j& 
    ReDim source(0 To arg1, 0 To arg2 + 1) As Decision 
    For i = 0 To arg1 
    For j = 0 To arg2 + 1 
     Set source(i, j) = New Decision 
    Next 
    Next 
End Sub 

Sub Main() 
    Dim x 
    DPSolve x, 4, 4 
End Sub 

Klasse Beschluss: