【问题标题】:Excel 2016: Insert Row ABOVE find result in tableExcel 2016:在表中插入行上方查找结果
【发布时间】:2018-08-26 21:45:09
【问题描述】:

我是编程新手,并试图掌握这些概念。我要完成的工作:

  1. 遍历第一个表以获取要搜索的字符串
  2. 然后在第二个表中找到该字符串的第一个实例(如果存在)
  3. 然后将行(从第一个表)插入/复制到第二个表中找到实例的行上方(在第二个表中)...或者如果不存在实例:在底部添加一个新行第二个表并在那里插入/复制行。

我认为我的第二部分工作正常

我的不足之处在于找出正确执行此操作的 ListObject 方法。我尝试使用“activecell”方法,但这并没有给我在表格中的正确位置。我进行了广泛的搜索,发现很少使用 ListObject 方法插入甚至粘贴到表中的动态位置。

Dim lastRow, eachRow1, unitRow, qtyRow As Long
Dim ws1, ws2, ws3 As Worksheet
Dim tbl1, tbl2, tbl3 As ListObject
Dim chkFrst As Boolean
Dim qtyValue, yumItem As String
Dim qty, stockQty, calcQty As Integer
Dim lastDate, reDate As Date
Dim findRng As Range
Dim NewRow, addRow As ListRow
Set ws1 = Sheets("UPDATE")
Set ws2 = Sheets("DATA")
Set ws3 = Sheets("LOG")
Set tbl1 = ws1.ListObjects("Update_Table")
Set tbl2 = ws2.ListObjects("Data_Table")
Set tbl3 = ws3.ListObjects("Log_Table")

For unitRow = 1 To tbl1.ListRows.Count
    yumItem = tbl1.ListColumns("ITEM").DataBodyRange.Cells(unitRow, 1).Value
    Set findRng = tbl3.Range.Find(What:=yumItem)
    If findRng Is Nothing Then
        Set NewRow = tbl3.ListRows.Add(AlwaysInsert:=True)
        NewRow.Range.RowHeight = 25
        NewRow.Range = tbl1.DataBodyRange.Cells.Range("A" & unitRow & ":O" & 
        unitRow).Value
    Else
        Application.Goto findRng, True
        ActiveCell.EntireRow.Insert Shift = xlDown
        Dim crntRow As Long
        crntRow = ActiveCell.Row
        Set NewRow = tbl3.InsertRowRange.Cells.Range(crntRow)
        NewRow.Range = tbl1.DataBodyRange.Cells.Range("A" & unitRow & ":O" & 
        unitRow).Value
   End If
Next unitRow

非常感谢任何和所有帮助!

【问题讨论】:

  • 你试过使用宏记录器吗?尽管生成的代码需要谨慎使用,但它通常会帮助您朝着正确的方向前进。

标签: excel vba insert row listobject


【解决方案1】:

您可以将EntireRow.Insert 与您的FindRng 范围一起使用。

Set findRng = tbl3.Range.Find(What:=yumItem)
findRng.EntireRow.Insert Shift:=xlDown

这将在您的范围正上方创建一个新行。这将向下移动找到的行,在其位置留下一个空行。1


只想为某些列插入新行?只需将EntireRow 替换为Columns()。下面的示例将为 A:C 列插入一行:

findRng.Columns("A:C").Insert Shift:=xlDown

1 感谢clarifying 那一点,吉普!

【讨论】:

  • '这将在您的范围正上方创建一个新行。'说实话,更准确的说法是 fndRng 将被向下推留下一个空白行在其原来的位置。
【解决方案2】:

感谢您的洞察力,我想我必须使用 ListRows.Add 来与 ListObject 格式相一致。所以插入行不是问题,但我必须以某种方式格式化单元格并且需要引用新行所以我尝试了

findRng.Columns("A:O").Insert Shift:=xlDown
Set NewRow = findRng.Offset(-1, 0)
NewRow.Range.RowHeight = 25
NewRow.Range = tbl1.DataBodyRange.Cells.Range("A" & 
unitRow & ":O" & unitRow).Value

但现在我收到“参数数量错误或属性分配无效”。如何设置新行?

【讨论】:

    猜你喜欢
    • 2017-10-23
    • 2017-05-12
    • 2014-10-20
    • 1970-01-01
    • 1970-01-01
    • 2012-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多