Tag: vba

自动化错误与条件编译

当试图加载Excel工作簿时,我发现奇怪的行为。 我有一个用COM Interop编写的Excel-AddIn。 它主要用于创build我自己的Ribbon-Tab,从菜单中加载工作簿并执行一些项目pipe理。 当我尝试使用两种方法打开工作簿时,会得到不同的结果: 首先,当我从加载中加载工作簿(Excel 2003版本)时,一切正常。 从function区的Button-Event中调用openWorkbook项的公共函数openWorkbook ,该函数使用application.workbooks.open(…)加载Excel工作簿。 这样,工作簿将打开而不会出现错误。 其次,当我尝试使用如下代码从VBA中调用Addin-Function: Set addIn = Application.COMAddIns("WMExcelAddin1") Set automationObject = addIn.Object automationObject.openWorkbook (filename) 我收到一条错误消息: 编译错误 自动化错误 并且IDE在其中一个工作簿模块中首次出现有条件编译时停止,如下所示: #const ebind = 0 […] sub proc1() #if ebind = 1 then ' IDE Stops here […] #else […] #end if end sub 我试图使用布尔数据types而不是数字具有相同的效果。 我在我的智慧结束。

由于内存碎片,Excel 2013崩溃

自从将用户从Excel 2007升级到32位Excel 2013以来,我们的公司面临着一系列的性能和稳定性问题。 我们必须禁用某些用户的硬件加速,在控制面板\易用的访问中心中更改设置,甚至升级英特尔graphics驱动程序以提高稳定性,所有这些都具有不同程度的成功。 但是我们无法解决的一个问题是: Excel 2013的32位版本似乎使用自己的内存pipe理器从32位内存映射到Windows 7使用的64位内存。 问题是,当这个内存变得太碎片时 ,Excel 2013将完全崩溃。 有时,在用了一个小时之后,我们发现Excel 2013试图search一块XX'Mb的内存块,如果找不到这样大小的连续内存块,就会崩溃。 作为一家金融公司,我们在这些Excel文件中有很多遗留的VBA代码,而转移到64位Excel 2013会带来更多的问题。 那么有没有人有任何想法如何解决与Excel 2013的内存问题..? 更新 一些读者(可以理解)问我们为什么不安装64位版本的Excel 2013,特别是当我们运行64位Windows 7时。 引用微软的原因是兼容性 。 Office 2013的64位版本 “对于大多数用户,我们推荐使用32位版本的Office,因为它与大多数其他应用程序(尤其是第三方插件)更兼容,这就是32位版本的Office 2013默认安装的原因,即使在64位位Windows操作系统“。 我们的用户不需要钟声,口哨声或时髦的animation。 他们想要一些稳定的东西,甚至是10年前写的Excel文件和VBA。 有些代码甚至使用了FORTRAN .dll计算引擎,DAO库等。 而从IT支持的angular度来看,我们只是想要一个仍然受Microsoft支持的Excel版本。 这就是为什么我们现在正在使用32位Excel 2013。 问题是,对于32位Excel 2013,这是一个令人讨厌的问题,大多数财务公司仍然大量提供旧式Excel / Access应用程序…我们可以做些什么来使这个环境更加稳定?

如何在VBA中使用以编程方式创build的工作表函数

在使用编程创build的函数之前是否需要“注册”或“重新编译”function? 当我添加一个函数到工作表,我不能使用它,直到控制返回到工作表。 例如:如果我的代码将一个函数添加到工作表,然后尝试使用它我得到以下错误:运行时错误438 – 对象不支持此属性或方法当我看工作表的代码的function是那里,如果我运行的代码只使用创build的function,没有错误。 在创build它们之后,我怎样才能使用这些function,而不是先停下来? 下面是代码中的一个例子 – 当我运行TestingWorkSheetFunctions时出现错误,但在创build函数后运行TestWorkSheetFunction时出现错误。 示例假定至less有两张工作表(工作表1和工作表2) Option Explicit Public Sub TestingWorksheetFunction() AddWorkSheetFunction TestWorkSheetFunction End Sub Public Sub AddWorkSheetFunction() 'Sheet1's Function Dim strFunctionCode As String strFunctionCode = _ "Public Function HelloWorld() as string" & vbCrLf & _ vbCrLf & _ vbTab & "HelloWorld = ""Hello World from Sheet 1""" & vbCrLf & […]

