2014-12-01 4 views
0

특정 시나리오에 따라 배열을 조작 할 함수에 빈 배열을 전달하려고합니다. 내가이 문제로 어디서 잘못 될지는 모르지만 다음과 같은 오류가 발생합니다 Type mismatch. 아래는 내가 빈 배열을 만드는 오전 방법을 보여줍니다 아래 빈 배열을 함수에 전달하여 여기에 채우십시오.

Dim testArray(0 to 10) as string 
Dim ABredu() As String 
ABredu = Equipment(testArray) 

나는 누군가가 나를 도울 또는 올바른 방향으로 밀어 줄 수 있다면 배열

Function Equipment(Test() As String) 
    If standYes = True And .ComboBox2.ListIndex = 0 Then 
     ReDim ABredu(1 To 3) 
     ABredu(1) = "Pen" 
     ABredu(2) = "Ruler" 
     ABredu(3) = "Monitor" 
    Else 
     ReDim ABredu(1 To 3) 
     ABredu(1) = "17-P2" 
     ABredu(2) = "17-L73" 
     ABredu(3) = "16-ENR" 
    End If 
End sub 

을 채우기 위해 작성한 기능을 보여줍니다 그것을 대단히 감사하겠습니다!

+0

매크로 subs은 값을 반환하지 않습니다. 오직 함수 만 그렇게합니다. 'ABredu' 변수가'Public'이라면 배열을 다시 건네주지 않고 채우기 위해'Equipment'를 사용할 수 있습니다 만,'Equipment'를 함수로 변경하고 배열을 다시 전달할 수 있습니다. – Jeeped

+0

나는 지금 여기에서 질문을 편집하여 내가 지금 가지고있는 것을보고 받아 들인다. – user3538102

+0

질문이 편집되었습니다 – user3538102

답변

3

변형을 기준으로 배열을 전달하십시오.

Function Equipment(ByRef Test As Variant) 
    If standYes = True And .ComboBox2.ListIndex = 0 Then 
     ReDim Test(1 To 3) 
     Test(1) = "Pen" 
     Test(2) = "Ruler" 
     Test(3) = "Monitor" 
    Else 
     ReDim Test(1 To 3) 
     Test(1) = "17-P2" 
     Test(2) = "17-L73" 
     Test(3) = "16-ENR" 
    End If 
End sub 
+0

이 코드 줄에서 erro'type mismatch'를받는 중입니다. 'ABredu = Equipment (testArray)' – user3538102

+0

VBA의 기본값은 'ByRef'입니다. , 그것뿐만 아니라 당신이 제시 한 기능은 여전히 ​​의미가 거의 없습니다. 서있는 것이 맞습니까? .ComboBox2 란 무엇입니까? 도대체 ABredu라고하는이 변수가 어디에서 왔습니까? @ user3538102가이 사실을 깨닫게 될지도 모르지만 그만큼 많은 오류가 발생하여 내 답변을 어디에서 시작해야하는지 알지 못하고 '답'이 아직 많이 남아 있습니다. – Aiken

+0

standYes는 내 userform 내의 체크 박스입니다! if 문과 모든 문항은 실제로 질문을 제기하지 않으며, 더 많은 구문을 전달하고 함수에 배열합니다. – user3538102

1

변형 배열을 사용하는 접근 방식이 약간 다릅니다.

Sub Some_Macro() 
    Dim ABredu As Variant, i As Long 
    ABredu = Equipment(True, 0) 
    For i = LBound(ABredu) To UBound(ABredu) 
     Debug.Print ABredu(i) 
    Next i 
    ABredu = Equipment(False, 0) 
    For i = LBound(ABredu) To UBound(ABredu) 
     Debug.Print ABredu(i) 
    Next i 
End Sub 

Public Function Equipment(standYes As Boolean, cdLI As Long) 
    Dim vEQUIP As Variant 
    If standYes And cdLI = 0 Then 
     vEQUIP = Array("Pen", "Ruler", "Monitor") 
    Else 
     vEQUIP = Array("17-P2", "17-L73", "16-ENR") 
    End If 
    Equipment = vEQUIP 
End Function 

찾고있는 것을 달성하는 데는 여러 가지 방법이 있습니다. 당신에게 가장 잘 맞는 것을 골라라.

+0

다른 답변을 주셔서 감사합니다.하지만 위의 방법을 사용하기 위해 비교적 간단하게 유지하고 싶습니다. 감사 – user3538102

0

자, 질문에있는 코드가 조금 무의미하기 때문에 여기에 예상되는 로직에 대한 몇 가지 가정을 할 것입니다.

당신은 노력하고 (나는 생각한다)에 :

  1. 몇 가지 조건

와에 따라 그 배열을 채울

  • 사용을 ABredu 함수 나 서브 루틴을 호출 문자열 배열 만들기 즉, 다음 서브를 만들 수 있습니다.

    Sub PopulateEquipment(EquipArr() As String) 
        ReDim EquipArr(1 To 3) 
        If <condition> Then '<~~ Insert your own conditions here 
         EquipArr(1) = "Value 1" 
         EquipArr(2) = "Value 2" 
         EquipArr(3) = "Value 3" 
        Else 
         EquipArr(1) = "AltVal 1" 
         EquipArr(2) = "AltVal 2" 
         EquipArr(3) = "AltVal 3" 
        End If 
    End Sub 
    

    배열을 사용하면 Dim 만 필요하고 변수를 인수로 전달하여 서브 루틴을 호출하십시오.

    Dim ABredu() As String 
    Call PopulateEquipment(ABredu) 
    
  • 0

    더욱 간단하게 말하면, ArrayList를 사용하십시오.

    Public arList As Object 
    
    Sub PartOne() 
    
    Set arList = CreateObject("System.Collections.ArrayList") 
    
    Call Equipment 
    
    End Sub 
    
    Private Sub Equipment() '// No Need to pass argument as arList is of Public scope. 
    
    With arList 
    
    If standYes And Me.ComboBox2.ListIndex = 0 Then 
        .Add "Pen" 
        .Add "Ruler" 
        .Add "Monitor" 
    Else 
        .Add "17-P2" 
        .Add "17-L73" 
        .Add "16-ENR" 
    End If 
    
    End With 
    
    End Sub 
    
    관련 문제