excel 使用宏向从其他工作表中提取值的表中添加新行

rqqzpn5f  于 2023-01-18  发布在  其他
关注(0)|答案(1)|浏览(167)

我试图让一个宏工作,它添加一个新的行到一个表,插入值从另一个工作表。
到目前为止,我已经设法让宏插入第一行,但是随后的行会覆盖前一行。目前,我已经将'Line'变量放入其中,它会产生一些不同的行为,其中第一行插入3次,然后随后的行再向下插入几行。
摘录如下:

Sub UpdateItemIndex(ItemName As String)

    Dim ItemIndexSheet As Worksheet
    Dim ItemIndexTable As ListObject
    Dim NewEntryRow As ListRow
    Dim NewEntryRowIndex As Integer
    Dim RangeName As String
    
    Set ItemIndexSheet = Sheets("Item Index")
    ItemIndexSheet.Select
    
    
    Set ItemIndexTable = ItemIndexSheet.ListObjects(1)
    'Remove any filters
    ItemIndexTable.AutoFilter.ShowAllData
    
    Set NewEntryRow = ItemIndexTable.ListRows.Add
    
    NewEntryRowIndex = NewEntryRow.Index
    
    'Line = Range("NextItemIndex").Value
    Line = Worksheets("Resources").Cells(2, 5)
    
    NewEntryRow.Range(Line, "A").Value = ItemName
       
    RangeName = ItemName & "!" & "ItemTitle"
    NewEntryRow.Range(Line, "B").Formula = "=" & ItemName & "!" & Range(RangeName).Address
    
    RangeName = ItemName & "!" & "ItemStatus"
    NewEntryRow.Range(Line, "C").Formula = "=" & ItemName & "!" & Range(RangeName).Address
       
End Sub

在“Line”变量之前,新的行输入命令为:

NewEntryRow.Range(1, "B").Formula = "=" & ItemName & "!" & Range(RangeName).Address

这是一个较大宏的一部分,单击该宏的按钮将生成一个新工作表,并使用新值更新表。
我是新的VBA,所以将不胜感激的任何迹象表明是什么问题!

vjhs03f7

vjhs03f71#

由于您已经有了NewEntryRow-它表示新行-您肯定不需要它的索引。NewEntryRow只有一行!
这应该行得通:

With NewEntryRow
    .Range(1, "A") = ItemName
    .Range(1, "B") = "=" & ItemName & "!ItemTitle"
    .Range(1, "C") = "=" & ItemName & "!ItemStatus"
End With

当你"命名"标题和状态单元格时,你可以用名字来引用它们。你不需要地址。

  • --update--您需要添加以下行来关闭自动公式更新:
Application.AutoCorrect.AutoFillFormulasInLists = False
    With NewEntryRow
        .Range(1, "A") = ItemName 
        .Range(1, "B") = "=" & ItemName & "!ItemTitle"
        .Range(1, "C") = "=" & ItemName & "!ItemStatus"
    End With
Application.AutoCorrect.AutoFillFormulasInLists = True

这将导致许多红色符号-因为Excel希望公式在表中保持一致
如果你能接受INDIRECT公式,你就可以避免这种情况:

With NewEntryRow
        .Range(1, "A") = ItemName 
        .Range(1, "B") = "=INDIRECT([@" & ItemIndexTable.ListColumns(1).Name & "] & ""!ItemTitle"")"
        .Range(1, "C") = "=INDIRECT([@" & ItemIndexTable.ListColumns(1).Name & "] & ""!ItemStatus"")"
    End With

相关问题