使用 VSTO 创建 UDF,而不使用 VBA

2023-12-04

与此类似question(但在我的情况下不是 VSTO SE),但是,我只是想确认不可能在 Visual Studio 2005 和 Excel 2003 中使用纯 VSTO 创建 UDF - 所以,为了绝对清楚,我的问题是:

是否可以使用 Visual Studio 2005 和 VSTO 解决方案创建 Excel 2003 UDF,而不使用任何 VBA 或其他技巧?

我知道 ManagedXLL、ExcelDNA、Excel4Net 等,但暂时不想考虑这些。

Thanks


关于是否有办法绕过 COM 或 VBA,我认为这是不可能的(至少没有任何非常肮脏的技巧)。原因是 Office 执行外部代码(即您的加载项)的唯一方法是通过 COM。甚至 VSTO 仍在使用旧的 IDExtensibility2 COM 接口。 IDTEXtensibility2 是 Microsoft Office 应用程序的所有加载项都必须实现的 COM 接口。

在 VSTO 之前,Office 加载项必须自己实现此 IDTExtensibility2 接口。在此类基于 COM 的加载项(或 COM 可见的托管加载项)中,您只需按所述添加 UDFhere.

然而,现在使用 VSTO,有一个额外的抽象层:VSTO 使用所谓的解决方案加载器实现 IDTEXtensibility2,它是 VSTO 运行时提供的 dll。这意味着您的加载项不再是 COM 可见的。因此,如果您将 UDF 添加到 VSTO 外接程序,Office 将看不到它。

Paul Stubbs 在他的博客中解释了如何使用 VSTO 和 VBA:如何在 VSTO 托管代码中创建 Excel UDF

  1. 在 VSTO 中使用您的函数创建一个类

    <System.Runtime.InteropServices.ComVisible(True)>
    Public Class MyManagedFunctions
        Public Function GetNumber() As Integer
            Return 42
        End Function 
    End Class
    
  2. 将您的类连接到 VSTO 中的 VBA

    Private Sub ThisWorkbook_Open() Handles Me.Open
        Me.Application.Run("RegisterCallback", New MyManagedFunctions)
    End Sub
    
  3. 为托管代码创建 Hook 并为 VBA 中的函数创建包装器

    在电子表格或文档的 VBA 模块中

    Dim managedObject As Object
    
    Public Sub RegisterCallback(callback As Object)
        Set managedObject = callback
    End Sub
    
    Public Function GetNumberFromVSTO() As Integer
        GetNumberFromVSTO = managedObject.GetNumber()
    End Function
    

现在您可以输入=GetNumberFromVSTO()在单元格中,当 excel 启动单元格时 值应为 42。

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

