为什么我无法更改工作表参考?

2023-11-30

首先,如果这个问题太明显,我提前道歉。我只是几年没有使用 VBA 和 Excel,而且在其他地方找不到我的问题的答案。

我希望我的 VBA 程序从工作表“ReportData”中获取数据,并使用它在新工作表“Report”上创建一些数据透视表。

我的问题是关于单元格引用的。我认为,只要激活或选择一个工作表,那么该工作表就成为 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

我的问题是关于以下行:

With Sheets("Report").Cells(Row, Col)

为什么我需要添加

“表格(“报告”)。”

?我以为最后激活的工作表是“报告”。因此,如果我使用:

带单元格(行、列)

单独 - 不应该自动引用

工作表(“报告”).单元格(行,列)

? (事实并非如此)。

我还尝试在引用单元格之前激活“报告”工作表,但这也不起作用。例如,以下内容对我不起作用。它继续引用“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

第二个例子不起作用是什么?这让我发疯。我认为您所要做的就是首先激活或选择一个工作表,然后您所做的任何单元格引用都将针对您已激活或选择的工作表中的单元格。我在这里要疯了吗?


此类问题在此网站上相当常见......并且通常后面是自愿受访者的一系列评论,询问您是否正在捕获这个或那个事件、处理不同的工作簿、更改工作表名称、激活其他工作表等。关键是,没有人能确定哪里出了问题——我们或你——因为你无法控制你的对象。

VBA就像一个幼儿;对于不受控制的物体,你说:

嘿,去糖果店吧,我 5 分钟后回来……哦,还有 那些淘气的孩子其他宏家人也可能在那里。

尽管您的宝宝无疑很漂亮,但它会在淘气的步骤上花费大量时间!

我已经调整了您的代码,为您提供更多控制权,以便它不依赖于活动工作簿和工作表、选择、默认属性等。它应该让您朝着正确的方向开始......而且离那个叫糖果店的地方很远Activate.

