在通过早期绑定使用库之前,我可以使用后期绑定来检查库是否存在吗?

2024-04-20

我喜欢在 VBA 项目中使用早期绑定,因为我喜欢在开发过程中自动完成方法名称等。我还喜欢知道如果我拼写错误了方法名称,编译器会警告我。

但是,要使用早期绑定,我需要添加对相关库的引用(例如“Microsoft Scripting Runtime”)。这对于像这样的“标准”库来说很好,但有时我想使用用户计算机上可能存在或不存在的库。

理想情况下,如果该库不存在,我想显示一条有用的消息(例如“该计算机上未安装 xyz,因此无法使用此功能”)。如果我只使用late绑定,那么我可以这样做:

Dim o As Object
Set o = CreateObject("foo", "bar")

If o Is Nothing Then
    MsgBox "nope"
End If

但是,如果我添加了对库的引用以便使用早期绑定,那么如果该库不存在,则在加载 VBA 项目时我会收到编译错误。因此,none代码运行的数量(包括检测库不存在的代码)。

有什么办法可以解决这个第 22 条军规吗?


您可以创建一个类模块作为对象库的代理——包装其他过程所需的所有方法、属性和常量。

所有这些过程都将以相同的方式使用代理类,因此您不需要修改这些过程来在早期绑定和后期绑定之间切换。 Intellisense 会向您显示通过代理类公开的所有内容。

该类将成为早期绑定和晚期绑定之间切换的单点控制。您提到了 Excel 作为一个例子:

#Const DevStatus = "PROD"
#If DevStatus = "DEV" Then
    Private objApp As Excel.Application
    Private objBook As Excel.Workbook
    Private objSheet As Excel.Worksheet
#Else 'assume PROD
    Private objApp As Object
    Private objBook As Object
    Private objSheet As Object
#End If

如果 Excel 可能未安装在任何用户的计算机上,您可以在类初始化期间检查其可用性。

Dim blnExcelAvailable As Boolean

Private Sub Class_Initialize()
    blnExcelAvailable = IsExcelAvailable()
End Sub

Private Function IsExcelAvailable() As Boolean
    Dim blnReturn As Boolean
    Dim objTest As Object

On Error GoTo ErrorHandler

    Set objTest = CreateObject("Excel.Application")
    blnReturn = True

ExitHere:
    On Error GoTo 0
    Set objTest = Nothing
    IsExcelAvailable = blnReturn
    Exit Function

ErrorHandler:
    blnReturn = False
    GoTo ExitHere
End Function

然后,使用代理类的程序可以检查属性以查看 Excel 是否可用。

Public Property Get ExcelAvailable() As Boolean
    ExcelAvailable = blnExcelAvailable
End Property

我认为这种方法是可行的,并且它满足您的要求AFAICT。不过,我不确定这是否合理。回到 Excel 的示例,您可以对其对象模型的可管理子集执行类似的操作。但如果您需要它的全部或大部分方法、属性和常量,代理类将是一项艰巨的任务。

我个人不会使用这种方法。对于我来说,像 mwolfe02 和 JP 一样管理早期/后期绑定的工作量更少。描述。然而,我的印象是,这对你的情况来说是更沉重的负担,所以也许你愿意在这样的事情上投入比我更多的努力。

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

