2015-01-05 2 views
2

현재 배열과 루프를 사용하고 있으며 숫자가 {1, 2, 3 인 n 행 m 열 (행렬)을 출력하는 함수를 작성하려고합니다. , ..., n * m}VBA - n 행렬을 만드는 함수

저는 기본적인 VBA 코드를 배우려고합니다. 이것은 교육 목적으로 만 사용됩니다.

Function createMatrix(n, m)  
Dim matrix(1 To n, 1 To m) As Integer  
x = 1  
For i = 1 To n 
    For j = 1 To m   
     matrix(i, j) = x    
     x = (x + 1)    
    Next j 
Next i 
createMatrix = matrix  
End Function 

그것은 #VALUE를 반환 내가 가지고 올 것을

이입니다. 이유를 이해할 수 없습니다.

제가

Dim matrix(1 to 3, 1 to 3) As Integer 

를위한에 nm 대체하여 매트릭스 어레이를 초기화 한 후 어떤 변수를 고려하지 않는 기능을하고 하나 개의 포인트 (3 × 3 행렬을 생성)에서 작동 할있어 3s와 루프.

그래서 변수 nm이 문제를 일으키고 있지만 그 이유를 모르겠습니다.

+0

'''Dim matrix (1 To ..., 1 To ...)''와 같은 배열 선언을 사용할 수 있습니다.'''Dim matrix (1 to 3) , 1 to 3)'''가 작동하고 배열에는 3 개의 행과 3 개의 열이 있습니다. 그러나 변수''n, m''과 같이 (1 To n, 1 To m) ReDim을 사용해야합니다. 이는 Reason을 @Jason Faulkner와 @Leni Ohnesorge의 답변에 표시해야합니다. 한가지 더,'''#VALUE! ''를 얻으면 오류가 매개 변수의 구분 기호를 검사합니다. 구분 기호는 쉼표 또는 세미콜론으로 지정할 수 있습니다. 쉼표로 셀'''= createMatrix (3,3)'''mit 세미콜론''= createMatrix (3; 3)'''에서'''Shift + Ctrl + Enter를 입력하십시오. – dee

+0

세미콜론은 배열 상수의 행을 구분하기위한 것이지만 여기서 함수는 * dimensioing *에 대한 정수 인수를 기대하며 * 배열에 값을 전달하지 않습니다. – ThunderFrame

답변

3

배열 선언 이어야합니다 (경계는 하드 코딩 된 값으로 정의됩니다). 그러나 ReDim 문을 사용하여 동적으로 크기를 조정할 수 있습니다.

' Declare an array. 
' If you want to size it based on variables, do NOT define bounds. 
Dim matrix() As Integer 
' Resize dynamically. 
ReDim maxtrix(n, m) 

ReDim 일 때 모든 값이 손실됩니다. 동적 배열과 같은 배열을 선언 한 다음 치수에 REDIM하는

ReDim Preserve matrix(n, m) ' Keep any existing values in their respective indexes. 
2

당신이 먼저 필요 : 당신은 당신이 계속 싶어 matrix의 값이 있다면, 당신은 Preserve 키워드를 추가 할 수 있습니다.

Function createMatrix(n, m) 
    Dim matrix() As Integer 
    ReDim matrix(1 To n, 1 To m) As Integer 
    x = 1 

    For i = 1 To n 
     For j = 1 To m 
      matrix(i, j) = x 
      x = (x + 1) 
     Next j 
    Next i 

    createMatrix = matrix 
End Function 
+0

'Option Matrix() As Integer' 문을 생략 할 수 있습니다.'ReDim' 문이 변수를 선언하고 크기를 선언하기에 충분하기 때문에'Option Explicit'을 선언해도 마찬가지입니다. – ThunderFrame

관련 문제