VBA - CallByName 不接受变体参数

2024-04-02

解决方案:只需在 CallByName 语句中的 Value 两边加上括号即可强制对其求值。

Ex. CallByName MobClass, TargetData, vbLet, (Value)

感谢来自另一篇文章的 Rory,我可能会删除该文章,因为它不再相关并且可能重复。

我花了很长时间试图找出我使用 CallByName 的方式出了什么问题。我终于意识到,如果输入与其调用的输入参数或硬编码的输入参数的类型不完全相同,则其第四个参数(Args)将引发类型不匹配。

(我什至不明白它是如何或为什么这样做的,因为VarType(Variant/Integer) = VarType(Integer))

所以我要么需要一种方法让它接受变量输入或转换变量Variant/Integer to Integer(或创建一个新变量)没有巨大的选择案例。

编辑:所以我的问题不清楚,所以我会更详细地解释它。我有一堆课程,我想循环浏览并调用它们Let属性上。我的简化设置是:

Dim AllClasses as Collection 
Sub SetAll(TargetProperty as String, Value as Variant)

    For each ClassX in AllClasses

        CallByName ClassX, TargetProperty, vbLet, Value

    Next ClassX

End Sub 

问题是Value当它被初始化为Variant。我唯一能让它不抛出类型不匹配异常的时间是在初始化时Value作为属性想要的完全相同的类型,但我不能这样做,因为类中的数据类型不同。

编辑2:我要问关于整个问题的另一个问题,因为似乎没有人知道太多CallByName

编辑 3:以下是我们迄今为止所掌握的内容的摘要:

  • CallByName的第四个参数 (Args) 在尝试调用时抛出类型不匹配Let类上的属性。

  • 仅当尝试分配的值存储在Variant数据类型。如果变量被初始化为与变量相同的类型,它就可以完美地工作。Let如果值被硬编码到参数中,则属性需要 OR。

  • The Let属性本身运行良好。它接受Variant数据类型就好了。

  • 我的问题是:有没有办法阻止这个异常?我正在创造另一个帖子 https://stackoverflow.com/questions/49287139/vba-assign-a-value-to-multiple-classes-at-once-property-let关于我的整体问题的其他可能的解决方案。


问题是您通过引用而不是通过值传递属性参数,但是您无法传递对不同数据类型(变体 -> long)的引用,因为类型不匹配并且无法转换为这样也会改变调用者的数据类型。通过使用括号,您强制参数按值传递 https://learn.microsoft.com/en-us/dotnet/visual-basic/programming-guide/language-features/procedures/how-to-force-an-argument-to-be-passed-by-value它可以被转换为类型Long.

您可以通过使用来避免这种情况ByValin theProperty Letter代替ByRef(如果未设置则隐式使用)。您知道通过引用变量,属性中所做的更改也会更改调用者的值吗?

Example:

类通过示例

'Save as class module PassExample
Public Property Let PropByVal(ByVal NewVal As Long)
NewVal = 1
End Property
Public Property Let PropByRef(ByRef NewVal As Long)
NewVal = 1
End Property 

带测试子模块:

'save as standard module
Sub test()
Dim v As Variant
v = 0

Dim ExampleInstance As New PassExample

CallByName ExampleInstance, "PropByVal", VbLet, v 'this works
CallByName ExampleInstance, "PropByRef", VbLet, v 'type mismatch
CallByName ExampleInstance, "PropByRef", VbLet, (v) 'this works as ByRef is changed to byval
Debug.Print v ' shows 0, not 1 as it should be if referenced

CallByName ExampleInstance, "PropByRef", VbLet, CVar(v) ' works too as it passes a function-result that can't be referenced

End Sub

感谢 Rory 和 chris neilsen 提供了解决方案!

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