使用 VSTO 创建 UDF,而不使用 VBA 的相关文章

  • WinForms:如何确定窗口是否不再活动(没有子窗口具有焦点)?

    我的应用程序使用多个窗口 我想隐藏一个特定窗口 以防应用程序失去焦点 当活动窗口不是应用程序窗口时 source https stackoverflow com questions 466354 how can i tell if a wi
  • 具有子列表属性映射问题的自动映射器

    我有以下型号 Models public class Dish Required public Int64 ID get set Required public string Name get set Required public str
  • OpenCv读/写视频色差

    我试图简单地使用 openCV 打开视频 处理帧并将处理后的帧写入新的视频文件 我的问题是 即使我根本不处理帧 只是打开视频 使用 VideoCapture 读取帧并使用 VideoWriter 将它们写入新文件 输出文件看起来比输入更 绿
  • asp.net 文本框文本模式数字,仅允许数字

    我只是想知道 ASP NET 中是否有一种方法只允许文本框中的数字textmode number 当我使用这个时
  • 迭代变量并查找特定类型实例的技术

    我想迭代进程中内存中的变量 通过插件动态加载 并查找特定类型的实例 以前我可以找到特定类型 或内存中的所有类型 我可以创建类型的实例 我可以获取作为不同类型的字段包含的实例 但我无论如何都不知道只是 搜索 特定类型的实例 一种方法是使用 W
  • 向 ExpandoObject 添加方法时,“关键字 'this' 在静态属性、静态方法或静态字段初始值设定项中无效”

    我尝试向 ExpandoObject 添加一个动态方法 该方法将返回属性 动态添加 给它 但它总是给我错误 我在这里做错了什么吗 using System using System Collections Generic using Sys
  • 暂停下载线程

    我正在用 C 编写一个非常简单的批量下载程序 该程序读取要下载的 URL 的 txt 文件 我已经设置了一个全局线程和委托来更新 GUI 按下 开始 按钮即可创建并启动该线程 我想要做的是有一个 暂停 按钮 使我能够暂停下载 直到点击 恢复
  • C# 中条件编译符号的编译时检查(参见示例)?

    在 C C 中你可以这样做 define IN USE 1 define NOT IN USE 1 define USING system 1 system 1 IN USE 进而 define MY SYSTEM IN USE if US
  • 生产代码中的 LRU 实现

    我有一些 C 代码 需要使用 LRU 技术实现缓存替换 目前我知道两种实现LRU缓存替换的方法 每次访问缓存数据时使用时间戳 最后比较替换时的时间戳 使用缓存项的堆栈 如果最近访问过它们 则将它们移动到顶部 因此最后底部将包含 LRU 候选
  • 如何在c#中的内部类中访问外部类的变量[重复]

    这个问题在这里已经有答案了 我有两个类 我需要声明两个类共有的变量 如果是嵌套类 我需要访问内部类中的外部类变量 请给我一个更好的方法来在 C 中做到这一点 示例代码 Class A int a Class B Need to access
  • 通过 NHibernate 进行查询,无需 N+1 - 包含示例

    我有一个 N 1 问题 我不知道如何解决它 可以在这个问题的底部找到完全可重复的样本 因此 如果您愿意 请创建数据库 设置 NUnit 测试和所有附带的类 并尝试在本地消除 N 1 这是我遇到的真实问题的匿名版本 众所周知 这段代码对于帮助
  • 当“int”处于最大值并使用 postfix ++ 进行测试时,代码定义良好吗?

    示例 未定义行为的一个示例是整数溢出的行为 C11dr 3 4 3 3 int溢出是未定义的行为 但这是否适用于存在循环的以下内容 并且不使用现在超出范围的副作用i 特别是 这是否后缀增量规格帮助 结果的值计算在副作用之前排序 更新操作数的
  • 如何挤出平面 2D 网格并赋予其深度

    我有一组共面 连接的三角形 即二维网格 现在我需要将其在 z 轴上挤出几个单位 网格由一组顶点定义 渲染器通过与三角形数组匹配来理解这些顶点 网格示例 顶点 0 0 0 10 0 0 10 10 0 0 10 0 所以这里我们有一个二维正方
  • 如何一步步遍历目录树?

    我发现了很多关于遍历目录树的示例 但我需要一些不同的东西 我需要一个带有某种方法的类 每次调用都会从目录返回一个文件 并逐渐遍历目录树 请问我该怎么做 我正在使用函数 FindFirstFile FindNextFile 和 FindClo
  • 有没有一种简单的方法可以让 Visual Studio 2015 使用特定的 ToolsVersion?

    使用特定版本构建项目或解决方案时msbuild我可以使用以下命令选择早期的 net 工具链 toolsversion or tv switch C Program Files x86 MSBuild 14 0 bin msbuild tv
  • 当前的 x86 架构是否支持非临时加载(来自“正常”内存)?

    我知道有关此主题的多个问题 但是 我没有看到任何明确的答案或任何基准测量 因此 我创建了一个处理两个整数数组的简单程序 第一个数组a非常大 64 MB 第二个数组b很小 无法放入 L1 缓存 程序迭代a并将其元素添加到相应的元素中b在模块化
  • strcmp 给出分段错误[重复]

    这个问题在这里已经有答案了 这是我的代码给出分段错误 include
  • 运算符“==”不能应用于“int”和“string”类型的操作数

    我正在编写一个程序 我想到了一个数字 然后计算机猜测了它 我一边尝试一边测试它 但我不断收到不应该出现的错误 错误是主题标题 我使用 Int Parse 来转换我的字符串 但我不知道为什么会收到错误 我知道它说 不能与整数一起使用 但我在网
  • Googletest:如何异步运行测试?

    考虑到一个包含数千个测试的大型项目 其中一些测试需要几分钟才能完成 如果按顺序执行 整套测试需要一个多小时才能完成 通过并行执行测试可以减少测试时间 据我所知 没有办法直接从 googletest mock 做到这一点 就像 async选项
  • 是否可以在 C# 中强制接口实现为虚拟?

    我今天遇到了一个问题 试图重写尚未声明为虚拟的接口方法的实现 在这种情况下 我无法更改接口或基本实现 而必须尝试其他方法 但我想知道是否有一种方法可以强制类使用虚拟方法实现接口 Example interface IBuilder