在通过早期绑定使用库之前,我可以使用后期绑定来检查库是否存在吗? 的相关文章

  • 在 Word 2010 中复制形状而不使用 .Select?

    是否可以在 Word 2010 中复制形状而无需借助 Select 根据开发中心 http msdn microsoft com en us library office ff835500 aspx the Anchor属性返回形状的锚定范
  • 按日期计算 Outlook 中的电子邮件

    我有以下代码来计算 Outlook 文件夹中的电子邮件数量 Sub HowManyEmails Dim objOutlook As Object objnSpace As Object objFolder As Object Dim Ema
  • Excel VBA 最终用户选择图表对象

    我想生成一些代码 允许最终用户从工作表中选择多个图表之一 之后我将根据该选择进行一系列操作 我正在寻找类似于 Application Inputbox Type 8 的东西 它允许对象选择而不是范围选择 我对不起眼的老VBA要求太多了吗 首
  • 有没有办法设置一个变量一次并在多个地方使用它而不给它模块级别的范围?

    我有一个循环将用户窗体控件添加到集合中 由于多个地方都需要该集合 因此我将其放入模块中并在需要时调用它 这意味着该集合仅在需要时才位于内存中 但这也意味着我每次想要使用它时都会运行一个循环 I could已给出集合模块级别范围并在第一次需要
  • Outlook Application_NewMailEx 在启动时不工作

    我正在使用一个Application NewMailEx处理收到的所有电子邮件 它适用于 Outlook 打开时收到的电子邮件 然而在启动时 Application NewMailEx不会因收到的电子邮件而被呼叫 我尝试使用Applicat
  • MS Access VBA:通过 Outlook 发送电子邮件 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 如何使用 MS Access VBA 通过帐户发送电子邮件 我知道这个问题很模糊 但是很难在网上找到在某种程度上还没有过时的相关信息 编辑
  • 报告文字颠倒?

    由于特定原因 我需要能够在报告的下半部分颠倒 倒置 显示一些值 这份报告的目的是打印并从中间折叠起来 所以我希望它遵循这种特定的格式 我找不到任何可以轻松做到这一点的东西 我考虑过但不知道如何实施的一些想法 导入 颠倒字体并将控件的字体设置
  • 列表框:添加组合框作为项目?

    是否可以将列表框的每个项目都作为组合框 我需要这个 因为我将列表框设置为可检查 然后我需要让用户从列表中每个元素的不同选项中进行选择 Thanks 如果您不打算分发您的应用程序 那么您还可以查看 TreeView 控件 请参阅此示例 COD
  • 具有多个条件(全部等于相同值)的 IF 语句的替代方案

    还有比这更好的方法吗 假设所有变量都为零 If var1 0 Or var2 0 Or var3 0 Or var4 0 Or var5 0 Or var6 0 Then do something End If 你可以用Select Cas
  • Excel VBA - 如何逐行读取csv文件而不是整个文件

    这是我需要读取的 csv 文件内容 header header header header header header value value value value value value value value value 我在网上找到
  • VBA 访问:从另一个表单的代码刷新一个表单

    编辑 没关系有人帮助了我 form name recalc 或 form name refresh form main recalc 我有两种形式 主要 详细信息 在 主 表单中 我有一个在对话框中打开 详细信息 的按钮 问题是我在 详细信
  • 标准 VBA 函数“找不到项目或库”

    因此 我必须在我的 PC 上运行别人的 Excel 应用程序 并且在标准函数 如日期 格式 十六进制 中间等 上收到 找不到项目或库 的信息 一些研究表明 如果我在这些函数前加上 VBA 前缀 如 VBA Date 中那样 它会正常工作 网
  • 我需要代码在两行之间复制并粘贴到另一张表中,并给出任何值?

    例如 我有 50 行数据 第一行有学生的名字 我需要代码将数据从 RAM 复制到 RAMESH 在这之间我有 20 行 我需要代码来复制行并将其粘贴到另一张纸中 它不应该问我名字 默认情况下 它必须采用 RAM 和 RAMESH 名称 好的
  • 将表行从 Word 文档复制到现有文档表特定单元格

    我正在寻找一个宏 它将内容从一个 Word 文档中的表格复制到另一个现有 Word 文档中的表格到特定单元格中 从第 5 行开始 复制后面的所有行并将其粘贴到现有文档中的第 5 行 这可能吗 在此输入图像描述 https i stack i
  • 查找并替换目录中所有 Excel 文件工作簿中的字符串

    我正在编写 VBA 代码来替换位于特定目录中的多个 Excel 文件 工作簿 中的特定字符串 我尝试在 Stack Overflow 上搜索 找到答案 但这与通过 Excel 中的宏替换文本文件中的字符串有关 相同的链接是查找并替换文件中的
  • 如何使用 VBA 将 mm/dd/yyyy 更改为 dd/mm/yyyy

    我在使用 VBA 将 mm dd yyyy 转换为 dd mm yyyy 日期格式时遇到问题 我有一个这样的表 仅供参考 该表是从报告工具自动生成的 字符串操作 或任何 Excel 函数可以提供帮助吗 希望知道如何解决这个问题的人可以给我一
  • 在 VBA 中循环合并单元格

    是否可以循环遍历合并的单元格vba questions tagged vba 我的范围内有 6 个合并单元格B4 B40 我只需要这 6 个单元格中的值 6 次迭代 上面的答案看起来已经让你排序了 如果您不知道合并的单元格在哪里 那么您可以
  • VBA XML V6.0 如何让它等待页面加载?

    我一直在努力寻找答案 但似乎找不到任何有用的东西 基本上 我是从一个网站上拉取的 当您在该页面上时 该网站会加载更多项目 我希望我的代码在加载完成后提取最终数据 但不知道如何让 XML httprequest 等待 Edited Sub p
  • 证明 Excel VBA Scripting.Dictionary 不保留项目插入顺序

    我正在尝试决定是否为我的项目使用 Excel VBA 集合或字典 出于多种原因 我倾向于字典 但在使用字典时我会继续阅读它For Each循环检索字典项目或从字典 Items 数组读取项目时 检索顺序可能不是添加项目的顺序 这对于我的应用程
  • Outlook 无法识别一个或多个姓名

    我有以下 vba 代码 它读取邮箱并向任何发送无效代码作为邮箱回复的用户发送回复 但有时会收到运行时错误 Outlook 无法识别一个或多个名称 我的问题是 创建新的 MAPI 配置文件是否可以解决该问题 或者我是否需要添加一个代码来解析地

