programing

Excel 테이블(VBA)에 새 행 추가

instargram 2023. 7. 16. 12:31
반응형

Excel 테이블(VBA)에 새 행 추가

나는 당신이 특정한 날과 식사를 위해 섭취한 음식을 기록하는 엑셀을 가지고 있습니다.저는 각 줄이 여러분이 먹은 음식, 설탕이 얼마나 들어 있는지 등을 나타내는 격자를 가지고 있습니다.

그런 다음 저장 버튼을 추가하여 모든 데이터를 다른 시트의 테이블에 저장했습니다.

이것이 제가 시도한 것입니다.

    Public Sub addDataToTable(ByVal strTableName As String, ByRef arrData As Variant)
    Dim lLastRow As Long
    Dim iHeader As Integer
    Dim iCount As Integer

    With Worksheets(4).ListObjects(strTableName)
        'find the last row of the list
        lLastRow = Worksheets(4).ListObjects(strTableName).ListRows.Count

        'shift from an extra row if list has header
        If .Sort.Header = xlYes Then
            iHeader = 1
        Else
            iHeader = 0
        End If
    End With

    'Cycle the array to add each value
    For iCount = LBound(arrData) To UBound(arrData)
        **Worksheets(4).Cells(lLastRow + 1, iCount).Value = arrData(iCount)**
    Next iCount
End Sub

하지만 강조 표시된 라인에서 동일한 오류가 계속 발생합니다.

Application-defined or object-defined error

내가 뭘 잘못하고 있는 거지?

잘 부탁드립니다!

당신은 어떤 버전의 엑셀을 사용하고 있는지 말하지 않습니다.이 문서는 2007/2010년에 작성되었습니다(Excel 2003의 경우 다른 접근 방식이 필요함).

당신은 또한 당신이 어떻게 전화하고 있는지 말하지 않습니다.addDataToTable은 리고당전고있는것하달신입니다.arrData.
제 생각에 당신은 합격한 것 같습니다.0 그렇다면 (컬럼 이에서 합니다.)A그 다음 ) 그때iCount에서 다계니됩부터 합니다.0그리고..Cells(lLastRow + 1, iCount)는 열을 .0그것은 무효입니다.

당신은 또한 그것을 이용하지 않습니다.ListObject는 코는다가니다합정으로 합니다.ListObject은 1행부터 합니다.1그렇지 않으면 코드가 데이터를 잘못된 행에 배치합니다.

다음은 다음을 활용한 대안입니다.ListObject

Sub MyAdd(ByVal strTableName As String, ByRef arrData As Variant)
    Dim Tbl As ListObject
    Dim NewRow As ListRow

    ' Based on OP 
    ' Set Tbl = Worksheets(4).ListObjects(strTableName)
    ' Or better, get list on any sheet in workbook
    Set Tbl = Range(strTableName).ListObject
    Set NewRow = Tbl.ListRows.Add(AlwaysInsert:=True)

    ' Handle Arrays and Ranges
    If TypeName(arrData) = "Range" Then
        NewRow.Range = arrData.Value
    Else
        NewRow.Range = arrData
    End If
End Sub

다양한 방법으로 호출할 수 있습니다.

Sub zx()
    ' Pass a variant array copied from a range
    MyAdd "MyTable", [G1:J1].Value
    ' Pass a range
    MyAdd "MyTable", [G1:J1]
    ' Pass an array
    MyAdd "MyTable", Array(1, 2, 3, 4)
End Sub

Tbl.ListRows.Add저한테는 안 통하고 다른 많은 사람들도 같은 문제에 직면해 있다고 생각합니다.다음 해결 방법을 사용합니다.

    'First check if the last row is empty; if not, add a row
    If table.ListRows.count > 0 Then
        Set lastRow = table.ListRows(table.ListRows.count).Range
        For col = 1 To lastRow.Columns.count
            If Trim(CStr(lastRow.Cells(1, col).Value)) <> "" Then
                lastRow.Cells(1, col).EntireRow.Insert
                'Cut last row and paste to second last
                lastRow.Cut Destination:=table.ListRows(table.ListRows.count - 1).Range
                Exit For
            End If
        Next col
    End If

    'Populate last row with the form data
    Set lastRow = table.ListRows(table.ListRows.count).Range
    Range("E7:E10").Copy
    lastRow.PasteSpecial Transpose:=True
    Range("E7").Select
    Application.CutCopyMode = False

