2016-08-23 5 views
0

이 스크립트는 각 셀의 4 개 열 두 세트를 결합하여 인접한 셀에 각 조합을 인쇄해야합니다.VBA Excel 셀 조합 스크립트 1004 오류

Set out_1 = Range("I1", Range("L1").Offset(UBound(c1) * UBound(c2) * UBound(c3) * UBound(c7))) 

내가 아니다 :이 세 가지 세포의 2 세트에서 근무하지만 지금은

1004 응용 프로그램 정의 또는 개체 정의 erorr

그것은 강조 얻고 있었다 이 문제를 어떻게 해결할 수 있는지 정말 확신 할 수 있습니까?

Sub Combinations() 

Dim c1() As Variant 
Dim c2() As Variant 
Dim c3() As Variant 
Dim c4() As Variant 
Dim c5() As Variant 
Dim c6() As Variant 
Dim c7() As Variant 
Dim c8() As Variant 
Dim out1() As Variant 
Dim out2() As Variant 
Dim j, k, l, m, n As Long 

Dim col1 As Range 
Dim col2 As Range 
Dim col3 As Range 
Dim col4 As Range 
Dim col5 As Range 
Dim col6 As Range 
Dim col7 As Range 
Dim col8 As Range 
Dim out_1 As Range 
Dim out_2 As Range 

Set col1 = Range("A1", Range("A1").End(xlDown)) 
Set col2 = Range("C1", Range("C1").End(xlDown)) 
Set col3 = Range("E1", Range("E1").End(xlDown)) 
Set col4 = Range("B1", Range("B1").End(xlDown)) 
Set col5 = Range("D1", Range("D1").End(xlDown)) 
Set col6 = Range("F1", Range("F1").End(xlDown)) 
Set col7 = Range("G1", Range("G1").End(xlDown)) 
Set col8 = Range("H1", Range("H1").End(xlDown)) 

c1 = col1 
c2 = col2 
c3 = col3 
c4 = col4 
c5 = col5 
c6 = col6 
c7 = col7 
c8 = col8 

Set out_1 = Range("I1", Range("L1").Offset(UBound(c1) * UBound(c2) * UBound(c3) * UBound(c7))) 
Set out_2 = Range("M1", Range("P1").Offset(UBound(c4) * UBound(c5) * UBound(c6) * UBound(c8))) 
out1 = out_1 
out2 = out_2 

j = 1 
k = 1 
l = 1 
m = 1 
n = 1 

Do While j <= UBound(c1) 
    Do While k <= UBound(c2) 
     Do While l <= UBound(c3) 
      Do While m <= UBound(c7) 
       out1(n, 1) = c1(j, 1) 
       out1(n, 2) = c2(k, 1) 
       out1(n, 3) = c3(l, 1) 
       out1(n, 4) = c7(m, 1) 
       n = n + 1 
       m = m + 1 
      Loop 
      m = m 
      l = l + 1 
     Loop 
     l = 1 
     k = k + 1 
    Loop 
    k = 1 
    j = j + 1 
Loop 

j = 1 
k = 1 
l = 1 
m = 1 
n = 1 


Do While j <= UBound(c4) 
    Do While k <= UBound(c5) 
     Do While l <= UBound(c6) 
      Do While m <= UBound(c8) 
       out1(n, 1) = c1(j, 1) 
       out1(n, 2) = c2(k, 1) 
       out1(n, 3) = c3(l, 1) 
       out1(n, 4) = c8(m, 1) 
       n = n + 1 
       m = m + 1 
      Loop 
      m = m 
      l = l + 1 
     Loop 
     l = 1 
     k = k + 1 
    Loop 
    k = 1 
    j = j + 1 
Loop 

out_1.Value = out1 
out_2.Value = out2 
End Sub 
+4

당신은 단축 될 수도 있습니다 대신 10 개 한 차원 배열의 한 2 차원 배열을 만들어 조금. 다음은 리뷰가 필요한 작업 코드에 사용할 수있는 좋은 사이트입니다 : [Code Review] (http://codereview.stackexchange.com/). – Brian

+1

열이 하나도 없으므로 1 백만 개가 넘는 행 아웃을 만들지 않습니까? 이로 인해 오프셋이 Excel 시트에 허용 된 행 수보다 커집니다. 또는 모든 Ubound의 곱셈이 허용되는 행 수를 초과하지 않는다는 것입니다. –

+0

'debug.print' 모든 UBound (cN)의 값을 확인하는 것이 좋습니다. – Tim

답변

1

@ ScottCraner의 의견을 고려하십시오.

심지어 모든 열에 비어 있지 않은 셀이 하나 이상 있다고해도 행 1에있는 경우 xlDown 접근 방식을 사용하면 Ubound()이 1 백만원을 반환합니다. 이 경우

교체 :

Set col1 = Range("A1", Range("A1").End(xlDown)) 
Set col2 = Range("C1", Range("C1").End(xlDown)) 
... 

로 :

Set col1 = Range("A1", Cells(Rows.Count, 1).End(xlUp)) 
Set col2 = Range("C1", Cells(Rows.Count, 3).End(xlUp)) '<--keep numeric column index in "Cells(Rows.Count,...)" synchronized with string column index in Range("...1") 
... 
+0

두 번째 설명을 처리해야합니다. 4 개의 열을 곱한 값이 1048576보다 크면 오류가 발생합니다. 이 경우에만 32 행이 필요합니다. 대답은 ubounds를 추가하고 곱하지 않는 것이어야한다고 생각합니다. –

+1

@ScottCraner : 제품에 대한 합계는 실제로 'xlDown'vs 'xlUp' 접근과 결합 된 대답의 가능한 부분입니다. 그러나 OP의 묘사에서 진정한 목표를 찾아내는 것은 불가능합니다. 내 의견과 내 대답 모두에 대한 그의 의견을 기다리 자. – user3598756