随机推荐

  • Android 位图调整大小

    调整位图大小的最佳方法是什么 Using options inSampleSize 2 Bitmap bitmap BitmapFactory decodeResource getResources R drawable mandy moo
  • .NET Remoting,为什么列表不能远程处理?

    我在用着RemotingServices Marshal and Activator GetObject在同一台计算机上的两个简单程序之间建立远程通道 public class IpcInterface MarshalByRefObject
  • Spring属性解密

    我们混合了一些尚未迁移到 spring boot 或 spring cloud 的遗留 Spring 应用程序以及 Spring Boot 应用程序 我正在创建一个 Spring 组件 如果属性值已加密且具有前缀 则该组件将在加载环境时自动
  • 如何通过继承向 Pyspark Dataframe 类添加自定义方法

    我正在尝试继承 DataFrame 类并添加其他自定义方法 如下所示 以便我可以流畅地链接并确保所有方法引用相同的数据帧 我收到异常 因为列不可迭代 from pyspark sql dataframe import DataFrame c
  • Crystal Report SP26 SetDataSource() 方法在 Visual Studio 2019 中的客户端计算机中失败

    我正在使用 Visual Studio 2019 和 Crystal Report Service Pack 26 我的代码将数据读取到 ADO NET 数据集中 并将这些数据设置为我的报告的数据源 Visual Basic Net 中类似
  • 如何使用@Configuration排除spring配置文件对其他项目的依赖

    我有一个项目 A In Maven 它依赖于项目 B In Maven 现在项目 B 得到了一些 spring Configuration db 配置 文件 这些文件在我构建和部署项目 A 时启动 但由于我的项目 A 中没有一些配置属性 它
  • AngularJS 如何防止重复的http请求?

    过去的一天我一直在为一些奇怪的情况而苦苦挣扎 发生的情况是 对于远程服务器上的 API 的 http 请求 偶尔会发送重复的请求 任何人都可以提供有关如何避免这些重复请求的帮助吗 这是我在工厂中使用的函数的示例 factory getAll
  • Rails 方式编写复杂查询

    我有这样的疑问 SELECT f id Concat f name REPLACE f parent names AS FullName u name AS Unit u id AS UnitId u position AS UnitPos
  • 如何防止从 char 数组到 bool 的隐式转换

    struct Foo void setBar bool bar bar bar bool bar int main Foo f f setBar true 由于类型转换 上面的代码编译成功 即使传递了一个 char 数组 其中bool是期待
  • 简化 if (x) Some(y) else None?

    这种常见模式感觉有点冗长 if condition Some result else None 我正在考虑使用一个函数来简化 def on A cond Boolean f gt A if cond Some f else None 这将顶
  • 后台工作者中止

    我最近尝试使用后台工作程序而不是 经典 线程 我意识到至少对我来说 它造成的问题多于解决方案 我有一个后台工作人员运行同步读取 在本例中是从串行端口 并在 1 行代码中被阻塞大约 30 秒 然后取消挂起不是解决方案 我看到 如果应用程序此时
  • 使 CSS 过渡效果适用于所有浏览器

    我目前有以下 CSS 它适用于 Google Chrome Webkit 但不适用于任何其他浏览器 使其与一切兼容的最佳方法是什么 正如你所看到的 它使用的是 webkit 但我不确定 moz 的等价物是什么 非常感谢 card margi
  • Submit() 函数有回调吗?

    我有这段代码 以及一个提交到框架的文件上传表单 setMyCookie name value 1 myform submit setMyCookie name value 2 问题 Webkit 浏览器似乎在提交表单之前或在提交表单的同时用
  • 如何使用 python selenium 单击 angularjs 链接?

    我有以下 html 其中包含使用相同类和元素的多个链接 并且我想单击具有 ng switch when next 和 python selenium 的链接 a class ng scope href a a class ng scope
  • 为什么接口变量默认是static和final?

    为什么Java中接口变量默认是static和final 来自 Philip Shaw 的 Java 界面设计常见问题解答 接口变量是静态的 因为 Java 接口不能以其自身的方式实例化 变量的值必须在不存在实例的静态上下文中分配 Final
  • matplotlib 文本标题未出现

    我无法理解为什么我的文字标题没有出现在我的绘图上 我发现文档对于图例和标题标签的放置顺序非常令人困惑 我的代码在这里 我不知道哪里出了问题 一切都按照我的预期出现 标题 轴标签 日期格式 除了标题文本根本不存在 fig plt figure
  • 避免 C 错误处理中的重复

    我经常编写最终成为长序列的代码 例如 int error error do something if error return error error do something else with some args if error re
  • 如何在最新的 VLC 版本上通过命令行设置音量?

    我一直在尝试在 Ubuntu 上通过终端设置 VLC 2 2 1 中的音量 但没有成功 参数 volume不存在了 Warning option volume no longer exists 并且我在帮助中找不到任何包含 卷 的内容 文档
  • Tensorflow 中的张量乘法

    我正在尝试在 NumPy Tensorflow 中进行张量乘法 我有 3 个张量 A M X h B h X N X s C s X T 我相信A X B X C应该产生一个张量D M X N X T 这是代码 同时使用 numpy 和 t
  • 在通过早期绑定使用库之前,我可以使用后期绑定来检查库是否存在吗?

    我喜欢在 VBA 项目中使用早期绑定 因为我喜欢在开发过程中自动完成方法名称等 我还喜欢知道如果我拼写错误了方法名称 编译器会警告我 但是 要使用早期绑定 我需要添加对相关库的引用 例如 Microsoft Scripting Runtim