programing

표를 파괴하지 않고 표 내용을 선택하는 방법은 무엇입니까?

lastmoon 2023. 6. 21. 22:53
반응형

표를 파괴하지 않고 표 내용을 선택하는 방법은 무엇입니까?

여기 계신 분들의 도움을 받아 구축한 엑셀 2010의 vba 기능이 있습니다.이 함수는 테이블/폼의 내용을 복사하여 정렬한 후 적절한 테이블로 보냅니다.

이제 이 기능을 실행한 후 원래 테이블을 삭제합니다.A 셀이 표의 첫 번째 셀로 정의되었다고 가정하면 다음 코드로 이를 달성할 수 있습니다. ACell.ListObject.Range.ClearContents테이블과 데이터 값을 삭제하는 것이 유일한 문제입니다.

이 일을 피할 방법이 있습니까?데이터를 입력할 때마다 테이블을 설치하지 않아도 됩니다.

어때요?

ACell.ListObject.DataBodyRange.Rows.Delete

그러면 테이블 구조와 제목은 유지되지만 모든 데이터와 행은 삭제됩니다.

편집: 저는 당신이 원하는 것을 대부분 하기 때문에 당신의 이전 게시물에서 제 답변의 일부를 수정할 것입니다.이렇게 하면 행이 하나만 남습니다.

With loSource
   .Range.AutoFilter
   .DataBodyRange.Offset(1).Resize(.DataBodyRange.Rows.Count - 1, .DataBodyRange.Columns.Count).Rows.Delete
   .DataBodyRange.Rows(1).Specialcells(xlCellTypeConstants).ClearContents
End With

모든 행을 공식과 다른 공식으로 그대로 유지하려면 다음을 수행합니다.

With loSource
   .Range.AutoFilter
   .DataBodyRange.Specialcells(xlCellTypeConstants).ClearContents
End With

공식을 지울 수 없다는 점을 제외하면 @Readify가 제안한 것에 가깝습니다.

헤더를 포함한 전체 테이블이 아니라 데이터만 지우십시오.

ACell.ListObject.DataBodyRange.ClearContents

행 삭제를 방지하기 위해 Doug Glancy의 솔루션을 재작업하여 수식에 #Ref 문제가 발생할 수 있습니다.

Sub ListReset(lst As ListObject)
'clears a listObject while leaving row 1 empty, with formulae
    With lst
        If .ShowAutoFilter Then .AutoFilter.ShowAllData
        On Error Resume Next
        With .DataBodyRange
            .Offset(1).Rows.Clear
            .Rows(1).SpecialCells(xlCellTypeConstants).ClearContents
        End With
        On Error GoTo 0
        .Resize .Range.Rows("1:2")
    End With
End Sub

이러한 솔루션의 대부분은 해결되지 않는 조건이 있습니다.패트릭 호노레즈의 해결책을 수정했습니다.원래 기능이 때때로 제가 예상했던 더 많은 데이터를 삭제할 때 제 머리를 뽑는 것이기 때문에 저는 이것을 공유해야 한다고 느꼈습니다.

이 상황은 테이블에 하나의 열만 있고 다음과 같은 경우에 발생합니다..SpecialCells(xlCellTypeConstants).ClearContents맨 위 행의 내용을 지우려고 합니다.이 경우 셀이 하나만 선택되고(열이 하나만 있는 테이블의 맨 위 행) SpecialCells 명령이 선택된 범위 대신 전체 시트에 적용됩니다.제게 일어난 일은 제 테이블 밖에 있던 시트의 다른 세포들도 제거되고 있다는 것이었습니다.

저는 발굴을 좀 했고 Mathieu Guindon의 조언을 찾았습니다: Range Special Cells Clear Contents는 전체 시트를 지웁니다.

범위({단일 셀})입니다.특수 셀({what})은 전체 시트에서 작동하는 것 같습니다.

