有没有办法使用excel以动态数据编程方式定义表区域?

时间:2011-09-20 01:23:22

标签: excel excel-vba excel-formula vba

我有一张包含表格的表格(由jasper报告查询生成)。该表将是我的数据透视表的来源。使用外部连接(来自Microsoft Query)创建数据透视表。由于源表需要在可以在Micrososft Query中使用之前进行定义,有人能告诉我如何以编程方式进行操作吗?

信息:

  1. 这里有2个文档,第一个是受保护的源数据,第二个是Pivot文档。
  2. 数据是动态的,表格包含标题。
  3. 有没有办法使用excel以动态数据编程来定义表区域?

5 个答案:

答案 0 :(得分:4)

回答你之前的两个答案的评论(在我看来,这符合你的需要)。

以下是使用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 

Source

这是一种使用vba创建表的方法(记住它只适用于Excel 2007或更高版本):

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

Source

答案 1 :(得分:2)

您可以使用动态范围名称,该名称会自动扩展到您的数据大小 - 无需VBA

见黛布拉在http://www.contextures.com/xlpivot01.html#Dynamic

上写的

答案 2 :(得分:1)

如果使用表(已定义),则可以调用表对象样本

Sub DefineTable()

Dim tbl As ListObject

Set tbl = Sheets("Plan1").ListObjects(1)

tbl.Range.Select

End Sub

否则使用名称创建动态范围,例如

= OFFSET(计划1 A1; 0; 0; COUNTA(计划1答:!A); COUNTA(计划1 1:1))

选择此范围的名称,并在您的数据透视表中定义范围= NameOfInterval

[]的

答案 3 :(得分:1)

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

答案 4 :(得分:1)

如果你不知道范围大小,这里是如何处理:首先得到最后一行/列的索引引用。然后使用索引创建“Table1”

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