17

特定の日と食事に摂取した食品を記録するのに役立つエクセルがあります。私は、各行があなたが食べた食べ物、砂糖の量などを表すグリッドを持っています.

次に、すべてのデータを別のシートのテーブルに保存するための保存ボタンを追加しました。

これは私が試したものです

    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

私は何を間違っていますか?

前もって感謝します!

4

8 に答える 8

30

使用している Excel のバージョンはわかりません。これは 2007/2010 用に書かれています (Excel 2003 には別のアプローチが必要です)。

addDataToTableまた、どのように呼び出しているのか、何を渡しているのかについても言いませんarrData。ベース配列
を渡していると思います。0この場合 (および Table が Column で始まる場合A)iCountからカウントされ0、無効な.Cells(lLastRow + 1, iCount)列を参照しようとし0ます。

また、を利用していませんListObject。あなたのコードは、ListObject1 が row から始まると仮定してい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
于 2012-09-06T11:06:19.193 に答える
5

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

それが誰かを助けることを願っています。

于 2013-03-25T10:22:17.860 に答える
3

同じエラー メッセージが表示され、多くの試行錯誤の結果、ListObject に設定された高度なフィルターが原因であることがわかりました。高度なフィルターをクリアした後、 .listrows.add は再び正常に機能しました。フィルターをクリアするには、これを使用します-ワークシート全体ではなく、特定のリストオブジェクトに対してのみフィルターをクリアする方法がわかりません。

Worksheets("mysheet").ShowAllData
于 2014-12-04T17:18:38.383 に答える
-1

テーブルを削除して、別の名前で新しいテーブルを作成するだけです。また、そのテーブルの行全体を削除しないでください。テーブル行を含む行全体を削除すると、DataBodyRangeが破損しているようです

于 2016-06-11T13:19:32.090 に答える