범위({둘 이상의 셀})입니다.특수 셀({what})이 지정된 셀에서 작동하는 것 같습니다.

목록/테이블에 열이 하나만 있는 경우(행 1), 셀에 수식이 있는지 확인하고 없으면 해당 셀의 내용만 지웁니다.

Public Sub ClearList(lst As ListObject)
'Clears a listObject while leaving 1 empty row + formula
' https://stackoverflow.com/a/53856079/1898524
'
'With special help from this post to handle a single column table.
'   Range({any single cell}).SpecialCells({whatever}) seems to work off the entire sheet.
'   Range({more than one cell}).SpecialCells({whatever}) seems to work off the specified cells.
' https://stackoverflow.com/questions/40537537/range-specialcells-clearcontents-clears-whole-sheet-instead

    On Error Resume Next
    
    With lst
        '.Range.Worksheet.Activate ' Enable this if you are debugging 
    
        If .ShowAutoFilter Then .AutoFilter.ShowAllData
        If .DataBodyRange.Rows.Count = 1 Then Exit Sub ' Table is already clear
        .DataBodyRange.Offset(1).Rows.Clear
        
        If .DataBodyRange.Columns.Count > 1 Then ' Check to see if SpecialCells is going to evaluate just one cell.
            .DataBodyRange.Rows(1).SpecialCells(xlCellTypeConstants).ClearContents
        ElseIf Not .Range.HasFormula Then
            ' Only one cell in range and it does not contain a formula.
            .DataBodyRange.Rows(1).ClearContents
        End If

        .Resize .Range.Rows("1:2")
        
        .HeaderRowRange.Offset(1).Select

        ' Reset used range on the sheet
        Dim X
        X = .Range.Worksheet.UsedRange.Rows.Count 'see J-Walkenbach tip 73

    End With

End Sub

제가 포함한 마지막 단계는 John Walkenbach가 제공한 팁으로, 때때로 다음과 같이 기록됩니다.J-Walkenbach tip 73 마지막 셀 자동 재설정

이 코드를 사용하여 데이터를 제거하지만 수식은 맨 위 행에 둡니다.또한 맨 위 행을 제외한 모든 행을 제거하고 페이지를 맨 위로 스크롤합니다.

Sub CleanTheTable()
    Application.ScreenUpdating = False
    Sheets("Data").Select
    ActiveSheet.ListObjects("TestTable").HeaderRowRange.Select
    'Remove the filters if one exists.
    If ActiveSheet.FilterMode Then
    Selection.AutoFilter
    End If
    'Clear all lines but the first one in the table leaving formulas for the next go round.
    With Worksheets("Data").ListObjects("TestTable")
    .Range.AutoFilter
    On Error Resume Next
    .DataBodyRange.Offset(1).Resize(.DataBodyRange.Rows.Count - 1, .DataBodyRange.Columns.Count).Rows.Delete
    .DataBodyRange.Rows(1).SpecialCells(xlCellTypeConstants).ClearContents
    ActiveWindow.SmallScroll Down:=-10000

    End With
Application.ScreenUpdating = True
End Sub

테이블 내용을 지우려면 보통 매우 간단한 것을 사용합니다.

Sub Clear_table()
Range("Table1").ClearContents
End Sub

여러 페이지로 구성된 워크북이 있는 경우 이를 수용하도록 코드를 변경해야 할 수도 있습니다.

Sub Clear_table()
Worksheets("Sheet1").Range("Table1").ClearContents
End Sub

헤더와 수식을 제외한 전체 테이블을 삭제하려면 다음을 시도할 수 있습니다.

Sub DeteteTableExceptFormula()
    Dim tb As ListObject
    Set tb = activeworksheet.ListObjects("MyTable")
    tb.DataBodyRange.Delete
End Sub

언급URL : https://stackoverflow.com/questions/10220906/how-to-select-clear-table-contents-without-destroying-the-table

반응형