2012-04-17 5 views
2

설정 : 데이터를 입력하는 양식이있는 Excel 문서가 있으며 해당 양식의 데이터가 여러 행의 데이터를 쉽게 입력 할 수 있도록 테이블에 입력됩니다. 적어도 나는 그렇게 생각했다.테이블 행/전체 테이블을 선택하는 방법은 무엇입니까?

그래서 지금은 적절한 장소에 데이터를 삽입 할 테이블을 선택하려고합니다. 내 질문에, 제 생각에는, 이것입니다 : 한 번에 하나의 표 행을 선택하거나 전체 표를 선택하고 각 행을 개별적으로 처리합니까? 그리고 어떻게해야합니까?

나는 Sheets("Form").Range("dataForm[#ALL]").Select과 그 변형을 시도했지만 아무 것도 작동하지 않았습니다.

내가 전체적으로 테이블을 선택하면 각 행을 별도로 처리 할 수 ​​있어야하며 개별적으로 각 행을 선택하면 데이터가 반드시 테이블의 맨 위에서 시작할 수 있어야합니다. 순서대로.

아이디어가 있으십니까?

EDit : 세부 사항을 추가하려면 다음을 입력하십시오. 본인은 위에 언급 한 양식을 가지고 있으며 해당 데이터는 양식의 특정 셀 값에 따라 다른 표에 삽입되어야합니다. 토론을 쉽게하기 위해 드롭 다운에 정의 된대로 세 가지 가능한 값이있는 셀 유형의 이름을 지정합니다. 그 가치는 소득, 지출 및 이전입니다. 이러한 값에 따라 데이터를 추가 할 테이블을 결정합니다. 비용 등 소득 테이블 비용에 소득

그래서 내가 뭘하려고하면 행을 선택하고 각각 올바른 테이블에 삽입하는 것입니다. 정렬은 제가 설명한 것보다 약간 더 복잡 합니다만, 초기 정렬을 알아낼 수 있다면 몇 번 더 정렬하는 것이 간단해야합니다.

+0

소스 테이블을 적절한 테이블에 삽입 한 후 행을 삭제 하시겠습니까? –

+0

하나만 제외하고 모두 삭제하고 하나를 지우십시오. 만약 내가 그들을 모두 삭제 테이블 및 데이터 유효성 검사 설정 (내 드롭 다운)을 잃게됩니다. – SpeedCrazy

답변

5

귀하의 질문에 대한 답변을 제공합니다.

Sub TableStuff() 
Dim lo As Excel.ListObject 
Dim loRow As Excel.ListRow 
Dim i As Long 

Set lo = ActiveSheet.ListObjects(1) 
With lo 
'this is the address of the whole table 
Debug.Print .Range.Address 
    For i = 1 To 10 
     Set loRow = .ListRows.Add(i) 
     loRow.Range.Cells(1).Value = "test" & i 
    Next i 
Debug.Print .Range.Address 
'address of data rows 
Debug.Print .DataBodyRange.Address 
End With 
End Sub 

블로그에 내 블로그에 두 개의 게시물이 있습니다. recent one도 통찰력을 제공 할 수 있습니다.

편집 : 아래의 의견과 편집에 영업 이익에 바탕 :

이 Activesheet, tblSource 및 tblIncome에 두 테이블을 가정합니다. 원본 테이블을 Income으로 필터링하고 복사본은 보이는 행을 복사 한 다음 tblIncome 끝에 삽입합니다. 마지막으로 소스 행 (하나만 제외)을 삭제합니다.

당신은 그것을 다른 두 가지 범주 작동하도록 루프를 추가 할 수 있습니다 : 당신이 이미 테이블에 이름을 준 경우

Sub MoveTableStuff() 
Dim loSource As Excel.ListObject 
Dim loTarget As Excel.ListObject 
Dim SourceDataRowsCount As Long 
Dim TargetDataRowsCount As Long 

Set loSource = ActiveSheet.ListObjects("tblSource") 
Set loTarget = ActiveSheet.ListObjects("tblIncome") 
With loSource 
    .Range.AutoFilter Field:=1, Criteria1:="income" 
    SourceDataRowsCount = .ListColumns(1).DataBodyRange.SpecialCells(xlCellTypeVisible).Count 
End With 
With loTarget 
    TargetDataRowsCount = .DataBodyRange.Rows.Count 
    .Resize .Range.Resize(.Range.Rows.Count + SourceDataRowsCount, .Range.Columns.Count) 
    loSource.DataBodyRange.SpecialCells(xlCellTypeVisible).Copy 
    .DataBodyRange.Cells(TargetDataRowsCount + 1, 1).PasteSpecial (xlPasteValues) 
    Application.CutCopyMode = False 
End With 
With loSource 
    .Range.AutoFilter 
    .DataBodyRange.Offset(1).Resize(.DataBodyRange.Rows.Count - 1, .DataBodyRange.Columns.Count).Rows.Delete 
End With 
End Sub 
+0

명확화, Listobject (1)은 무엇을 참조합니까? 거기에 테이블 이름을 써야하나요? 귀하의 도움에 감사드립니다, 나는 당신의 블로그를 체크 아웃해야합니다 – SpeedCrazy

+0

예, ListObject는 테이블의 VBA 이름입니다. 1은 시트의 첫 번째 테이블을 나타냅니다. Listobjects ("Table1") 또는 이름이 무엇이든 상관없이 작동합니다. –

+0

감사합니다. 시도해보고 즉시 다시보고합니다. – SpeedCrazy

1

, 나는 그것의 전체 데이터 범위를 얻을 수있는 기능을 가지고 :

Public Function GetTableByName(ByVal ws As Worksheet, ByVal tbName As String) As Range 

    Dim lObj As ListObject 

    For Each lObj In ws.ListObjects 
     If Trim(UCase(lObj.Name)) = Trim(UCase(tbName)) Then 
      Set GetTableByName = lObj.DataBodyRange 
      Exit Function 
     End If 
    Next lObj 

End Function 
관련 문제