2016-10-12 4 views
1

こんにちは私はこのウェブサイトが私に与えたさまざまな解決策を試みてきましたが、コードを実行することはできません。私はユーザー定義のType()とSub()と関数を持っています。このように:関数からユーザ定義配列を返す

Type Base 
    UT As String 
    N_Inic As Integer 
    N_Fin As Integer 
    Largo As Integer 
End Type 

Sub Test() 

    Dim A() As Base 

    A = Base() 

End Sub 

Function Base() As Base 
    Sheets("ARISTAS").Select 
    ActiveSheet.Cells(2, 1).Select 
    j = 2 
    b = 0 
    Set UT_Range = Range(ActiveCell, Cells(Rows.Count,_ Selection.Column).End(xlUp)) 
    Total_1 = UT_Range.Count 
    Dim Base_UT() As Base 
    ReDim Base_UT(Total_1) 

    While Sheets("ARISTAS").Cells(j, 1).Value 
     Base_UT(b).UT = Sheets("ARISTAS").Cells(j, 1).Value 
     Base_UT(b).N_Inic = Sheets("ARISTAS").Cells(j, 2).Value 
     Base_UT(b).N_Fin = Sheets("ARISTAS").Cells(j, 3).Value 
     Base_UT(b).Largo = Sheets("ARISTAS").Cells(j, 9).Value '** 
     b = b + 1 
     j = j + 1 
    Wend 
    Base = Base_UT 
End Function 

私はサブを実行すると、それはそれは、マトリックスとハイライトに割り当てることができないと述べた ""

誰もがなぜ知っています?

おかげでそんなに

+1

関数が配列を返していることを確認してください: 'Function Base()As Base()'? –

+0

それは働いた!ありがとう兄貴! – Andy

+0

乾杯、解決策が働いている場合は、「受け入れられた」回答とマークすることを検討してください:) –

答えて

0

あなたがタイプBaseの配列としてA()を宣言していて、またBase呼ばれる機能を含めています。メンテナンスと読みやすさの観点からは、これは悪い考えです。あなたの関数に別の名前を付けることを強くお勧めします。

Sub Test() 

    Dim a() As Base 

    a = GetBase() 

End Sub 

Function GetBase() As Base() 
    Dim Total_1 As Long 
    Dim b As Long 
    b = 0 
    Total_1 = 0 
    Dim Base_UT() As Base 
    ReDim Base_UT(Total_1) 

     Base_UT(b).UT = "string" 
     Base_UT(b).N_Inic = 1 
     Base_UT(b).N_Fin = 2 
     Base_UT(b).Largo = 3 

    GetBase = Base_UT 
End Function 
+0

申し訳ありません。あなたが気にしないなら、私はそれがカバーする他の問題のために私の解決策を残すだろう – user3598756

0

代わりに:

Function Base() As Base 

使用:

Function Base() As Base() 

アレイを戻すために、私は、これが機能シグネチャを微調整することにより仕事を得ることができる簡単な例を用いて、前記すなわち

しかし、あなたのコードには他の可能性のある欠陥があるので、次のコードは避けてください

Function Base1() As Base() 
    Dim b As Long, Total_1 As Long 
    Dim UT_Range As Range, cell As Range 

    With sheets("ARISTAS") 
     Set UT_Range = .Range(.Cells(2, 1), .Cells(Rows.Count, 1).End(xlUp)) 
     Total_1 = UT_Range.Count - 1 
     ReDim Base_UT(Total_1) As Base 

     For Each cell In UT_Range.SpecialCells(XlCellType.xlCellTypeConstants) 
      Base_UT(b).UT = cell.Value 
      Base_UT(b).N_Inic = cell.Offset(, 1).Value 
      Base_UT(b).N_Fin = cell.Offset(, 2).Value 
      Base_UT(b).Largo = cell.Offset(, 8).Value '** 
      b = b + 1 
     Next cell 
     ReDim Preserve Base_UT(b - 1) 
    End With 

    Base1 = Base_UT 
End Function 

あなたは私もここでUDT名に

0

と一致していない関数名を変更し見るようにあなたの質問に基づいて非常に単純な例です:

Type Base 
    UT As String 
    N_Inic As Integer 
    N_Fin As Integer 
    Largo As Integer 
End Type 

Sub MAIN() 
    Dim alpha As Base 
    alpha = whatever() 
    MsgBox alpha.UT & alpha.N_Inic & alpha.N_Fin & alpha.Largo 
End Sub 

Public Function whatever() As Base 
    Dim poiuyt As Base 

    poiuyt.UT = "hello" 
    poiuyt.N_Inic = 11 
    poiuyt.N_Fin = 17 
    poiuyt.Largo = 19 
    whatever = poiuyt 
End Function 

それは内部の変数を使用しています関数内にBaseと入力して戻します。

enter image description here

関連する問題