首先,如果这个问题太明显,我会事先道歉。我几年没有和VBA和Excel合作过了,我在其他地方找不到问题的答案。
我希望我的VBA程序从工作表中获取数据" ReportData"并使用它在新工作表上创建一些数据透视表"报告"。
我的问题是关于细胞参考。我认为,只要您激活或选择工作表,该工作表就成为VBA的参考点。因此,像Cells(1,1).Value这样的语句将查看活动工作表的第一个单元格中的值。但是,我不知道为什么它不适合我。
这是适用于我的版本:
Dim PTCache As PivotCache
Dim PT As PivotTable
Dim ReportSheet As Worksheet
Dim ItemName As String
Dim Row As Long, Col As Long, i As Long
Application.ScreenUpdating = False
'Delete Report sheet if it exists
On Error Resume Next
Application.DisplayAlerts = False
Sheets("Report").Delete
On Error GoTo 0
'Add Report sheet
Set ReportSheet = Worksheets.Add
ActiveSheet.Name = "Report"
'Create Pivot Cache
Set PTCache = ActiveWorkbook.PivotCaches.Create( _
SourceType:=xlDatabase, _
SourceData:=Sheets("ReportData").Range("A1").CurrentRegion)
Row = 1
For i = 1 To 4
For Col = 1 To 7
ItemName = Sheets("ReportData").Cells(1, i + 2)
With Sheets("Report").Cells(Row, Col)
.Value = ItemName
.Font.Size = 16
End With
.
.
.
.
Next Col
Next i
我的问题是关于以下几行:
使用表格("报告")。单元格(行,列)
为什么我需要添加
"表("报告&#34)。"
?我认为最后一张激活的表格是"报告"。因此,如果我使用:
使用单元格(行,列)
单独 - 不应自动参考
表格("报告")。单元格(行,列)
? (它没有)。
我也试过激活"报告"在我引用单元格之前的工作表,但也没有用。例如,以下内容对我不起作用。它继续引用" ReportData"中的单元格。工作表(这不是我想要引用的工作表):
Dim PTCache As PivotCache
Dim PT As PivotTable
Dim ReportSheet As Worksheet
Dim ItemName As String
Dim Row As Long, Col As Long, i As Long
Application.ScreenUpdating = False
'Delete Report sheet if it exists
On Error Resume Next
Application.DisplayAlerts = False
Sheets("Report").Delete
On Error GoTo 0
'Add Report sheet
Set ReportSheet = Worksheets.Add
ActiveSheet.Name = "Report"
'Create Pivot Cache
Set PTCache = ActiveWorkbook.PivotCaches.Create( _
SourceType:=xlDatabase, _
SourceData:=Sheets("ReportData").Range("A1").CurrentRegion)
Row = 1
For i = 1 To 4
For Col = 1 To 7
ItemName = Sheets("ReportData").Cells(1, i + 2)
Worksheets("Report").Activate
With Cells(Row, Col)
.Value = ItemName
.Font.Size = 16
End With
.
.
.
.
Next Col
Next i
第二个例子不起作用?这让我疯了。我认为您所要做的就是首先激活 - 或选择 - 工作表,然后在此之后进行的任何单元格引用将用于工作表中已激活或选择的单元格。我在这里疯了吗?
答案 0 :(得分:1)
此类问题在此网站上相当常见......通常会跟随愿意回复者的评论列表,询问您是否正在捕获此事件或该事件,处理不同的工作簿,更改工作表名称,激活其他工作表等等,重点是,没有人可以肯定地说出了什么是错的 - 我们或你 - 因为你无法控制你的物体。
VBA就像一个小孩;你说的是不受控制的物体:
嘿,去甜品店,我会在5分钟后回来......哦,还有 来自顽皮的 OtherMacros 家庭的孩子也可能在那里。
虽然你的宝宝无疑是美丽的,但是它会花很多时间在顽皮的一步!
我已调整您的代码以便为您提供更多控制权,以便它不依赖于活动的工作簿和工作表,选择,默认属性等。它应该让您从正确的方向开始...而且不在那附近sweetshop叫Activate
。
哦,你不需要遍历Range
中的每个单元格来将其值复制到新的Range
,你只需将其读入Variant
并写入整个Variant
到新Range
。
Public Sub RunMe()
Const DATA_SHEET_NAME As String = "ReportData"
Const REPORT_SHEET_NAME As String = "Report"
Dim dataSheet As Worksheet
Dim reportSheet As Worksheet
Dim ptCache As PivotCache
Dim v As Variant
Dim b As Boolean
Application.ScreenUpdating = False
Set dataSheet = ThisWorkbook.Worksheets(DATA_SHEET_NAME)
'Delete Report sheet if it exists
On Error Resume Next
Set reportSheet = ThisWorkbook.Worksheets(REPORT_SHEET_NAME)
On Error GoTo 0
If Not reportSheet Is Nothing Then
b = Application.DisplayAlerts
Application.DisplayAlerts = False
reportSheet.Delete
Application.DisplayAlerts = b
End If
'Add Report sheet
Set reportSheet = ThisWorkbook.Worksheets.Add
reportSheet.Name = REPORT_SHEET_NAME
'Create Pivot Cache
Set ptCache = ThisWorkbook.PivotCaches.Create( _
SourceType:=xlDatabase, _
SourceData:=reportSheet.Range("A1").CurrentRegion)
'Write the item names
v = dataSheet.Range("C1").Resize(, 7).Value2
With reportSheet.Range("A1").Resize(, UBound(v, 2))
.Value = v
.Font.Size = 16
End With
Application.ScreenUpdating = True
End Sub