在VBA中循环指定工作表

2024-01-12

我正在尝试使用我在这里找到的一些代码对于每个函数,循环遍历特定命名的工作表 https://stackoverflow.com/questions/21761697/for-each-function-to-loop-through-specifically-named-worksheets要循环浏览工作簿中的指定工作表,请运行少量代码并移至下一个工作表。

Sub LoopThroughSheets()
Dim Assets As Worksheet
Dim Asset As Worksheet


Assets = Array("pipe_mat_tables", "pipe_diam_tables", "pipe_length_tables")
For Each Asset In Assets
'my code here
   MsgBox ActiveSheet.Name 'test loop

Next Asset

End Sub

这不是循环遍历床单。我试过Dim Assets as Worksheet但这打破了密码。

非常感谢任何帮助,

Cheers


您在问题中显示的代码失败的原因是:

Assets = Array("pipe_mat_tables", "pipe_diam_tables", "pipe_length_tables")

Assets是一个工作表,它是一种对象类型,您必须使用Set给对象赋值时:

Set Assets = Array("pipe_mat_tables", "pipe_diam_tables", "pipe_length_tables")

这会失败,因为Array("…")不是工作表。

您暗示您的代码的早期版本将运行但不会循环遍历工作表。原因是:

MsgBox ActiveSheet.Name

这将显示活动工作表的名称,但此循环中不会更改活动工作表。

我对你的解决方案并不满意,尽管它没有任何明显的错误。我见过太多的程序失败,因为程序员在一条语句中做了太多事情。首先,语句越复杂,一开始就需要花费越长的时间来理解,并且在后续维护过程中理解的时间也就越长。有时,最初的程序员的说法略有错误;有时维护程序员在尝试更新时会出错。在每种情况下,程序员花费的额外时间并不能证明运行时间上的任何节省都是合理的。

Alex K 通过重新定义修复了您的代码Assets and Asset作为变体,按照 VBA 的要求,并添加Sheets(Asset).Select更改哪个工作表处于活动状态。我不能同意这一点,因为Select是一个缓慢的陈述。特别是,如果您不包括Application.ScreenUpdating = False,当屏幕从每个Select.

在解释我的解决方案之前,先介绍一下变体的一些背景知识。

如果我写:

Dim I as Long

I始终是一个长整数。

在运行时,编译器/解释器不必考虑什么I就是当它遇到:

 I = I + 5

但假设我写:

Dim V as Variant

V = 5
V = V + 5
V = "Test"
V = V & " 1"

这是完全有效(有效但不合理)的代码,因为 Variant 可以包含数字、字符串或工作表。但是每次我的代码访问 V 时,解释器都必须检查 V 当前内容的类型并决定它是否适合当前情况。这很耗时。

我不想阻止您在适当的时候使用变体,因为它们非常有用,但您需要了解它们的开销。

接下来我想提倡使用有意义的、系统的名称。我根据我使用多年的系统命名变量。我可以查看我的任何程序/宏并知道变量是什么。当我需要更新 12 或 15 个月前编写的程序/宏时,这确实可以节省时间。

我不喜欢:

Dim Assets As Variant
Assets = Array("pipe_mat_tables", "pipe_diam_tables", "pipe_length_tables")

因为“pipe_mat_tables”等不是资产;它们是工作表的名称。我会写:

Dim WshtNames As Variant
WshtNames = Array("pipe_mat_tables", "pipe_diam_tables", "pipe_length_tables")

我的第一个提议是:

Option Explicit
Sub Test1()

  Dim WshtNames As Variant
  Dim WshtNameCrnt As Variant

  WshtNames = Array("pipe_mat_tables", "pipe_diam_tables", "pipe_length_tables")

  For Each WshtNameCrnt In WshtNames
    With Worksheets(WshtNameCrnt)
      Debug.Print "Cell B1 of worksheet " & .Name & " contains " & .Range("B1").Value
    End With
  Next WshtNameCrnt

End Sub

我本可以命名WshtNameCrnt as WshtName但我被告知,名称应该至少相差三个字符,以避免使用错误而不引起注意。

The Array函数返回一个包含数组的变体。控制变量aFor Each语句必须是对象或变体。这就是为什么我定义了WshtNames and WshtNameCrnt作为变体。请注意,您的解决方案之所以有效,是因为工作表是一个对象。

我用过With Worksheets(WshtNameCrnt)这意味着匹配之前的任何代码End With可以通过在开头加上句点来访问此工作表的某个组成部分。所以.Name and .Range("B1").Value参考Worksheets(WshtNameCrnt)无需选择工作表。这比任何替代方案都更快、更清晰。