VBA - CallByName 不接受变体参数 的相关文章

  • 我可以用文本框设置变量名称吗? excel

    我可以使用 TextBox Vba Excel 设置变量的名称吗 我必须以在文本框中写入组名称并单击命令按钮的方式输入新的产品组 代码必须从文本框中获取字符串 并将该字符串设置为新创建的数组的名称 我只想在运行时创建一个新变量 或数组 据信
  • 使用 pythoncom 在 Python 进程之间编组 COM 对象

    我希望有人可以帮助我从 Python 进行编组跨进程调用到 Excel 我有一个通过 Python 启动的 Excel 会话 我知道当需要从单独的 Python 进程访问它时 该会话将会启动并运行 我已经使用编组让一切按预期工作CoMars
  • 如何四舍五入到一半,始终为正方向? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 如何实现以下舍入 0 0126083
  • Outlook 无法识别一个或多个姓名

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

    在研究 Emacs Lisp 的符号单元时 我发现像这样的示例函数 defun a rest x x 我可以打电话 symbol function a 返回 lambda rest x x 如果我愿意的话我可以使用它 gt lambda r
  • 如何使用VBA根据条件删除Excel中的行?

    我目前正在构建一个宏来格式化数据表并删除不适用的数据行 具体来说 我希望删除列 L ABC 的行以及删除列 AA DEF 的行 到目前为止 我已经实现了第一个目标 但还没有实现第二个目标 现有代码是 Dim LastRow As Integ
  • VBA 字符串 255 个字符限制

    我在使用 VBA 时遇到问题 并注意到它的字符串限制为 255 个字符 我实际上正在尝试通过 POST 发送 JSON 并暂停执行 我注意到该字符串始终只有 255 个字符 有没有办法调整字符串的大小或其他什么 我在这个问题上浪费了大约 6
  • JavaScript 测验在提出所有问题之前结束

    我现在正在学习 JavaScript 并且正在创建一个测验 我的测验运行正常 控制台中没有任何错误 但它会跳过问题 有时会在回答所有问题之前结束测验 即使给出正确答案 也会减少时间 我不太确定为什么它会这样做 因为在我看来它的编码是正确的
  • 如何获取 Python 中所有内置函数的列表?

    我正在尝试整理一个关于如何获取 Python 中所有内置函数的列表的规范示例 该文档很好 但我想用可证明的方法来演示它 在这里 我本质上将内置函数定义为默认命名空间的成员 这些成员可用且与旨在在模块中使用的函数的风格特征一致 即 它们提供一
  • 在二维范围内查找匹配的公式

    我需要一个公式来查找二维范围内的值并返回匹配单元格的坐标或单元格地址 例如 R A B C 1 John Matt Pete 2 Sara Bret Chad 3 Lila Maya Cami 我想搜索范围A1 C3 for Chad并返回
  • 如何将Scheme中的函数应用于另一个函数返回的参数列表?

    假设有两个函数 f 和 v 进一步假设 v 返回长度为 n 的列表 并且 f 需要恰好 n 个参数 我正在Scheme中寻找正确的语法 以将f应用于v返回的列表 如果我使用语法 f v v arguments 然后我收到一个关于 f 需要
  • SpreadsheetML 文件扩展名被 IE 和 FF 更改 - 内容类型错误?

    我正在 PHP 中生成 SpreadsheetML 文件 当用户下载文件并保存时 默认情况下文件会另存为 Report xml 并在 Excel 中打开 但是 如果选择在 Excel 中打开文件而不是保存文件 则文件名将更改为 Report
  • Excel工作簿关闭后反复打开

    我使用了 Application ontime 方法来调度一些宏 关闭工作簿后 它会一次又一次地打开 为了解决这个问题 我在工作簿上设置了另一个事件 BeforeClosed 现在它显示运行时错误 1004 Object Applicati
  • Java Microsoft Excel API [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何在 VBA 中声明接受 XlfOper (LPXLOPER) 类型参数的函数?

    我在之前的回答里发现了问题 https stackoverflow com q 19325258 159684一种无需注册即可调用 C xll 中定义的函数的方法 我之前使用 XLW 提供的注册基础结构 并且使用 XlfOper 类型在 V
  • 类方法作为 JavaScript 中的事件处理程序?

    JavaScript 中是否有最佳实践或通用方法将类成员作为事件处理程序 考虑以下简单示例
  • VBA在多个文件夹中搜索特定子文件夹并移动其中的所有文件

    你能帮助我吗 我想要一个宏vba来搜索SPECIFIC例如 所有存在并移动其文件的文件夹和子文件夹之间的子文件夹 Xfolder P Desktop Folder1 subfolder SUBFOLDER1 Xfolder 我正在使用 VB
  • 使用自定义功能区时是否可以阻止 MS Access 自动更改选定的功能区选项卡?

    当使用自定义 UI XML 文件在 Access 中添加多个自定义功能区选项卡时 每当关闭窗体时 选定的功能区选项卡都会变回第一个自定义选项卡 我们从 VBA 以编程方式加载自定义功能区 我已经创建了重现问题的 accdb http sdr
  • 启动时的 Excel 加载项

    我正在使用 Visual C 创建 Microsoft Excel 的加载项 当我第一次创建解决方案时 它包含一个名为 ThisAddIn Startup 的函数 我在这个函数中添加了以下代码 private void ThisAddIn
  • 从 MS Access 调用存储过程会导致错误 3146

    当我使用下面所示的代码从 MS Access 前端调用 SQL Server 存储过程时 它停止运行并抛出运行时错误 3146 这个存储过程在 SQL Server 中工作正常 但是当我从 MS Access 运行时 它首先工作 但突然停止

随机推荐

  • 如何动态更改悬停和按下的 extjs 按钮的背景

    你好 我需要能够动态更改按钮不同状态 正常 悬停 按下 的背景颜色 到目前为止我想到的如下 http jsfiddle net suamikim c3eHh http jsfiddle net suamikim c3eHh Ext onRe
  • 为什么方法参数不适用于赋值?

    在 Ruby 中 与许多语言一样 方法的参数不会自动分配为实例变量 这有效 def initialize a a a end 这不会 def initialize a end 例如 在 CoffeeScript 中 这是有效的 constr
  • 升级到 .net 4 时 MembershipUser / System.Web.ApplicationServices 出现问题

    我有一个大型 vb net Web 项目 我正在尝试将其升级到 net4 VS2010 在编译期间我收到以下错误 程序集 System Web Version 4 0 0 0 Culture neutral PublicKeyToken b
  • 如何在没有gradle或Maven或Eclipse的情况下将jar文件添加到java项目中

    我可以添加一个jar文件到我在桌面上手动创建的 Java 项目without使用 gradle Maven 或任何依赖管理工具或任何 Java IDE 目前该项目是一个包含 5 个 java 文件的文件夹 我从终端运行它 是否可以在此类项目
  • 如何使用 BigQuery DML 转换嵌套在数组、结构体、数组内的结构体的某些字段?

    我认为这是问题的一个更复杂的版本更新 BigQuery 中结构体数组中的值 https stackoverflow com questions 61408952 update values in struct arrays in bigqu
  • MySQL 中 int 转字符串

    可以做这样的事情吗 本质上 我想将一个 int 转换为一个字符串 并在连接上使用该字符串 注意 t1 id select t2 from t1 join t2 on t2 url site com path t1 id more where
  • Mule 方法无法转换为字符串

    我对骡子工作室很陌生 这是环境设置 VM1 Windows 7 Visual Studio 2012 IIS 7 IIS 7 中托管的 net 4 5 WCF Web 服务 具有接受字符串并返回字符串的操作 VM2 Ubuntu 13 4
  • Titanium 用于 Windows 平台上的 iOS 开发

    我已经下载了 Windows 平台的 Titanium 正确安装后 我发现它需要iOS SDK 那么我应该从哪里获取iOS SDK 在Windows平台上可以开发iOS吗 使我的 Hello World 示例在适用于 iOS 的 Windo
  • 错误:R 中的下标类型“列表”无效

    这里有一个问题 我正在使用 eclipse 参数创建一个函数来处理不同的函数参数 我重新创建了类似的情况来显示我不断遇到的问题 gt d lt data frame alpha 1 3 beta 4 6 gamma 7 9 gt d alp
  • where 和having 关于别名的区别

    如果我在中创建一个别名select那么我不能在where子句因为根据sql查询的执行顺序where出现在之前select 但我可以在中创建一个别名select子句并将其用于having虽然条款having出现在之前select 为什么会这样
  • Knockoutjs 当父级可观察到的更改时更新子级

    当使用 KnockoutJs 父可观察更改时 如何触发子元素的更新 在我的应用程序中 我正在构建一个翻译工具 我有一个淘汰赛类 表示某些文本的原始 默认 值 以及翻译后的子项的集合 function ParentObject id defa
  • CSS 动画 - 动画缓慢且抖动

    我想问一下 这段CSS代码有什么问题吗 它用于动画背景图像 缩放效果 media min width 1000px anim on background size 110 110 background position center cen
  • 在 Golang 中访问上传的文件

    我在访问使用 golang 上传的文件时遇到问题 我对这门语言真的很陌生 并且已经进行了多次尝试 在网上也找不到任何答案 我究竟做错了什么 在此代码中 我从未到达列出已上传文件数的块 func handler w http Response
  • 野田时间:Period.Between() 返回错误的天数?

    鉴于下面的代码片段 为什么最后四个输出周期相同 我希望这些行的天数部分为 4 3 2 1 而不是 4 4 4 4 这是一个错误还是我遗漏了一些明显的东西 已经很晚了 我也累了 所以很可能是后者 我使用的是Noda Time 1 2 0 fo
  • 阻止 robots.mouseMove 生成​​ MouseEvent?

    我有一个 3D 游戏 每次移动光标时 我希望它重置到中间 问题是 robots mouseMove 调用 MouseEvent 它确实有意义 并重置位置 所以我无法旋转 谢谢你 我更喜欢如下代码 component removeMouseL
  • 如何重写对象ArrayList的ToString方法?

    class Person public String firstname public String lastname Person p1 new Person Jim Green Person p2 new Person Tony Whi
  • 了解 STG

    GHC 的设计基于 STG 它代表 无脊椎 无标签的 G 机器 现在G machine显然是 图缩减机 的缩写 它定义了惰性是如何实现的 未评估的 thunk 存储为表达式树 执行程序涉及reducing这些都归结为正常形式 Atree是一
  • 将字符串编码为十六进制

    我有将字符串转换为十六进制的函数 function encode str str encodeURIComponent str split join return str toLowerCase example 守护村子 alert enc
  • 在vim中搜索并替换选定的文件路径

    我经常处理内部充满文件路径的文件 我希望能够在可视模式下快速选择我的文件路径并将其替换为其他文件路径 例如我有这样的文件 balvadsd mnt Windows Documents and Settings stuff file exe
  • VBA - CallByName 不接受变体参数

    解决方案 只需在 CallByName 语句中的 Value 两边加上括号即可强制对其求值 Ex CallByName MobClass TargetData vbLet Value 感谢来自另一篇文章的 Rory 我可能会删除该文章 因为