누군가에게 도움이 되길 바랍니다.

저도 같은 오류 메시지를 받았고 많은 시행착오 끝에 ListObject에 설정된 고급 필터에 의해 발생한 것이라는 것을 알게 되었습니다.고급 필터 .listrows.add를 지운 후 다시 정상적으로 작동했습니다.필터를 지우려면 이 방법을 사용합니다. 완전한 워크시트 대신 특정 목록 개체에 대한 필터만 지울 수 있는 방법을 알 수 없습니다.

Worksheets("mysheet").ShowAllData

는 사실 의 표에 있는 ,Selection.ListObject.ListRows.Add AlwaysInsert:=True정말 잘 작동합니다.는 제 테이블에 번했을 뿐입니다.

이전에도 같은 문제가 있었고 새 시트에서 동일한 테이블을 만들고 테이블과 관련된 모든 이름 범위를 삭제하여 수정했습니다. 목록 개체를 사용할 때 테이블에 이름 범위가 포함되지 않도록 해야 합니다. 감사합니다.

이 했습니다. (은 " " " 를 때 충돌합니다." (Excel은 " 를 사용합니다.").ListRows.Add이 게시물을 읽고 제 표를 확인한 후, 저는 행에 있는 일부 셀의 공식 계산이 다른 셀의 값에 의존한다는 것을 깨달았습니다.더 높은 열의 세포와 공식을 가진 세포의 경우!

솔루션은 계산이 잘못되지 않도록 새로 추가된 행을 뒤에서 앞으로 채우는 것이었습니다.

Excel은 일반적으로 다른 셀에서 수식을 처리할 수 있지만, 재계산의 테이블 킥에 열(A, B, C 등) 순서대로 행을 추가하는 것 같습니다.

이것이 문제를 해결하는 데 도움이 되기를 바랍니다..ListRows.Add

사용할 때ListRow.Add큰 병 목이 될 수 있습니다. 피할 수 없는 경우에만 사용해야 합니다.성능이 중요한 경우 여기서 이 기능을 사용하여 테이블 크기를 조정하십시오. 이는 권장되는 방법으로 행을 추가하는 것보다 훨씬 빠릅니다.

테이블 아래에 데이터가 있는 경우 테이블 아래에 데이터가 덮어쓰게 됩니다.

이 기능은 Chris Neilsen의 승인된 답변을 기반으로 합니다.

Public Sub AddRowToTable(ByRef tableName As String, ByRef data As Variant)
    Dim tableLO As ListObject
    Dim tableRange As Range
    Dim newRow As Range

    Set tableLO = Range(tableName).ListObject
    tableLO.AutoFilter.ShowAllData

    If (tableLO.ListRows.Count = 0) Then
        Set newRow = tableLO.ListRows.Add(AlwaysInsert:=True).Range
    Else
        Set tableRange = tableLO.Range
        tableLO.Resize tableRange.Resize(tableRange.Rows.Count + 1, tableRange.Columns.Count)
        Set newRow = tableLO.ListRows(tableLO.ListRows.Count).Range
    End If

    If TypeName(data) = "Range" Then
        newRow = data.Value
    Else
        newRow = data
    End If
End Sub

테이블을 삭제하고 다른 이름으로 새 테이블을 만들기만 하면 됩니다.또한 해당 테이블의 전체 행을 삭제하지 않습니다.테이블 행을 포함하는 전체 행이 삭제되면 DataBodyRange가 손상된 것 같습니다.

언급URL : https://stackoverflow.com/questions/12297738/add-new-row-to-excel-table-vba

반응형