2013-05-22 2 views
0

런타임 오류 13 "유형 불일치 오류"에 문제가 있습니다. 여러 행의 코드를 하나의 행으로 압축하여 각 행을 나란히 배치하려고합니다. 문제는 내 입력이 문자열과 숫자인데, 이것이 내가이 문제를 일으킨다 고 생각하는 것입니다. 이 문제를 어떻게 해결할 수 있습니까?Excel VBA 유형 13 값과 문자열을 포함하는 배열을 사용하는 불일치

Sub multRowsTo1Row() 
    Dim inputRange As Variant 
    Dim outputRange As Variant 

    inputRange = Selection 
    y = UBound(inputRange, 1) 
    x = UBound(inputRange, 2) 

    ReDim outputRange(1 To x * y) 

    For j = 1 To y 
     For i = 1 To x 
      outputRange(i + y(j - 1)) = inputRange(j, i) 
     Next i 
    Next j 

    Selection.Offset(0, x).Select 


End Sub 

답변

2

변수를 Dim x#, y#으로 올바르게 지정하십시오. 이 경우 불일치 오류가 수정되지만 y(j - 1)에는 배열이 필요하므로 다른 오류가 표시됩니다. 곱셈 기호를 추가하여 y * (j-1)이되도록하고이 오류를 피할 수 있지만 Selection.Rows.Count > 2 이벤트에서 오버플로가 발생할 수 있으므로 해당 체크를 추가 할 수도 있습니다.

Sub multRowsTo1Row() 


    Dim inputRange As Variant 
    Dim outputRange As Variant 
    Dim y#, x# 

    If selection.Rows.Count > 2 Then 
     MsgBox "Invalid Selection!", vbCritical 
     Exit Sub 
    End If 

    inputRange = Selection 
    y = UBound(inputRange, 1) 
    x = UBound(inputRange, 2) 

    ReDim outputRange(1 To x * y) 

For j = 1 To y 
    For i = 1 To x 
     outputRange(i + y * (j - 1)) = inputRange(j, i) 
    Next i 
Next j 

Selection.Offset(0, x).Select 


End Sub 

은 언제나처럼, 많은 고통 & 문제 해결은 내가 다윗 성공 덕분 특정 Type :

+0

그건 해냈어 !! 정말 고마워. 호기심에서 x와 y 다음에 해시 기호를 넣는 이유는 무엇입니까? 또한 코드의 요점은 2 개 이상의 행을 갖는 것입니다. 나는 문제가 생기지 않았고 오버플로하지는 않았지만 많은 양의 데이터를 테스트하지는 않았습니다. –

+0

해시 태그는 '정수'에 대한 속기 표기법입니다. '희미한 정수, x 정수'로 표시 할 수 있습니다. 오버플로 오류가 발생하지 않았다면 걱정하지 마세요. 오류가있어서 'If selection.Rows.count> 2 ...'라는 테스트를 추가 했으므로 그 행을 제거 할 수 있다고 생각했습니다. . –

+0

다시 한번 감사드립니다 !!! –

0

Option Explicit 또한이 변수를 치수를 사용하여 피할 수 있습니다. 여기 최종 코드가 있습니다.

Sub multRowsTo1Row() 

'는 현재 다음 위쪽 행에 위치'이 여러 광고 배열을 측면 각 행에 나란히 배치 '. 이것은 변경할 수 있습니다.

Dim inputRange As Variant 
Dim outputRange As Variant 
Dim x#, y# 

inputRange = Selection 

y = UBound(inputRange, 1) 
x = UBound(inputRange, 2) 

ReDim outputRange(1 To x * y) 

For j = 1 To y 
    For i = 1 To x 
     outputRange(i + x * (j - 1)) = inputRange(j, i) 
    Next i 
Next j 

'다른 곳으로 출력하려면이 값을 변경하십시오. 이렇게하면 출력이 첫 번째 행의 마지막 항목 오른쪽에 붙여 넣어집니다.

Selection.Offset(0, x).Resize(1, x * y).Select 
    Selection = outputRange 
End Sub