【问题标题】:Problems with obtaining last cell in VBA在 VBA 中获取最后一个单元格的问题
【发布时间】:2016-08-05 03:00:04
【问题描述】:

我正在尝试编写代码来创建数据透视表(作为更大代码的一部分),但我无法让它检测源数据。不幸的是,每次代码运行时,数据的行数都会不同,所以我希望代码自动找到最后一个包含数据的单元格。 我不断收到错误消息,指出需要对象或未定义变量。尽管去了 VBA 错误指南,但我找不到问题所在。

谁能看出这里的问题是什么?或者即使有更有效的方法来做到这一点?

Sub CreatePivotTable()
Dim sht As Worksheet
Dim pvtCache As PivotCache
Dim pvt As PivotTable
Dim StartPvt As String
Dim SrcData As Range, LRow As Range, LCol As Range

'Determine the data range you want to pivot
 Set LRow = Cells(Rows.Count, 1).End(xlUp).Row
 Set LCol = Cells(1, Columns.Count).End(xlToLeft).Column
 Set SrcData = Worksheets("Raw Data").Range("A1:Cells(LRow,LCol)")

'Create a new worksheet
    Sheets.Add.Name = "Pivot Table"
'Where do you want Pivot Table to start?
    StartPvt = Worksheets("Occupancy").Range("A15")

'Create Pivot Cache from Source Data
Set pvtCache = ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase,  SourceData:=SrcData)

'Create Pivot table from Pivot Cache
    Set pvt = pvtCache.CreatePivotTable(TableDestination:=StartPvt, TableName:="Occupancy")

'Create the headings and row and column orientation
    pvt.PivotFields("Precinct").Orientation = xlPageField
    pvt.PivotFields("Number").Orientation.xlDataField.Function = xlCount
    pvt.PivotFields("Captured Date").Orientation.xlColumnField.Position = 1
    pvt.PivotFields("Captured Session").Orientation.xlColumnField.Position = 2
    pvt.PivotFields("Session Location").Orientation.xlRowField.Position = 1

'Turn on Automatic updates/calculations --like screenupdating to speed up code
    pvt.ManualUpdate = False

End Sub

【问题讨论】:

  • 尝试Set SrcData = Worksheets("Raw Data").Range("A1").CurrentRegion 假设您的数据集中没有空白行或列

标签: vba excel


【解决方案1】:

引号内的任何内容都是字符串,因此"A1:Cells(LRow,LCol)" 成为字符串并且不获取单元格的地址(LRow,LCol)

改变

Set SrcData = Worksheets("Raw Data").Range("A1:Cells(LRow,LCol)")

LastCol = Split(Cells(, LCol).Address, "$")(1)
Set SrcData = Worksheets("Raw Data").Range("A1:" & LastCol & LRow)

或者到这个

Set SrcData = Worksheets("Raw Data").Range("A1:" & Cells(LRow,LCol).Address(False, False))

也改变

Dim LRow As Range, LCol As Range

Set LRow = Cells(Rows.Count, 1).End(xlUp).Row
Set LCol = Cells(1, Columns.Count).End(xlToLeft).Column

Dim LRow As Long, LCol As Long

LRow = Cells(Rows.Count, 1).End(xlUp).Row
LCol = Cells(1, Columns.Count).End(xlToLeft).Column

【讨论】:

  • LCol 和 LRow 被声明为范围。这是这里的另一个问题,特别是导致他的“需要对象”错误(Set Range = Long)的原因。您还应该将 Dim 更改为预期的类型。
  • @Mikegrann:好点。我错过了
  • 谢谢大家。我认为错误已经消失了。不幸的是,我无法判断,因为它现在说“参考无效”指的是 Set pvt = pvtCache.CreatePivotTable(TableDestination:=StartPvt, TableName:="Occupancy")
  • @user6661501:请参阅This 链接了解如何从 pivotcache 创建。您必须提供 RC 格式的地址
【解决方案2】:

使用表来存储数据并为其命名。然后将数据透视源设置为表名

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-28
    相关资源
    最近更新 更多