I have used Debug.Print rather than MsgBox because it is less bother. My code runs without my having to press Return for every worksheet and I have a tidy list in the Immediate Window which I can examine at my leisure. I often have many Debug.Print statements within my code during development which why I have output a sentence rather than just a worksheet name or cell value.

我的第二个提议是:

Sub Test2()

  Dim InxW As Long
  Dim WshtNames As Variant

  WshtNames = Array("pipe_mat_tables", "pipe_diam_tables", "pipe_length_tables")

  For InxW = LBound(WshtNames) To UBound(WshtNames)
     With Worksheets(WshtNames(InxW))
      Debug.Print "Cell B1 of worksheet " & .Name & " contains " & .Range("B1").Value
    End With
  Next InxW

End Sub

该宏与第一个宏具有相同的效果。我有时会发现For比方便For Each尽管在这种情况下我看不出任何优势。请注意我已经写了LBound(WshtNames)即使 WshtNames 的下限始终为零。这只是我的(过度?过度?)精确。

希望这可以帮助。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在VBA中循环指定工作表 的相关文章

  • Excel宏-将逗号分隔的条目拆分为新行[重复]

    这个问题在这里已经有答案了 我目前在一张纸上有这些数据 Col A Col B Col C 1 A angry birds gaming 2 B nirvana rock band 我想要做的是将第三列中的逗号分隔条目拆分并插入新行 如下所
  • 删除 Excel 表格中的所有数据行(第一行除外)

    就在最近 我一直在尝试删除表中的所有数据行 除了第一个数据行 需要清除 一些正在执行的表可能已经没有行 所以我运行它时遇到问题 因为使用 DataBodyRange Rows Count在没有行 只有页眉和 或页脚 的表上会导致错误 我到处
  • Excel 的查找和查找下一个 VBA

    我一直在试图弄清楚如何处理这个问题 但基本上我想要一种方法来打印 B 列中的值 给定与 A 列匹配的特定值 例如 Column A Column B 1 ABC 2 DEF 3 GHI 1 JKL 我想在使用 find findnext 或
  • 如何使用 pandas.to_excel() 创建 Excel **表格**?

    Need the achieve this programmatically from a dataframe https learn microsoft com en us power bi service admin troublesh
  • 在 Excel 中的文件夹内的所有文件上添加一列

    我在一个文件夹内有 250 个不同的 excel 文件 具有相同的布局 其中包含列A to F 我需要在列上添加新列G 传统的方法是打开每个文件并在以下位置添加新列G 有没有使用 Excel 宏或任何其他工具的简单过程来完成此任务 这个链接
  • 求除某些列之外的 SUM

    以下是我所拥有的 A B C D E F G H I J K 1 2 3 4 5 6 7 8 9 10 50 为了找到SUM
  • 我可以使用 VBA 将密码“传递”到 Excel 中的外部数据库连接吗?

    我正在尝试使用 VBA 隐藏我在 Excel 工作表中设置的数据连接的密码 由于 Excel 以纯文本形式存储外部数据源的密码 因此我想让 VBA 调用表的刷新并提供密码 我录制了刷新表格并输入密码的宏 但令我沮丧的是 它似乎省略了密码部分
  • 尝试使用变量作为自动过滤器中的条件,并带有“不等于”<>,但无法使其工作

    我正在使用 Excel VBA 使用 不等于 表达式来过滤列表 如果我使用Criteria1 lt gt Bob 代码运行完美 但如果我将 Bob 更改为变量 代码将无法运行 这有效 ActiveSheet ListObjects Rpt
  • 每 30 秒运行一次 Laravel 方法

    我有一个在我调用应用程序上的特定 URL 时运行的方法 它处理数据库队列中的行 该间隔被设置为 Cron 可能的最小间隔 即 1分钟 这需要减少到 30 秒 所以我想知道如何最好地实现这一目标 我想我可以在我的脚本中构建一个循环 运行代码两
  • CURL 相当于使用 VBA 的 POST JSON 数据

    我知道这与之前提出的一些问题类似 但有些东西仍然对我不起作用 如何执行以下命令 curl X POST data statements json H Content Type application json user username p
  • xlwt 可以在单元格中创建一个包含标题和链接变量的超链接吗?

    例如 如何更改以下行 使 test 为变量 T 且 http google com http google com 是变量L ws write 0 0 xlwt Formula test HYPERLINK http google com
  • C语言中没有循环可以打印数组吗?

    例如 在Python中 如果我们将一个列表作为数组 它会直接用一行代码打印整个数组 有什么办法可以用C语言实现同样的事情吗 简短回答 No 对表格上几乎所有问题的简短回答 用 C 语言做 X 工作能像用 Python 一样简单吗 No 长答
  • Excel VBA:排序,然后复制和粘贴

    所有 我需要编写一个执行以下操作的宏 将数据输入到 E 列的最后一个空白单元格后 按 E 列对整个工作表进行降序排序 工作表排序后 2a 将单元格复制到紧邻首次输入数据的单元格左侧的相邻单元格 2b 将复制的数据粘贴到最初输入数据的同一行的
  • 无法使用 Excel JavaScript API 设置 NumberFormat

    我正在使用 Excel Javascript API 在搜索文档后 仍然找不到我想要实现的解决方案 因此 我想将所有内容设置为数字格式 文本 这样 Excel 的自动格式设置就不会与任何单元格的内容混淆 不会删除前导零或更改日期格式 文档建
  • 在 Django(Python) 中向用户提供 Excel(xlsx) 文件下载

    我正在尝试使用 Django 创建和提供 Excel 文件 我有一个 jar 文件 它获取参数并根据参数生成 excel 文件 并且它可以正常工作 但是 当我尝试获取生成的文件并将其提供给用户下载时 文件损坏了 它的大小为 0kb 这是我用
  • 获取给定日期的周数

    例子 DD MM YYYY 1 1 2009 should give 1 31 1 2009 should give 5 1 2 2009 should also give 5 Format 1 2 2009 ww 回报6 那么 怎样才能得
  • 这个 if 语句中怎么有太多参数

    My IF下面的声明不断错误射击 指出参数太多 为什么是这样 谁能看出下面的语句有什么错误吗 IF G7 EUR H7 1 15 L7 IF G7 USD H7 1 35 L7 IF G7 AUD H7 1 35 L7 IF G7 CAD
  • 使用 OpenXML 读取列中的 Excel 工作表数据

    有没有一种方法可以使用 OpenXML SDK 和 C 按列而不是按行读取 Excel 工作表 我已经尝试使用 EPPlus 包 但遇到了一些问题 因为我的应用程序还使用 EPPlus 不支持的 xslm 文件 因此 我需要 OpenXML
  • Excel 中使用通配符 {*} 进行 Vlookup

    我有下表 现在 我想检查主题是否具有数据中存在的任何文本 col F I used VLOOKUP A2 F F 1 0 但它正在给予 N A Try 公式为B2 SUM COUNTIF A2 F 2 F 3 gt 0 Edit SUM C
  • 根据其他列中的条件对列中的唯一值求和

    A B 1 Total 1 900 2 Product A 700 3 Product A 700 4 Product B 300

