Есть ли способ определить область таблицы с помощью Excel программно с динамическими данными? - PullRequest
4 голосов
/ 20 сентября 2011

У меня есть лист, который содержит таблицу (созданный из запроса отчета jasper).Эта таблица будет источником моей сводной таблицы.Сводка создается с помощью внешнего подключения (из Microsoft Query).поскольку исходная таблица должна быть определена до того, как ее можно будет использовать в Micrososft Query, кто-нибудь может показать мне, как это сделать программно?

INFO:

  1. Здесь есть 2 документа,первая - это защищенные исходные данные, а вторая - сводный документ.
  2. Данные являются динамическими, а таблица содержит заголовок.

Есть ли способ определить область таблицыиспользовать Excel программно с динамическими данными?

Ответы [ 5 ]

4 голосов
/ 20 сентября 2011

Чтобы ответить на ваши комментарии из двух предыдущих ответов (чьи, на мой взгляд, соответствуют вашим потребностям).

Вот способ определения именованного диапазона с помощью 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 или более поздней версии):

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

Источник

2 голосов
/ 20 сентября 2011

Вы можете использовать имя динамического диапазона, которое автоматически расширяется до размера ваших данных - VBA не требуется

См. Запись Дебры в http://www.contextures.com/xlpivot01.html#Dynamic

1 голос
/ 09 декабря 2016

Вот как подойти, если вы не знаете размер диапазона: сначала получите индексные ссылки последней строки / столбца. Затем используйте индексы для создания "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
1 голос
/ 17 июля 2013
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
1 голос
/ 20 сентября 2011

Если вы используете таблицу (определено), вы можете вызвать образец объекта таблицы

Sub DefineTable()

Dim tbl As ListObject

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

tbl.Range.Select

End Sub

В противном случае создайте динамический диапазон, используя имя, например

= OFFSET (! Плана1 А1; 0; 0; COUNTA (плана1 A: А); COUNTA (плана1 1: 1))

Выберите имя для этого диапазона и в своей оси определите диапазон в = NameOfInterval

[] 's

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...