Tag: vba

从Excel中调用访问vba函数会返回不同的值

我的最终目标是生成一个预测string宽度的工具,以便在MS Access 2010中打印报表时避免文本溢出。像CanGrow这样的选项没有用处,因为我的报表不能有不可预知的分页符。 我不能切断文本。 为此,我在Access中发现了未WizHook.TwipsFromFont函数。 它返回给定字体和其他特征的string的缇宽度。 事实certificate,这是一个非常有用的起点。 基于各种用户生成的指南,我在Access中开发了以下内容: Public Function TwipsFromFont(ByVal sCaption As String, ByVal sFontName As String, _ ByVal lSize As Long, Optional ByVal lWeight As Long = 400, _ Optional bItalic As Boolean = False, _ Optional bUnderline As Boolean = False, _ Optional lCch As Long = 0, _ Optional lMaxWidthCch As […]

EntireRow.Delete似乎删除不正确的行

我有以下代码: Sub test() Dim ws1 As Worksheet Dim ws2 As Worksheet Dim r As Long Dim rng As Range Set ws1 = Worksheets("Sheet1") Set ws2 = Worksheets("Sheet2") 'Set some dummy data For r = 1 To 20 ws1.Cells(r, "A").Value = r + 100 ws2.Cells(r, "A").Value = r + 200 Next 'Set a reference to Sheet1!A11 […]

在PowerPoint 2010中默默编辑embedded的Excel数据

我试图在PowerPoint 2010中默默编辑embedded的Excel数据。不幸的是,当您使用: gChartData.Activate 它通过演示文稿打开Excel文档。 有没有办法激活ChartData而不打开Excel? 完整代码: Private Sub CommandButton1_Click() Dim myChart As Chart Dim gChartData As ChartData Dim gWorkBook As Excel.Workbook Dim gWorkSheet As Excel.Worksheet Set myChart = ActivePresentation.Slides(1).Shapes(1).Chart Set gChartData = myChart.ChartData gChartData.Activate Set gWorkBook = gChartData.Workbook Set gWorkSheet = gWorkBook.Worksheets(1) gWorkSheet.Range("B2").Value = 1 Set gWorkSheet = Nothing Set gWorkBook = Nothing Set gChartData […]

如何确定计算是否完成,或者检测到计算中断?

我有一个相当大的工作簿,需要很长时间来计算。 过去计算一直是一个相当大的挑战,因为如果你仔细观察,Excel是如此热切地放弃计算。 为了帮助缓解这个问题,我创build了一些VBA代码来启动计算,这个计算是由一个表单启动的,其结果是它不是很容易中断计算过程,但仍然是可能的。 (我可以通过点击窗体上的closuresX轻松地做到这一点,但我想有其他的方法) 而不是采取更多的步骤来尝试和更难以中断计算,我希望代码检测计算是否完成,所以它可以通知用户,而不是盲目地锻造到我的代码中的其余步骤。 到目前为止,我找不到任何方法来做到这一点。 我已经看到Application.CalculationState的引用,但是在中断计算之后,值是xlDone,即使在几秒钟后中断计算(通常需要大约一个小时)。 我不能想办法通过检查单元格的值来做到这一点,因为我不知道最后一个是计算的。 我发现有一种方法可以将单元格标记为“脏”,但是我一直无法find一种方法来检查单元格的脏污。 而且我不知道这是否是正确的path,因为我可能必须检查每个表格中的每个单元格。 中断计算的行为不会引起错误,所以我的ON错误不会被触发。 有什么我失踪? 有任何想法吗? 有任何想法吗?

Excel-DNA:一维数组限于65536行

当试图在VBA中调用以下Excel-DNA-Method时,我只能得到一个大小为1的数组(在65536行之后数组似乎被调整为实际数组大小 – 65537)。 当调用表中的方法作为数组函数时,整个事情的作品。 [ExcelFunction(Description = "Example", Name = "Example", HelpTopic = "")] public static object[] example() { object[] ret = new object[65537]; return ret; } 我正在使用Excel 2007,该工作表是一个xlsm工作表,使用这样的二维数组时,一切工作正常。 [ExcelFunction(Description = "Example", Name = "Example", HelpTopic = "")] public static object[,] example() { object[,] ret = new object[65537,1]; return ret; } 但是使用二维数组的方式是相同的,以防万一发生 [ExcelFunction(Description = "Example", Name […]

为什么Excel VBA在Outlookclosures时运行速度更快?

所以我一直注意到,当Outlookclosures时,我写的VBA代码运行速度明显加快。 这不是一个零星的事情:我可以用Outlook运行相同的代码10倍,每次打开一个体验速度显着较慢的处理速度,然后closuresOutlook并运行10次,每次都体验到更快的速度。 我也注意到,除了在代码运行的时候Excel“不响应”,零星的Outlook也是如此。 我知道Outlook是由Word支持的,所以如果我在Word中运行代码,这对我来说是有意义的。 但是,我的Excel VBA没有使用Outlook或Word。 这可能是什么原因? Excel和Outlook共享一些相同的过程? 我试过谷歌search无济于事。

VBA'set typelib = createobject(“scriptlet.typelib”)'Permission Denied

我的代码有问题,似乎已经过夜了。 这有一些特点,所以我会尽量给予尽可能多的细节。 有问题的文件是一个Excel工作簿,它从传入的数据生成一个XML文件。该文件打开,通过macros填充和保存,这部分运行良好。 在此例程中为.xml创buildGUID时,会出现问题: Function GenGUID() As String Dim strGUID As String Dim TypeLib As Object Set TypeLib = CreateObject("Scriptlet.TypeLib") strGUID = TypeLib.guid 'dump the curly brackets strGUID = Replace(strGUID, "{", "") strGUID = Replace(strGUID, "}", "") strGUID = Left(strGUID, Len(strGUID) – 2) GenGUID = strGUID End Function 具体而言,该行: Set TypeLib = CreateObject("Scriptlet.TypeLib") 这会引发“运行时错误70:权限被拒绝”。 现在,特点。 […]

从VBA中调用计算密集的例程而不拖延Excel GUI

我有一套数字密集的例程(每个需要1分钟才能完成)捆绑在一个COM对象中,干净地实现IDispatch 。 因此,我可以从Excel工作表中使用它们,这些例程将由button触发的VBAmacros调用。 现在,当调用这些例程之一时,Excel用户界面被冻结,这对于表单的最终用户来说是相当不舒服的。 我想find任何机制来缓解这个问题。 这可能是例如启动在COM端启动的另一个线程中的计算,立即返回,生成的线程在计算结果时callbackVBA过程。 或者更简单一些,因为我只需要一次执行一个计算。 现在,从其他线程调用VBA例程可能会有很多问题。 我必须承认,我不是那种经验丰富的COM,我只看待我的代码和Excel(我使用ATL)之间的黑盒子。 所以, 是否有可能从另一个线程callbackVBA例程? 有没有更好的方法来做我想做的事情? UPDATE 在权衡了选项并在互联网上阅读了很多东西之后,我会做一些合作的multithreading:在COM对象中,我没有一个例程,而是有三个: class CMyObject : … { … STDMETHOD(ComputationLaunch)(…); // Spawn a thread and return immediately STDMETHOD(ComputationQuery)(DOUBLE* progress, BOOL* finished); STDMETHOD(ComputationResult)(VARIANT* out); private: bool finished, progress; boost::mutex finished_lock, progress_lock; ResultObject result; // This will be marshaled to out // when calling ComputationResult }; […]

Excel的VBA自动化在退出后在内存中保留一个进程

我已经看到了很多这个问题的build议,我已经尝试了所有的,但似乎没有工作。 VBA代码位于非Microsoft产品(SAP Business Objects,这可能是问题)。 我创build一个Excel对象: Set oExcel = CreateObject("Excel.Application") 从其中一个工作表的第1列加载特定工作簿中的内容,然后closuresExcel。 每一次,它都会在内存中留下一个进程,占用5+ MB的内存。 我试着让oExcel对象可见,所以至less我可以在不使用任务pipe理器的情况下杀死它,但是当我调用Quit时,UI将退出,并且仍然离开该进程。 每次运行代码,都会创build一个新的进程。 所以我试图通过调用重用任何现有的Excel进程 Set m_oExcel = GetObject(, "Excel.Application") 只有创build它,如果这个调用什么都不返回, 这并没有激化这个过程,但是每一个过程每次增长5+ MB,所以基本上是一样的问题。 在每种情况下,closures我打开的工作簿并在退出之前将DisplayAlerts设置为False: m_oBook.Close SaveChanges:=False m_oExcel.DisplayAlerts = False m_oExcel.Quit 这段代码已经被使用了至less五年,但是这个问题在我们转移到Windows 7之前并没有出现。 这是完整的代码,以防万一。 注意,所有Excel对象都是模块级variables(“m_”前缀),每个build议都使用了“one-dot”规则。 我也尝试使用通用对象(即后期绑定),但是这也不能解决问题: Private Function GetVariablesFromXLS(ByVal sFile As String) As Boolean On Error GoTo SubError If Dir(sFile) = "" Then MsgBox "File '" […]

如何检测单元格格式的变化?

我想在Excel工作表中embedded一个过程,当单元格的格式发生变化时,例如从文本到数字。 但我不知道如何获得单元格的格式types。 我尝试使用Worksheet_Change事件处理程序来检查数据types,如下所示: Private Sub worksheet_change(ByVal Target As Range) If Target.Address = "a1" Then If VarType(Target) <> 5 Then MsgBox "cell format has been changed" End If End If End Sub 但是有了这个代码,如果我将单元格A1的数据types从数字更改为文本,则不会触发Worksheet_Change ; 如果我更改单元格的内容,则仅调用事件处理程序。 另外,这个程序可以检测内容是否从一个数字改变为一个字母串,例如从“35.12”到“abcd”,而不是数字型号码到文本型号码; 如果将单元格B1设置为文本,则input“40”,然后将单元格B1的内容粘贴到单元格A1中, vartype()仍然返回“5”,因此不会触发警报。 无论内容types是否更改,如何检测格式是否已更改?