2014-10-07 2 views
0

나는 2 일 동안이 작업을 해왔으며 주변을 스 래싱하고 여기에 지금 있습니다.문자열 기반 반환 배열 2010 년 vba

Private Function SetColumns(sRptVer As String, iColumns() As Integer) 

If sRptVer = "Q1" Then 
    iColumns(1) = 5 '<- Subscript out of range error here Hovering shows _ 
        '"iColumns(1)=<Subscript out of range>" 
    iColumns(2) = 6 
    iColumns(3) = 7 
    iColumns(4) = 17 
End If 

If sRptVer = "Q2" Then 
    iColumns(1) = 5 
    iColumns(2) = 6 
    iColumns(3) = 7 
    iColumns(4) = 8 
    iColumns(5) = 9 
    iColumns(6) = 10 
    iColumns(7) = 17 
End If 

SetColumns = iColumns() 

End Function 

Private Sub Test2() 

Dim iColValue() As Integer 
Dim sRptVer As String 
Dim iColumns() As Integer 

sRptVer = "Q1" 

iColValue() = SetColumns(sRptVer, iColumns()) 

For i = 1 To 10 

    Debug.Print iColValue(i) 
Next i 

End Sub 

목표는 분기를 지정하는 문자열을 전달하고 내가 Excel 스프레드 시트에서 값을 얻기 위해 반복 할 열을 설정하는 역할을합니다 배열을 반환 할 수있을 수있을 것입니다. (Excel에서 Access로 데이터를 가져오고 있습니다). iColumns (0)부터 시작해 보았습니다. 차이 없음. 참고 : 액세스 vba는 iColumns() = {1,2,3,4}와 같이 배열을 설정하는 것을 좋아하지 않습니다. 그것은 "{}"을 망칠. Access vba가 "ReDim"을 좋아하지 않는 것 같습니다. 컴파일 오류가 발생합니다. SetColumns 함수에서 "icolumns() as Integer"를 재 작성하면 구문 오류가 발생합니다. 미리 감사드립니다.

+0

'Dim iColValue() As Integer'를'ReDim iColValue (10) as Integer()'로 변경 한 다음'ReCount (10) as Integer'를'Dim iColumns() As Integer'로 변경 한 다음'as Integer()'를 함수 정의의 끝에 추가합니다. 그게 당신을 시작해야합니다 –

답변

0

원하는 것을 수행하기 위해 호출 프로 시저에서 별도의 두 개의 배열이 필요하지 않습니다. 대신이 시도 :

Private Function SetColumns(sRptVer As String) As Integer() 
    Dim iColumns() As Integer 
    Select Case sRptVer 
    Case "Q1" 
     ReDim iColumns(1 To 4) 
     iColumns(1) = 5 
     iColumns(2) = 6 
     iColumns(3) = 7 
     iColumns(4) = 17 
    Case "Q2" 
     ReDim iColumns(1 To 7) 
     iColumns(1) = 5 
     iColumns(2) = 6 
     iColumns(3) = 7 
     iColumns(4) = 8 
     iColumns(5) = 9 
     iColumns(6) = 10 
     iColumns(7) = 17 
    End Select 
    SetColumns = iColumns 
End Function 

Private Sub Test2() 
    Dim sRptVer As String 
    Dim iColValue() As Integer 

    sRptVer = "Q1" 

    iColValue() = SetColumns(sRptVer) 
    Dim i As Integer 
    For i = LBound(iColValue) To UBound(iColValue) 
     Debug.Print iColValue(i) 
    Next i 

End Sub 

나는 몇 기타 변경 작업을 수행 :
  • 는 동적으로 SetColumns에 전달 된 매개 변수에 따라 배열을 크기에 ReDim을 사용했다.
  • ReDim 문에서 배열의 상한과 하한을 모두 통과 시켰습니다. VBA의 배열은 기본적으로 0입니다. 따라서 ReDim iColumns(4)은 실제로 ReDim iColumns(0 To 4)과 같습니다.
  • 어레이의 크기를 미리 알지 못하기 때문에 배열을 걸으려면 LBound()UBound() 함수를 사용합니다.
  • 두 개의 If 문을 Select ... Case 문으로 변경했습니다. 제공 한 제한된 샘플 코드를 기반으로 적절한 것으로 보였습니다. 실제 코드가 더 복잡한 경우 그렇지 않을 수도 있습니다.

* 참고 : 불행히도 Option Base statement을 사용하여 VBA에서 시작 배열 기본을 변경할 수 있습니다. 제발 하지마. 이제까지. 자신과 다른 사람들을 혼란스럽게 할뿐입니다. 특정 배열을 1부터 시작하려면 내 예제에서 보았 듯이 배열을 Dim 또는 ReDim 할 때 명시 적으로 지정하십시오.

+0

다시 한번 감사드립니다. 저는 이것을 더 큰 실제 프로젝트에 통합 해왔고, 앞으로 나아갈 방향보다 훨씬 강력하고 견고합니다. – EStraka