最近,我在C#中编写了一个类库,用于Office应用程序,包括约70人使用的关键Access应用程序.对于具有管理员权限的用户,注册DLL很简单,但让DLL在其他计算机上运行是有问题的.
RegAsm YourDll.dll /tlb /codebase
YourDll.tlb
在VBA中添加引用:工具 - >引用Regasm在这里做了几件事.首先,它创建了一个类型库(YourDLL.tlb),它提供有关DLL中的类的信息.其次,它将有关库的信息存储在注册表中,以便系统"知道"当您要求将类实例化为对象时的含义.
要查看Regasm添加的注册表项,可以使用以下/regfile
参数运行它:
Regasm YourDLL.dll /codebase /regfile
(该/regfile
选项对/tlb
参数无效.)
如果该/codebase
选项告诉Regasm包含有关YourDLL.dll
磁盘位置的信息,这对于创建对象很重要.
如果您YourDLL.reg
在文本编辑器中打开,您将看到Regasm添加到注册表的条目:条目HKEY_Classes_Root
(实际上只是重定向到HKLM\Software\Classes
).不幸的是,您需要管理员权限才能修改HKLM
,因此这对我们的其他用户无效.
还有一些其他线程(例如,注册没有管理员权限的COM,注册COM DLL供VBA使用,注册DLL(ActiveX)用于非管理员用户,无法注册.NET COM DLL,COM Interop没有regasm)讨论问题,但他们的解决方案是复杂的(例如需要注册表重定向)或不完整(假设你已经知道至少一半的答案)或不适用于混合64/32位环境(例如Win64,Office32).
那么如何在没有管理权限的情况下注册在Visual Studio中创建的COM DLL,以便在当前用户的VBA 32和64位环境中使用?
我在ASP.net,c#中开发了一个Web服务,并在IIS上托管,由vba客户端使用.下载了Office 2003 Web Services 2.01工具包后,我遇到了成功创建所需代理类的问题(许多用户在线记录),并决定创建一个.net DLL库.我创建了一个库,它引用了Web服务并将其中一个方法暴露给c#中的公共函数.
我现在有三个问题:
如何在VBA中引用dll类?我试图去工具 - >引用并浏览到dll位置,但是我收到错误"无法添加对指定文件的引用".磁盘上是否有特定位置我必须复制.dll?
我还可以复制dll文件旁边的dll.config文件,以便在那里使用端点URL吗?
由于要调用的方法是接受一个对象(由各种成员和几个List <>成员组成,这些如何在VBA代码中实现?
我要去ASK并回答我认为对MS Access中一些很酷的UI功能感兴趣的人有用的问题. 回答自己的问题
问题: 如何在Microsoft Access中显示非阻塞"吐司"之类的通知?确实有一些动画,不应该阻止主机应用程序!
我已经在VBA中创建了一个字典,使用CreateObject("Scripting.Dictionary")
映射源词来定位要在某些文本中替换的单词(这实际上是用于混淆).
不幸的是,当我按照下面的代码进行实际替换时,它将按照添加到字典中的顺序替换源字.如果我那么例如"蓝色"然后是"蓝莓",则"蓝莓"中的"蓝色"部分被第一个目标替换,"贝瑞"保持不变.
'This is where I replace the values
For Each curKey In dctRepl.keys()
largeTxt = Replace(largeTxt, curKey, dctRepl(curKey))
Next
Run Code Online (Sandbox Code Playgroud)
我想我可以通过首先将字典的键从最长到最短的长度排序然后如上所述进行替换来解决这个问题.问题是我不知道如何按这种方式对键进行排序.
我正在开发一个COM加载项和Excel自动化加载项库,其核心代码是用C#编写的.我想为函数设置一个可选参数,我知道这对于C#和VBA,甚至Excel WorksheetFunction都是合法的.但我发现最终可选参数专门用于COM和Automation加载项,这意味着如果首先运行一个加载项,那么效果很好但另一个加载项的可选参数将不起作用.
下面请看示例:
在VS 2013解决方案中,我有两个项目:一个被调用TestVBA
,另一个被调用TestExcel
.
TestVBA
用于COM加载项并通过"Excel 2013加载项"构建,有两个.cs
文件:
ThisAddIn.cs
此文件自动生成并稍作修改.代码是
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml.Linq;
using Excel = Microsoft.Office.Interop.Excel;
using Office = Microsoft.Office.Core;
using Microsoft.Office.Tools.Excel;
namespace TestVBA
{
public partial class ThisAddIn
{
private void ThisAddIn_Startup(object sender, System.EventArgs e)
{
}
private void ThisAddIn_Shutdown(object sender, System.EventArgs e)
{
}
private ExcelVBA oExcelVBA;
protected override object RequestComAddInAutomationService()
{
if (oExcelVBA == null)
{
oExcelVBA = new ExcelVBA();
}
return oExcelVBA; …
Run Code Online (Sandbox Code Playgroud) vba ×4
.net ×2
excel ×2
access-vba ×1
add-in ×1
c# ×1
com ×1
dictionary ×1
dll ×1
excel-addins ×1
excel-vba ×1
ms-access ×1
nonblocking ×1
regasm ×1
registry ×1
vsto ×1