【问题标题】:How do I create a range out of the cells above a table?如何从表格上方的单元格中创建一个范围?
【发布时间】:2021-01-18 21:30:38
【问题描述】:

我的表格/范围标题行正上方的行中有公式。 我想复制公式值并将它们粘贴到表格/范围的最后(新)行。我知道如何使代码正常工作,除了对带有公式的行的引用。

这是我试图引用表格中第一个单元格上方两行的单元格的代码(我将其设置/定义为范围)。

Set rangeTopLeft = rangeActive.Cells(1, 1).Offset(-2)

我收到 1004 错误。

我继续通过调整 rangeTopLeft 的大小来创建一个范围,并执行其他步骤将值从公式复制并粘贴到新行。

如果我使用.Offset(-1),我不会收到错误消息,但这只会让我进入标题行中的第一列单元格。我猜,偏移量不能超出范围的边界。

'Paste Last Week's Formula Values to New Rows

Sub PasteValues()

Dim rangeList As Range
Dim rangeActive As Range
Dim rangeToCopy As Range
Dim lastRow As Range
Dim rangeName As String

Dim rowNumber As Integer
Dim dataBeginColumn As Integer
Dim actionColumn As Integer
Dim actionType As String

Dim nameColumn As Integer
Dim dataColumnFirst As Integer
Dim dataColumnLast As Integer

Dim response1 As VbMsgBoxResult
Dim response2 As VbMsgBoxResult

Set rangeList = Range("tTablesDetails").ListObject.DataBodyRange

nameColumn = 1
actionColumn = 7
actionType = "Append"

'Requires user to click "Yes" twice before pasting values
response1 = MsgBox("Do you want to past last week's formula values to tables of this Workbook?", vbYesNo + vbCritical)
If response1 = vbNo Then Exit Sub
    
response2 = MsgBox("Are you sure? This action cannot be undone.", vbYesNo + vbCritical)
        
If response2 = vbNo Then Exit Sub
      
For rowNumber = 1 To rangeList.Rows.Count
        
    If rangeList.ListObject.DataBodyRange(rowNumber, actionColumn).Value = actionType Then
        
        'get table name from row whose action column equals actiontype
        rangeName = rangeList.ListObject.DataBodyRange(rowNumber, nameColumn).Text
            
        Set rangeActive = Range(rangeName)
            
        Set rangeTopLeft = rangeActive.Cells(1, 1).Offset(-2)
                
        Set rangeToCopy = rangeTopLeft.Resize(1, rangeActive.Columns.Count)
            
        Set lastRow = rangeActive.Offset(rangeActive.Rows.Count).Resize(1, rangeActive.Columns.Count)
            
        lastRow = rangeToCopy.Value
                   
    End If
     
Next
     
MsgBox ("Finished Copying Values to New Rows")
    
End Sub

更新:我用以下 sn-p 解决了这个问题。

tableList 是一个 Range 对象,由工作簿中的一个表组成,其中列出了工作簿中各个表的详细信息。 Range 对象不需要指定 table 所在的工作表。

For rowNumber = 1 To tableList.Rows.Count
    If tableList.Item(rowNumber, actionColumn).Value = actionType Then
        tableName = tableList.Item(rowNumber, nameColumn).Value
        Set activeTable = Range(tableName)
        With activeTable
            .Rows(.Rows.Count + 1).Value = activeTable.Rows(-1).Value
        End With
    End If
Next

【问题讨论】:

  • rangeActive 是如何分配的,表在哪里?
  • 我不认为我们有完整的情况,但我猜你会想要rangeActive.Rows(1).Offset(-2) ...但我们仍然需要了解rangeActive
  • 查看上面我添加的代码。 rangeActive 分配随着代码循环工作簿不同工作表上的表名称而改变。

标签: excel vba


【解决方案1】:

使用ListObject 的内置属性,特别是HeaderRowRange

并且无需调整大小然后复制/粘贴值,您只需将值从HeaderRowRange 上方的行转移到新添加的ListRow

大概是这样的:

Sub Test()
    Dim myTable As ListObject
    Set myTable = Sheet1.ListObjects("Table1")

    Dim formulaRange As Range
    Set formulaRange = myTable.HeaderRowRange.Offset(-1)

    myTable.ListRows.Add.Range.Value = formulaRange.Value
End Sub

【讨论】:

  • 上面添加的代码
【解决方案2】:
Sub SO()
    Dim lst As ListObject
    Set lst = ActiveSheet.ListObjects("Table1")
    With lst.DataBodyRange
        .Rows(.Rows.Count + 1).Value = .Rows(1).Offset(-2).Value
    End With
End Sub

【讨论】:

  • @BigBen 我再次更正了代码 - 现在一切都按预期工作:公式中的值被写入表的末尾。 ?
  • 谢谢。如果我在循环时遍历不同的表名以便在循环时使用不同工作表上的表,这会起作用吗? ...我在不同工作表上的工作簿中有许多表格,我正在重复此过程。
  • @Nik 是的,这适用于任何表格,只要公式始终位于表格标题上方。您只需要调整我的代码以使用正确的工作表(和表名,如果需要)。
  • 那么,我需要在遍历每个表格时为它们定义表格吗?我可以在我的“表名查找列表”中添加一列,其中包含它所在的工作表名称。希望能解决这个问题。我认为使用 Range() 你不必告诉 VBA 表的位置....
  • @Nik 我需要在循环遍历每个表时为它们定义工作表吗? 是的,因为每个ListObject 都属于Worksheet我可以在我的...中添加一列 您可以从任何您想要的(包括硬编码)中获取表名列表。 我认为使用 Range() 你不必告诉 VBA 表的位置 你想知道该怎么做吗? ListObjects 非常适合这个东西 - 定位表。当然,您可以存储表格的位置,但这并不值得 - 请改用 ListObjects
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-02
  • 1970-01-01
  • 1970-01-01
  • 2016-11-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多