哦,你不需要循环遍历 a 中的每个单元格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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么我无法更改工作表参考? 的相关文章

  • Office excel将CORS请求作为跨域请求

    我正在尝试从我的 Excel 插件发出跨域请求 正如这里所建议的 http dev office com docs add ins develop addressing same origin policy limitations http
  • 如何找到特定程序的安装目录?

    我已经成功地编写了一些用于工作的 VBA 宏 这些宏基本上创建了一个数据文件 将其提供给一个程序并对该程序的输出进行后处理 我的问题是程序安装路径是硬编码在宏中的 并且安装在我同事的计算机上可能会有所不同 我首先想到的是 我可以从每个人那里
  • 在合并的单元格中选择、插入照片并将其居中

    我是一名研发面包师 正在为我的团队制作食谱模板 模板中有照片 但我需要轻松地允许他们单击一个按钮 打开照片的文件选择器 然后将该照片放在合并的单元格中 我其实不太擅长做这个 Sub InsertPhotoMacro Dim photoNam
  • 将包含宏的工作簿复制到不带宏的工作簿

    我能够复制工作簿 复制到所需位置 其中在后台包含宏 该副本还包含相同的宏 我的问题是我不希望这个重复的工作簿包含宏 谁能告诉怎么做吗 先感谢您 将您的工作簿保存为无宏 即简单地保存为 Excel 工作簿 对于我的 Excel 2007 这是
  • JasperReports 中每个工作表属性一页

    我有一个要求 我必须在 JasperReports 中设计一个报告 该报告有 4 页 第一张纸有 5 页 类似的其他纸有一页或两页 我面临的问题是 如果我使用net sf jasperreports export xls one page
  • 我可以获取VBA代码中的注释文本吗

    可以说我有以下内容 Public Sub Information TEST End Sub 有没有办法得到 TEST 结果 不知何故通过VBA 例如 在 PHP 中 有一个获取注释的好方法 这里有什么想法吗 编辑 应该有办法 因为像 MZ
  • 如何等到 Excel 计算公式后再继续 win32com

    我有一个 win32com Python 脚本 它将多个 Excel 文件合并到电子表格中并将其另存为 PDF 现在的工作原理是输出几乎都是 NAME 因为文件是在计算 Excel 文件内容之前输出的 这可能需要一分钟 如何强制工作簿计算值
  • VBA ByRef 参数类型不匹配

    最初在我的主代码部分中 我有一个丑陋的 if 语句 尽管它会运行丑陋 我决定将其设为我要调用的函数 这导致我收到错误 编译错误 ByRef 参数类型不匹配 我的假设是该函数需要正确引用 尽管我一直在阅读文档并且不明白为什么 gt 声明 Sh
  • 在Excel中,我可以使用超链接来运行vba宏吗?

    我有一个包含多行数据的电子表格 我希望能够单击一个单元格 该单元格将使用该行中的数据运行宏 由于行数总是在变化 我认为每行的超链接可能是最好的方法 ROW MeterID Lat Long ReadX ReadY ReadZ CoeffA
  • 两个日期之间的小时数在 Excel 中不起作用

    根据要求 我提供了一张简化的屏幕截图来说明该问题 如您所见 我减去了两个日期并将其格式化为 h mm ss 为什么这不能提供两个日期之间经过的总小时数 有一个更好的方法吗 下面有一个很好的答案 但我试图弄清楚为什么按照此屏幕截图中所示的方式
  • 标志状态的 VBA 替换

    根据文档 Outlook 中的 MailItem FlagStatus 属性是已弃用 https msdn microsoft com en us library microsoft office interop outlook maili
  • 我如何以更好的方式编码而不是像这样的VBA编码

    我正在 Excel 中创建一个仪表板 但是我想知道是否有比这更好的编码方式 我想对其进行模块化 而不是这样做以使其更加整洁 Private Sub Afford If af Value True Then af afr Value Shee
  • 在VBA中初始化全局变量

    在 Excel 2003 中 如何声明全局变量并仅在打开工作簿时初始化它们一次 我有一些由几个宏使用的参数 基本上是输入文件的路径 目前 我的代码如下所示 global path1 path2 as string sub initPaths
  • 获取当前 VBA 函数的名称

    对于错误处理代码 我想获取发生错误的当前 VBA 函数 或子函数 的名称 有谁知道如何做到这一点 编辑 谢谢大家 我曾希望存在一个未记录的技巧来自行确定函数 但这显然不存在 我想我会保留当前的代码 Option Compare Databa
  • 使用 FindElementbyXpath() 获取 Selenium Basic 中可填充框的行和列名称

    我正在使用 Selenium Basic 将电子表格中的文本填充到网站中 网站的html代码是这样的 div table cellspacing 0 border 1 style width 99 tr th style font weig
  • Excel 2003 中的 IFERROR

    我通过阅读几个线程了解到IFERROR在 Excel 2003 中由IF ISERROR 我尝试从 Excel 2007 复制的代码是 IFERROR A1 我知道必须有一个简单的解决方案将其转换为IF ISERROR 但我没有任何效果 意
  • 在 Excel 中使用 VBA 设置图像透明度

    有没有办法使用 VBA 脚本对图像应用一些透明度 我录制了一个 宏 但似乎没有录制艺术效果 我已经找到了如何制作形状 但没有找到图像 这需要几个步骤 将自选图形 如矩形 放置在工作表上 使用以下方法将您的实际图片嵌入矩形中 ShapeRan
  • 在 Excel 中生成随机 -1 和 +1 值

    The Rand 函数会生成一个 0 到 1 之间的实数 这Randbetween 1 1 将生成 1 0 或 1 我想要的只是 1或1 那么 1 到 1 之间的实数呢 Easy IF RAND lt 0 5 1 1 要获得实数 请使用 R
  • 使用 VBScript 在日期字段值上选择错误的数据

    我有一张包含以下数据的表 现在 Excel 共有 36 个任务 每个任务有 4 列 第一个任务 即 Task1 名称将始终从 L 列开始 144 列描述了 36 个任务 现在我们需要按行进行检查 并需要检查 TNStart 开始日期 你们能
  • 如何使用vba复制Excel工作表中的动态范围

    我试图使宏中的范围是动态的 而不指定最后一行x Sheets SheetName Range A2 K1000 Copy在 1000 行中 我想将其更改为动态 因为有时我的数量会更少或更多 尝试这个 Sub Test Dim lRow as

随机推荐