随机推荐

  • Rails3 rspec 问题

    我正在尝试rails3 我在用铁路教程 http railstutorial org 探索有关 Rails3 的更多信息的网站 该教程非常适合入门 我对rails2 的经验很少 我的 rspec 存在问题 目前阻碍了我的进度 我看到教程推荐
  • 获取 chrome 下载文件夹

    Windows 7 中的默认下载文件夹是c 用户 用户名 下载对于 Chrome 但可以通过设置将默认下载文件夹设置为其他文件夹 我需要找出哪个文件夹是下载文件夹 所以如果我将下载文件夹设置为c dd 那么我需要找出具体的文件夹 有没有办法
  • 如何在 chrome 中检查系统时间格式 - 在 JavaScript 中是 12 小时还是 24 小时?

    date toLocaleTimeString不适用于 Chrome 并且始终以 12 小时格式返回时间 我需要根据系统的时间格式显示时间 简短的回答是No您无法在浏览器中获取默认时间格式 因为它依赖于系统和浏览器设置 而 JavaScri
  • 如何将 CoreML 模型转换为 TensorFlow 模型?

    我了解到可以将 TensorFlow 模型 pb 文件转换为 CoreML mlmodel 以在 iOS 平台上运行 但我有一些想要在张量流上运行的 mlmodel 文件 所以我想知道是否有任何方法可以将它们转换为 pb 文件或任何其他方式
  • LINQ to Entities 用于减去 2 个日期

    我正在尝试使用 LINQ 和实体框架确定两个日期之间的天数 它告诉我它无法识别 System TimeSpan 类上的 Subtract 这是 LINQ 查询的 where 部分 where DateTime Now Subtract vi
  • 比 windows.h 的 Beep() 更快的替代方案

    我正在做一个个人项目 我想用旧的业余无线电无线电传输一些数据 我的第一份申请草案是这样的 我用 4 个 信号 构造一个字节 5000hz表示 00 6khz 表示 01 7khz的意思是 10 8khz的意思是 11 9khz 意思和上一个
  • 如何禁用 NetBeans 8.1 中烦人的警告/提示

    我正在 NetBeans 中使用 Java 和 Jersey 我的所有端点都标有以下提示 将方法转换为异步 这个提示确实污染了我通常寻找代码更改 错误的右侧排水沟 首选项 gt 编辑器 gt 提示中没有任何内容似乎会影响此提示 Cheers
  • Git 与 --squash 合并,同时保留每次提交的日志

    初始场景 A master B C D development 合并后我想要什么 squash A E master development B C D 在树枝上master git log将会 commit E Squashed comm
  • php:编写 .ics (iCal) 文件?日期格式?

    我不是一个 php 专家 在格式化 ics 文件的日期时遇到了麻烦 所以我有一个循环为每个生成一个日历条目 post 在我的例子中 post 是一个事件 foreach posts as post setup postdata post i
  • 从 Windows 的 git bash 激活 pyenv

    我在 Windows 7 64 位 上使用 gitbash 我尝试使用 python 3 4 的内置 venv 模块创建一个 venv 方法是调用python m venv venv 并且创建成功 但是生成的 venv 不包含 bash a
  • AVPlayerLayer 不显示 AVPlayer 视频?

    让 AVPlayer 视频内容显示在自己的视图中的技巧是什么 我们正在使用以下 AVPlayer 代码 但屏幕上没有出现任何内容 我们知道视频在那里 因为我们能够使用 MPMoviePlayerController 来显示它 这是我们正在使
  • 如何通过C#代码在文本框中向下滚动

    我正在使用 winforms 并且偶尔更新一个文本框 显示消息 但是 当文本到达框的末尾时 它会产生滚动条 我不知道如何向下滚动到底部 我唯一看到的是 ScrollToCaret 但插入符位于文本的开头 滚动的命令是什么 您可以通过使用名为
  • 将 ASP.NET 4 Web 应用程序部署到 IIS6 服务器后,工作进程回收导致其大部分时间停止工作

    这是一个非常奇怪的情况 所以希望我能很好地解释它 我正在将 ASP NET 4 Webforms 应用程序部署到运行 IIS6 的 Windows Server 2003 SP2 服务器 问题是 当应用程序池回收其工作进程 w3wp exe
  • python中二维数组操作的高效并行化

    我正在尝试使用二维数组上的并行操作joblibpython 中的库 这是我的代码 from joblib import Parallel delayed import multiprocessing import numpy as np T
  • 初始化静态库中嵌入的qt资源

    我有下一种情况 我需要在独立静态库中创建小部件 然后将其与最终应用程序 Visual C 9 0 qt 4 5 链接 这个静态小部件库包含一些资源 图标 并由多个 cpp 文件组成 每个文件都包含独立的小部件 据我所知 如果我在静态库中使用
  • 如何使用 Fabric.js 设置对比度和饱和度

    我想在图像编辑器中设置对比度 饱和度和色调 为此 我使用fabric js 但它只有亮度选项 这是我的 Fabric JS 代码 function fabric Object prototype transparentCorners fal
  • 如何有效地将用户添加到 GitLab 中的所有项目(以编程方式或其他方式)

    我有一个包含许多项目的 GitLab CE 服务器 我想向所有项目添加用户 如果可能的话 我希望避免通过 UI 项目 gt 设置 gt 成员 gt 将用户添加到项目 来执行此操作 因为这将花费大量时间 实现此目的的一种方法是将所有项目移至一
  • XML 数据与命名空间的绑定

    我想使用 XML 文档的数据绑定来填充一个简单的表单 该表单显示有关人员列表的详细信息 我已经把一切都设置好了 现在就这样工作
  • 在设置和部署中预编译网站

    每次我使用安装和部署创建一个新的 Web 安装程序并运行它 在编辑属性中的所有好东西之后 输出始终是网站项目的副本 如何输出 WebSite 项目的预编译版本 我所做的是 发布网站 这样我就得到了预编译版本 将这个新的预编译网站作为现有网站
  • 在VBA中循环指定工作表

    我正在尝试使用我在这里找到的一些代码对于每个函数 循环遍历特定命名的工作表 https stackoverflow com questions 21761697 for each function to loop through speci