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
'programing' 카테고리의 다른 글
워크시트 기능과 함께 1004 오류를 처리하는 방법.V 룩업? (0) | 2023.07.16 |
---|---|
문자열을 정의할 수 있습니까?TypeScript에서 비어 있습니까? (0) | 2023.07.16 |
Matplotlib에게 두 번째(새) 그림을 만든 다음 나중에 이전 그림에 그림을 그리도록 지시하려면 어떻게 해야 합니까? (0) | 2023.07.16 |
Mariadb에서 EntityFrameworkCore를 사용하여 재귀 SQL을 실행할 때 오류 발생 (0) | 2023.07.16 |
비디오 임베디드 워드프레스에서 "유체-폭-비디오-랩퍼" 클래스를 제거하는 방법 (0) | 2023.07.16 |