Макрос Excel VBA Создание сводной таблицы с динамическим диапазоном данных: ошибка диапазона исходных данных

Я новичок в кодировании VBA и пытаюсь создать макрос Excel, который будет создавать сводную таблицу на основе динамического диапазона данных. Я использую Excel 2016

Количество столбцов в данных останется неизменным, но количество строк будет динамическим.

В моей таблице данных столбец BZ содержит количество записей в наборе данных. Например, если в наборе данных 30 записей, каждое значение в столбце BZ будет равно 30. (Эти данные импортируются из SAS с использованием DDE, поэтому я выбрал этот метод). Поэтому я добавил 1 в переменную lastRow ниже, чтобы включить имена столбцов.

Мой код макроса VBA в настоящее время выглядит следующим образом:

Sub Macro1()
   Dim xlsPath As String
   Dim xlsFile As String
   Dim lastRow As Integer
   Dim SrcData As String
   Dim StartPvt As String
   Dim pvtCache As PivotCache
   Dim pvt As PivotTable

   xlsxPath = "N:\Analytics\Test\DDE\"
   xlsxFile = "Test.xlsx"

   lastRow = Sheets(1).Range("BZ2") + 1

   SrcData = ActiveSheet.Name & "!" & Range("A1:R" & lastRow & "C77").Address(ReferenceStyle:=xlR1C1)

   StartPvt = sht.Name & "!" & sht.Range("A3").Address(ReferenceStyle:=xlR1C1)

   Workbooks.Open Filename:=xlsxPath & xlsxFile

   Range("A1:BY" & lastRow).Select

   Sheets.Add

   Set pvtCache = ActiveWorkbook.PivotCaches.Create( _
   SourceType:=xlDatabase, _
   SourceData:=SrcData, Version:=6)

   Set pvt = pvtCache.CreatePivotTable( _
   TableDestination:=StartPvt, _
   TableName:="PivotTable1", DefaultVersion:=6)

   Columns("BZ:BZ").Select
   Selection.Delete Shift:=xlToLeft
   ActiveWorkbook.Save
   ActiveWorkbook.Close
End Sub

Это приводит к ошибке, которая говорит:

Ошибка во время выполнения "1004":

Метод 'Range' для 'object'_Global' не удался

Отладчик указывает на строку, где определяется диапазон SrcData. Я думаю, что проблема может быть в синтаксисе, где я указал lastRow в Range.

Решение для этой строки кода или любые другие полезные комментарии будут с благодарностью.

0 ответов

Вы можете включить средство записи макросов, затем щелкнуть в любом месте набора данных, и Excel автоматически выберет последний использованный столбец и последнюю использованную строку в этом наборе данных непосредственно перед созданием сводной таблицы. Попробуйте, и вы увидите. Если вы хотите использовать VBA для динамического выбора последней строки и динамического выбора последнего столбца, ознакомьтесь с приведенным ниже кодом.

Способы найти последнюю строку

Sub FindingLastRow()
'PURPOSE: Different ways to find the last row number of a range
'SOURCE: www.TheSpreadsheetGuru.com

Dim sht As Worksheet
Dim LastRow As Long

Set sht = ActiveSheet

'Using Find Function (Provided by Bob Ulmas)
  LastRow = sht.Cells.Find("*", searchorder:=xlByRows, searchdirection:=xlPrevious).Row

'Using SpecialCells Function
  LastRow = sht.Cells.SpecialCells(xlCellTypeLastCell).Row

'Ctrl + Shift + End
  LastRow = sht.Cells(sht.Rows.Count, "A").End(xlUp).Row

'Using UsedRange
  sht.UsedRange 'Refresh UsedRange
  LastRow = sht.UsedRange.Rows(sht.UsedRange.Rows.Count).Row

'Using Table Range
  LastRow = sht.ListObjects("Table1").Range.Rows.Count

'Using Named Range
  LastRow = sht.Range("MyNamedRange").Rows.Count

'Ctrl + Shift + Down (Range should be first cell in data set)
  LastRow = sht.Range("A1").CurrentRegion.Rows.Count

End Sub

Способы найти последний столбец:

Sub FindingLastColumn()

'PURPOSE: Different ways to find the last column number of a range
'SOURCE: www.TheSpreadsheetGuru.com

Dim sht As Worksheet
Dim LastColumn As Long

Set sht = ThisWorkbook.Worksheets("Sheet1")

'Ctrl + Shift + End
  LastColumn = sht.Cells(7, sht.Columns.Count).End(xlToLeft).Column

'Using UsedRange
  sht.UsedRange 'Refresh UsedRange
  LastColumn = sht.UsedRange.Columns(sht.UsedRange.Columns.Count).Column

'Using Table Range
  LastColumn = sht.ListObjects("Table1").Range.Columns.Count

'Using Named Range
  LastColumn = sht.Range("MyNamedRange").Columns.Count

'Ctrl + Shift + Right (Range should be first cell in data set)
  LastColumn = sht.Range("A1").CurrentRegion.Columns.Count

End Sub

Вы можете легко включить это в уже имеющийся у вас код.

Другие вопросы по тегам