是否有任何方法可以使用excel以动态数据编程方式定义表格区域?

是否有任何方法可以使用excel以动态数据编程方式定义表格区域?,excel,excel-formula,vba,Excel,Excel Formula,Vba,我有一张表,其中包含一个表(由jasper report query生成)。此表将是我的透视表的源。枢轴是使用外部连接(从Microsoft Query)创建的。由于源表需要先定义,然后才能在Microsoft查询中使用,有人能告诉我如何通过编程实现吗 信息: 这里有两个文档,第一个是受保护的源数据,第二个是透视文档 数据是动态的,表中包含一个标题 是否有任何方法可以使用excel以编程方式使用动态数据定义表区域?如果使用表(已定义),可以调用表对象示例 Sub DefineTable() D

我有一张表,其中包含一个表(由jasper report query生成)。此表将是我的透视表的源。枢轴是使用外部连接(从Microsoft Query)创建的。由于源表需要先定义,然后才能在Microsoft查询中使用,有人能告诉我如何通过编程实现吗

信息:

  • 这里有两个文档,第一个是受保护的源数据,第二个是透视文档
  • 数据是动态的,表中包含一个标题
  • 是否有任何方法可以使用excel以编程方式使用动态数据定义表区域?

    如果使用表(已定义),可以调用表对象示例

    Sub DefineTable()
    
    Dim tbl As ListObject
    
    Set tbl = Sheets("Plan1").ListObjects(1)
    
    tbl.Range.Select
    
    End Sub
    
    否则,例如使用名称创建动态范围

    =偏移量(平面1!A1;0;0;计数A(平面1!A:A);计数A(平面1!1:1))

    为该范围选择一个名称,然后在透视图中定义一个范围,范围为=NameOfInterval


    []的

    回答您对前面两个答案的评论(我认为这两个答案符合您的需要)

    以下是使用vba定义命名范围的方法:

    Dim Rng1 As Range 
    'Change the range of cells (A1:B15) to be the range of cells you want to define
    Set Rng1 = Sheets("Sheet1").Range("A1:B15") 
    ActiveWorkbook.Names.Add Name:="MyRange", RefersTo:=Rng1 
    

    以下是使用vba创建表的方法(请记住,它仅适用于Excel 2007或更高版本):


    如果您不知道范围大小,下面介绍如何处理:首先获取最后一行/列的索引引用。然后使用索引创建“表1”


    我需要定义表/区域的名称,如何实现?
    Sub CreateTable()
        ActiveSheet.ListObjects.Add(xlSrcRange, Range("$B$1:$D$16"), , xlYes).Name = _
            "Table1"
            'No go in 2003
        ActiveSheet.ListObjects("Table1").TableStyle = "TableStyleLight2"
    End Sub
    
    Public Function CopyDist() As Variant
    On Error Resume Next
    CopyDist = 0
    '   RemoveTableStyle
    Dim oSh As Worksheet
    Set oSh = ActiveSheet
    '    Set oSh =  'Sheets("Sheet1")
    Dim oNewRow As ListRow
    
    Dim myfirstrow As Integer
    Dim mylastrow As Integer
    Dim myfirstcolumn As Integer
    Dim myValue As Variant
    
    
    myfirstrow = ActiveCell.Row + 1
    mylastrow = ActiveCell.Row + 1
    myfirstcolumn = ActiveCell.Column
    Cells(myfirstrow, myfirstcolumn).Select
    Cells(myfirstrow, myfirstcolumn).Clear
    
    oSh.Range("$A$1:$D$16").Select
    oSh.ListObjects.Add(xlSrcRange, oSh.Range("$A$1:$D$16"), , xlYes).Name = "Table1"
    'No go in 2003
    oSh.ListObjects("Table1").TableStyle = "TableStyleLight2"
    ' CreateTable
    If oSh.ListObjects.Count > 0 Then
      myValue =oSh.ListObjects.Count 
    End If
    RemoveTableStyle
    CopyDist = 1
    End Function
    
    Dim lngLastColumn as Long
    Dim lngLastRow as Long
    Set oxlSheet = oxlWB.Worksheets(1) '''or whichever sheet you need    
    
    With oXlSheet
            lngLastColumn = .Cells(1, .Columns.Count).End(xlToLeft).Column
            lngLastRow = .Cells(.Rows.Count, "A").End(xlUp).Row
            .ListObjects.Add(xlSrcRange, .Range(.Cells(1, 1), .Cells(lngLastRow, lngLastColumn)), , xlYes).Name = "Table1"
        End With