2017-12-25 15 views
1

행, 열 A부터 CA (79 열)까지 하나의 통합 문서 행에서 데이터를 추출합니다. 새 통합 문서의 테이블에 각 행을 추가하는 중입니다. 열 B는 CB입니다. 열 A는 수식입니다. 새 통합 문서를 Excel 테이블로 설정했습니다. 원본 통합 문서 행을 배열로 추출한 다음 해당 배열을 새 행의 테이블에 할당합니다. (listrows.add). (행 1에서 열 B를 CB에 대해 &의 내용을 지우고 처음 1 행을 제외한 모든 행을 삭제했습니다).새 listrow를 추가하면 1 대신에 마지막 행에서 행 번호 2가 부여됩니다.

배열을 할당하면 열 A 수식이 고유 ID를 계산합니다.이 고유 ID는 해당 ID 이름을 사용하여 새 워크 시트를 추가하는 데 사용됩니다.

내가 겪고있는 문제는 두 번째 행을 새 행으로 추가하면 newrow.index는 예상대로 2 개가되지만 newrow.range.row 대신 4가되어야한다는 것입니다 (머리글은 행 2), 5입니다. 그리고 newrow.range (newrow.index, 1)를 참조 할 때 newrow.range (2,1)에있는 값 대신에 (행 5를 사용하는 것처럼) 얻을 수 있습니다.

나는 이것이 배열 문제일지도 모른다고 느낀다. 그리고 나는 이것에 대해 너무 오래 빤히 보았을지도 모른다. 그러나 왜 그것이 두 줄을 건너 뛰는 지 알 수 없다.

다음은 문제가있는 코드입니다.

Sub importdata() 
Dim lastrw As Long 
Dim lastcl As Long 
Dim newrow As ListRow 
Dim i As Long 
Dim j As Long 
Dim v As Variant 

    lastrw = lastrow(1, sourcesheet) 
    lastcl = lastcolumn(1, sourcesheet) 

    ReDim v(1 To 1, 1 To lastcl) 

    For i = 2 To lastrw 
     If i = 2 Then 
      Set newrow = applicationtable.ListRows(1) 
     Else 
      Set newrow = applicationtable.ListRows.Add(alwaysinsert:=True) 
     End If 
     v = sourcesheet.Range(sourcesheet.Cells(i, 1), sourcesheet.Cells(i, lastcl)) 
     newrow.Range.Offset(0, 1).Resize(, lastcl) = v 
     Debug.Print ".index " & newrow.Index 
     Debug.Print ".row " & newrow.Range(newrow.Index, 1).Row 
     Debug.Print ".value " & newrow.Range(newrow.Index, 1) 
     Call copytemplate(newrow.Range(newrow.Index, 1), i) 
    Next i 

End Sub 

을 Debug.Print 지수는 2 (이 newrow 추가해야 이후로)

을 Debug.Print 행 5 (이것은 listrow 때문에 (1) 열 (3)에 제 listrow이어야 제공 준다 (2) 은 4 행에 있어야합니다.

debug.print 값은 ""를 제공합니다.

sourcesheet 전 세계적으로 선포하고 내 소스 데이터 applicationtable 세계적으로 선언하고 내 대상 테이블

+0

applicationtable.databodyrange (newrow.index, 1)은 newrow.range (newrow.index, 1)가 아닌 올바른 셀을 나타냅니다. 행이 여전히 올바르지 않습니다 (4 대신 5라고 말합니다). 올바른 셀을 참조하기 위해 databodyrange를 사용할 수 있으므로 지금 당장이를 수행하고 있습니다. 누군가가 아이디어를 가지고 있다면 다른 참조가 왜 틀린 지 아직도 알고 싶습니다. – Carol

+0

ListRows를 SheetRangeRows와 비교하고 있습니다. – Variatus

답변

0

당신은 혼란 ListRows 및 SheetRows되어 있습니다. newrow은 ListRow입니다. 해당 Index 속성은 테이블에서 해당 행의 번호를 보유합니다. newrow.Range(mewrow.Index, 1)은 워크 시트 범위이고 Row 속성은 시트 행 번호를 반환합니다.

BTW, ReDim v(1 To 1, 1 To lastcl)은 불필요합니다. 여기에서 v는 다른 차원 인 v = SourceSheet.Range(SourceSheet.Cells(i, 1), SourceSheet.Cells(i, lastcl))을 사용하기 때문에 불필요합니다. 또한 SourceSheet.Range(SourceSheet.Cells(i, 1), SourceSheet.Cells(i, lastcl))은 v에 할당 할 범위를 정의합니다. 이는 완벽하게 유효하지만 Excel을 이해하기 위해 신뢰하는 것은 범위를 의미하지 않는다는 것입니다. 그 범위의 Value을 v로 지정하면 코드가 읽기 쉽고 오해를 받기 쉽습니다. 특히 자신이 말하는 것을 말하면, 즉 v = SourceSheet.Range(SourceSheet.Cells(i, 1), SourceSheet.Cells(i, lastcl)).Value입니다.

여기에 동일하게 적용됩니다. newrow.Range.Offset(0, 1).Resize(, lastcl) = v newrow.Range.Offset(0, 1).Resize(, lastcl).Value = v의 의미는 무엇입니까? newrow.Range은 시트 범위이며 ListObject의 범위가 아니라는 점을 유의하십시오 (여기서는 차이가 없지만 오프셋이 필요함). 암묵적으로 v 크기로 크기를 조정 중입니다. 더 좋은 방법은 명시 적으로 그렇게하는 것입니다. 예 :

newrow.Range.Cells(1).Resize(UBound(v), UBound(v, 2)).Value = v