用户自定义function改变单元格的颜色

我看到很多用户试图用用户定义的函数来改变单元格的颜色。 我总是觉得这是不可能的。 我的理解是,除了包含公式的单元格的值之外,用户定义的函数不能更改单元格的任何属性。 Subs是什么改变了细胞本身。 然而,当玩弄一些代码来testing这个,我发现情况并非总是如此。 使用简单的代码: Function ColorCell(rng As Range) If rng.Value = 1 Then ColorCell = False Else ColorCell = True rng.Interior.ColorIndex = 3 End If End Function 如果我把这个functioninput到一个单元格中,我可以达到预期的效果,没有单元格会改变颜色 但是,如果我使用公式>插入functionbutton并导航到我的公式以这种方式插入它,它会着色目标单元格。 这是怎么可能的,为什么函数以不同的方式input时会有不同的performance呢? 编辑:这是使用Excel 2007testing

DLL函数不能在VBA环境中工作,但在Excel VBA中工作

我有以下function,包含在我写的(c + +),我在Excel中debugging的DLL,工作得很好: float _stdcall ReturnT(LPCSTR FileName) { // Extracts the generic language string from the (importing BSTR // would import kanji or whatever) and converts it into a wstring wstring str = CA2T(FileName); // Sets the string to find as _t or _T followed by 2 or 3 digits and a subsequent _ or […]

如何在Excel中打开特定版本的Word 2007/2010

我安装了Word 2007和2010。 我需要从Excel中打开Word,但是我需要指定在VBA中需要打开哪个版本。 我已经尝试了晚期绑定 Dim wordApp2007 As Object Dim wordApp2010 As Object Set wordApp2007 = CreateObject("Word.Application.12") wordApp2007.Visible = True Set wordApp2010 = CreateObject("Word.Application.14") wordApp2010.Visible = True 但是都打开Word 2010 我也尝试使用早期绑定 Dim wordApp As Word.Application Set wordApp2007 = New Word.Application wordApp2007.Visible = True 并设置对Word 12.0对象模型的引用,但这仍然会打开Word 2010 如果我注册每个版本的Word使用 "C:\Program Files\Microsoft Office\Office12\WINWORD.EXE" /regserver "C:\Program Files\Microsoft Office\Office14\WINWORD.EXE" /regserver 那么注册的版本打开,但是我不能打开未注册的。 任何人都可以帮助并告诉我如何使用VBA在Excel中打开特定版本的Word? […]

Excel 2007 VBA – 使用Sheets.Add在工作簿的末尾创build图表

我试图实现一个私人子程序,以添加工作表到活动工作簿(工作表正在使用,以便可以select添加xlForms,xlWorksheet等)。 但是我有一个奇怪的问题,相对于工作簿中的其他工作表创build新的图表。 我开始删除相同名称(如果存在)的工作表,然后使用下面的代码: ActiveWorkbook.Sheets.Add(After:=Sheets(Sheets.count()), _ Type:=sheet_type).Name = sheet_name 其中sheet_type是枚举XlSheetType的可选参数, sheet_name是一个string 。 对于每一个可用的参数,如xlWorksheet , xlDialogSheet ,甚至是xlWorksheet ,它都可以xl4MacroSheet – 但是由于某些原因,在结束之前会创buildxlChart 1的位置,而不是使其成为工作簿中的最后一个工作表。 因此,样本I / O(从3张开始): > Create_Sheet "Test", sheet_type:=xlWorksheet Sheet 1 | Sheet 2 | Sheet 3 | Test > Create_Sheet "Test", sheet_type:=xlDialogSheet Sheet 1 | Sheet 2 | Sheet 3 | Test > Create_Sheet "Test", sheet_type:=xlChart Sheet […]

Excel VBA“自动化错误”由于2016年1月Office Update,可能由MSCOMCTL.OCX(Microsoft Windows公共控件6.o(Service Pack 6))引起的

解 我已经使用Microsoft Windows公共控件6.0(Service Pack 6),即MSCOMCTL.OCX居住在C:\Windows\SysWOW64\ 在2016-01-15(或其附件)上从Microsoft推出的KB2881029(Microsoft Office 2010 32位版本的安全更新)(MS16-004)安装了MSCOMCTL.OCX (v6.1.98.46)的新版本在2015-12-09“创build”,但在更新时“已访问”(即安装在计算机上)。 这使得工作簿“失去”对MSCOMCTL.OCX引用(引用标记为“丢失”,因为引用仍然打勾,但不再起作用;工作簿因“编译错误:对象库function不受支持”而不编译“自动化错误”)。 看来,更新通过添加一个SubKey 2.0修改以下registry项,但保留为空,并且不注册新的MSCOMCTL.OCX : HKEY_CLASSES_ROOT\TypeLib\{831FDD16-0C5C-11D2-A9FC-000F8754DA1}\ 解决这个问题需要三个步骤: MSCOMCTL.OCX需要注销并从提升的命令提示符处重新注册,如下所示: C:\ Windows \ system32> Regsvr32 / u C:\\ Windows \ SysWOW64 \ MSCOMCTL.OCX C:\ Windows \ system32> Regsvr32 C:\\ Windows \ SysWOW64 \ MSCOMCTL.OCX 当通过REGSVR32注册新的MSCOMCTL.OCX (版本6.1.98.46)时,一个新的密钥被添加到registry中: KEY_CLASSES_ROOT \types库\ {831FDD16-0C5C-11D2-A9FC-000F8754DA1} \ 2.2 如果有一个已经存在的名为2.1的子密钥,它将input一个引用,2.2现在是使用的密钥。 但是它不会对空的2.0子密钥做任何事情! 如果有一个2.0(或2.1)SubKey没有任何东西,使用该OCX的任何对象将无法创build,因为它会使用2.0(resp 2.1)版本,它不能也不检查2.2版。 通过删除错误或被取代的键2.0和2.1来清理registry,只留下最新的工作键2.2。 这可以通过selectHKEY_CLASSES_ROOT,编辑/查找/ MSCOMCTRL.OCX从registry编辑器完成。 […]

在VBA Excel中的对象数组或集合

我想在Excel中有一个对象数组,调用一个事件处理程序。 具体来说,我有多个button,执行相同的function不同的单元格,并保持复制代码我想通过索引(像我以前在VB 6.0中做的那样)简单地引用这些button对象….通过find哪个button被点击我想填充特定的单元格等,所以问题是:在Excel VBAbutton数组? 我在VB.net中做了一些工作,在那里我使用了集合,而且工作得很好……但是在VBA中看来我做不到这一点。

从Excel VBA UDF中调用时,Range.Precedents返回范围而不是其先例。 有没有解决方法?

我有这个VBAfunction: Public Function testPrec(target As Range) As String testPrec = target.Precedents.Address(External:=False) End Function 在单元格C11中,我有这个公式: =C6+C8 如果我从即时窗口调用testPrec ,它工作得很好: ?testPrec([c11]) $C$6,$C$8 编辑:它也工作正常,如果从非UDFmacros子调用。 这个exception是UDF的情况。 如果我从工作表中调用它作为UDF: =testPrec(C11) 我刚回来“$ C $ 11”。 有谁知道发生了什么事情,甚至更好的如何从UDF调用中获得实际的先例? (我正在使用Excel 2007)