随机推荐

  • 用于仅插入/仅查询应用程序的 ORM 框架

    我已经使用 Hibernate 多年了 从来没有遇到过任何问题 但我刚刚意识到我的大部分工作都涉及 CRUD 方法 其中我需要数据保持持久化并随意修改 这样做的问题是 有人想要制作 2 个独立的应用程序 一个用于批量插入 另一个对插入的数据
  • 格式化斯坦福 Corenlp 的 NER 输出

    我正在与斯坦福 CoreNLP 合作并将其用于 NER 但是当我提取组织名称时 我看到每个单词都标有注释 因此 如果实体是 NEW YORK TIMES 那么它会被记录为三个不同的实体 NEW YORK 和 TIMES 我们是否可以在斯坦福
  • 重用PreparedStatement

    我在我们的代码库上运行了 findbugs 它指出还有两个语句仍然需要关闭 在这部分代码中 我们运行 preparedStatement connection prepareStatement query 对于3个不同的查询 重用prepa
  • 如何使用 Greasemonkey 脚本通过 XSLT 转换 XML 文件?

    我有一个搜索服务器 它提供一个测试页面 我可以在其中输入查询并以 XML 形式返回结果 我希望能够以更加用户友好的方式浏览结果 因此我开始使用 XSLT 现在我有了一个简单的样式表 可以将不知何故臃肿的 XML 转换为仅显示部分数据的简单表
  • 仅获取白色屏幕截图

    我可以读取条形码 但无法获取屏幕快照 getScreenImage 函数获取白屏 如何获取屏幕截图 包括我看到的相机视图的屏幕 谢谢 interface igViewController
  • 处理器如何读取内存?

    我正在尝试重新实现 malloc 我需要了解对齐的目的 据我了解 如果内存对齐 代码将执行得更快 因为处理器不必采取额外的步骤来恢复被剪切的内存位 我想我明白 64 位处理器读取 64 位乘 64 位内存 现在 让我们想象一下我有一个按顺序
  • 使用 BitBlt 进行的屏幕截图会在 Windows 10 上显示黑色图像

    我正在使用下面的代码来捕获当前活动窗口的屏幕截图 这段代码来自捕获屏幕截图 包括 NET 中的半透明窗口 有一些小的添加 即它使用 GetForegroundWindow 和一个计时器 以便我可以选择所需的窗口 在 Windows 10 x
  • 在 Java 8 流中捕获 UncheckedIOException

    编辑 这似乎不可能 请参阅https bugs openjdk java net browse JDK 8039910 我有一个帮助类 它提供了Stream
  • 类型错误:“datetime.date”对象没有属性“__getitem__”

    我在我的 models py 中使用 class Pedido models Model data pedido models DateField Data do pedido cliente models ForeignKey Clien
  • 谷歌地理编码不适用于数据库中带有特殊字符的地址

    我的谷歌地理编码数据库中的地址特殊字符有问题 但如果我对它们进行硬编码则不会 简单的地理编码代码 url http maps googleapis com maps api geocode json address address sens
  • TabControl 处理非活动选项卡上的控件

    我正在为我的应用程序使用 MVVM 模式 主窗口包括一个TabControl与DataContext映射到 ViewModel
  • 如何将 Lua 模块作为字符串而不是文件加载?

    我正在使用 LuaJava 和 Lua 的 C 代码 我想做的是读取在Android应用程序中存储为资源字符串的Lua源代码 以便可以执行读入的Lua源代码 我需要知道如何使用 LuaJava 或 C 语言来做到这一点 我想知道如何使用字符
  • Compact Framework 中的 MAC 地址

    如何仅使用紧凑框架获取 MAC 地址 1 4 的 OpenNETCF 代码从以下 P Invoke 调用中获取信息 DllImport iphlpapi dll SetLastError true public static extern
  • NgAnimate 页面加载 hack

    在更新 1 4 1 中 AngularJs Animate 不再像以前那样在页面加载时触发 我的旧解决方案类似对此 笨蛋 found here并一直工作到 v1 3 9
  • CSS 字体 Unicode 范围

    font face font family Nanum Barun Gothic src url NanumBarunGothic ttf unicode range U AC00 D7A3 U 1100 11FF U 3130 318F
  • 将新的拟合阶段添加到现有 PipelineModel 中,无需再次拟合

    我想将几个经过训练的管道连接到一个 这类似于 Spark 将新的拟合阶段添加到现有 PipelineModel 中 无需再次拟合 但是下面的解决方案适用于 PySpark gt pipe model new PipelineModel st
  • 火花笛卡尔积

    我必须比较坐标才能获得距离 因此 我使用 sc textFile 加载数据并制作笛卡尔积 文本文件中大约有 2 000 000 行 因此需要比较 2 000 000 x 2 000 000 坐标 我用大约 2000 个坐标测试了代码 几秒钟
  • fetchone() 正在将 int 变量设置为元组

    我有一个使用 Python 2 7 和 SQLite3 的项目 我正在尝试将整数变量存储在 SQLite3 数据库列中 然后能够将变量设置为 SQLite 列的值 连接正常 列存在 并且类型为 int 我正在使用此代码来提取数据 Trail
  • 有没有办法从以前的 apk 发布文件中获取私有签名的密钥库文件?

    我已经使用 eclipse 创建了私有签名的密钥库文件 并且我已经在 android market 网站上发布了 apk 文件 几天后 我们从用户那里收到了一些问题 我们已经解决了这些问题 但我没有私人签名的密钥库文件 在制作 apk 文件
  • 使用 VSTO 创建 UDF,而不使用 VBA

    与此类似question 但在我的情况下不是 VSTO SE 但是 我只是想确认不可能在 Visual Studio 2005 和 Excel 2003 中使用纯 VSTO 创建 UDF 所以 为了绝对清楚 我的问题是 是否可以使用 Vis