Tag: 事件

macros如何根据特定范围内的不同单元格的值自动启动

我试图根据input到单元格中的值自动启动一个macros。 我能够做到这一个单元格,但我怎么能应用它的范围,例如从L1到L600? 以下是适用于1个单元的代码: Sub Worksheet_Change(ByVal Target As Range) Dim CAD As String CAD = "Canadians (CDN)" If Intersect(Target, Range("L14")) Is Nothing Then Exit Sub Application.EnableEvents = False 'to prevent endless loop If Range("L14").Value = CAD Then Range("M14") = 1 End If Application.EnableEvents = True End Sub 基本上,我必须检查下一个单元格L15,如果条件满足,则inputM15中的值,等等….

在Excel Workbook.BeforePrint事件中检测打印机

在Excel中处理Workbook.BeforePrint事件时,有什么方法可以确定打印机的目标? 我知道事件处理程序签名允许取消该事件,如此处所述 ,但是我想取消所有打印事件,除非打印机是PDF打印机。 我发现,如果用户select“另存为”或“导出”来创buildPDF,它使用PDF打印机驱动程序来执行保存或导出并触发事件处理程序,但不会更新打印机设置为应用程序的活动打印机时,这样做。 有没有不同的方式来检测目标打印机?

双击形状上的事件

在我的研究中,我发现没有内置的function来启用Excel表单上的形状的双击事件。 我所看到的许多解决方法都是编写类或其他类似的东西来添加这个function,所有这些看起来都超出了我的VBA知识库。 因此,我写了上面的代码(目前只是作为一个testing)来尝试编写我自己的形状双击function。 Public Clicked As Boolean, LastClickObj As String, LastClickTime As Date Sub GenerateShapes() Dim sheet1 As Worksheet, shape As shape Set sheet1 = ThisWorkbook.Worksheets("Sheet1") Set shape = sheet1.Shapes.AddShape(msoShapeDiamond, 50, 50, 5, 5) shape.OnAction = "ShapeDoubleClick" Set shape = sheet1.Shapes.AddShape(msoShapeRectangle, 50, 60, 5, 5) shape.OnAction = "ShapeDoubleClick" LastClickTime = Now End Sub Sub ShapeDoubleClick() […]

VBA:WithEvents谜题

我有一个用户窗体, xForm ,是在一个类模块(假设TestClass )实例化为: 'TestClass Dim Form as New xForm Private WithEvents EvForm as MSForms.UserForm Set EvForm = Form 在xForm本身的类模块中,我有一些必须在Form Closing上执行的代码,只有当窗体实际closures时: 'xForm class module Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer) 'Do some cleanup, otherwise the app would hang 'If not closing, don't cleanup anything, otherwise the app would hang End Sub QueryClose事件也在TestClass中处理,并可以避免窗体closures: 'TestClass […]

VBA – 事件内部事件(BeforeClose – > BeforeSave)不起作用

为了防止在奇怪的环境中意外地覆盖文件,我已经劫持了保存在excel文件中。 Workbook_BeforeSave和Workbook_BeforeClose事件可以独立工作。 不幸的是,当前代码的结构方式,我需要从BeforeClose事件中调用BeforeSave事件。 在最基本的forms,下面的代码将不会按我的意愿。 在以下示例中,如果从BeforeClose事件中调用保存,wksHiddenWorksheet.Visible = True将不会使wksHiddenWorksheet可见。 Option Explicit Private Sub Workbook_BeforeClose(Cancel As Boolean) ThisWorkbook.Save End Sub Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) wksHiddenWorksheet.Visible = True End Sub 有没有办法解决? 以我尝试的方式从另一个事件中调用一个事件是不是很差(或根本不正确)? 更新: 我已经在工作簿中使用了Application.EnableEvents,但是我已经确定它总是在error handling中恢复为True。 我已经打开了一个全新的工作簿,并input了下面的代码 Option Explicit Private Sub Workbook_BeforeClose(Cancel As Boolean) Debug.Print Application.EnableEvents 'Prints TRUE ThisWorkbook.Save End Sub Private Sub Workbook_BeforeSave(ByVal SaveAsUI […]

删除图纸/图表事件VBA

我试图触发一个macros(Excel)被删除时的macros。 自2010年以来,有不同的删除事件: 应用程序级别:Application.SheetBeforeDelete事件。 工作簿级别:Workbook.SheetBeforeDelete事件。 工作表级别:Worksheet.BeforeDelete事件。 作为一个初学者,我不能申请最后两个,但是我尝试申请第一个。 Private Sub Workbook_SheetBeforeDelete(ByVal Sh As Object) Call Macro End Sub 这可以在工作表上正常工作,但对图表(仅包含图表的工作表)无效。 我的目标是调整我的计数器,并可能重命名工作表,因为我的工作表被命名为Sheetname(1),..(2)..并且用户经常删除工作表。 我搜查了很多,但我找不到任何可以遵循的例子。 任何帮助将非常感激。

如何在Workbook B上的Workbook A上调用Workbook_Open?

我的情况是,我试图从工作簿B打开工作簿A并运行Workbook_Open子例程。 仅仅使用Workbooks.Open("c:\myworkbook.xls")是我需要在Workbook_Open子例程运行之前在Workbook_Open簿A中设置数据。 我有两个想法,我并不特别喜欢,所以我想知道是否有更好的方法。 我的两个想法如下。 选项1:在禁用macros的情况下打开工作簿A,放置数据,保存并closures工作簿,然后使用启用的macros重新打开工作簿。 我宁愿不这样做的原因是:我正在处理一个具有相当数量的格式的.xls文件(基本上我正在模拟一个人将如何使用它几千次),并保存文件数千次可能导致文件损坏。 另外,这需要花费相当多的时间来打开工作簿两次,对我来说这似乎并不高效。 其中一个重点是速度和效率,最快的周转时间。 选项2:将Workbook_Open代码复制为模块中其他位置的公共子程序。 这是两个更可取的问题,但问题是我不一定有权执行此操作,这样做会涉及大量繁文,节,红旗等。 有没有办法做这样的事情: Workbooks("Workbook A").Application.Run (Workbooks("Workbook A").Workbook_Open)

VBAsearch所有表单以获得双击的单元格值

有一天,我学会了如何使用VBA双击sheet1中的一个单元格,然后它将跳转到表单2中的单元格。 我现在有一个类似的报告,除了这次我需要双击Sheet1中的一个单元格,然后在同一个工作簿中search每个工作表的值。 我有第一个场景的代码在这里:在ThisWorkbook: Private Sub Workbook_SheetBeforeDoubleClick _ (ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean) If Len(Target.Value) = 0 Then Exit Sub 'If the double-clicked cell isn't in column A, we exit. If Target.Column <> 1 Then Exit Sub 'Calls the procedure FindName in Module1 and passes the cell content Module1.FindName Target.Value […]

如何捕获列表中的新行添加?

我想在Excel 10工作表中执行一个VBA事件处理程序,只要用户在该工作表上添加一个新行到一个列表( Worksheet.ListObjects ()返回实例的列表types),例如通过在最后input数据列表的行(这通过向列表添加新行来扩展列表)。 我怎么做? 除此之外,我想为新行的特定单元格设置默认值。 我目前的想法是处理Worksheet_Change ,并检查Target参数是否在我感兴趣的ListObject的.Range范围内。 但是,如何查看用户是否正在使用他/她的单元格更改创build新行,并将其与列表中现有单元格的编辑区分开来? 我可能只是在这里有点愚蠢。 我预计会有一个列表事件,我可以陷阱,但我找不到任何。

Excel vba – 禁用鼠标事件

我正在开发Excel 2010工作簿,处于手动公式计算模式。 文件 – >选项 – >公式 – >工作簿计算 – >手动 但是,我想要一些菜单选项来重新计算工作簿。 所以我使用下面的代码: Private Sub Worksheet_Change(ByVal Target As Range) On Error Resume Next Application.EnableEvents = False If SOME_CONDITION Application.Calculate ActiveSheet.AutoFilter.ApplyFilter End If Application.EnableEvents = True End Sub 问题是,如果我正在滚动鼠标中键,或者在执行该函数时单击一个单元格,计算会在完成之前突然终止,这是不可接受的。 看起来Application.EnableEvents=False行不会阻止鼠标事件被触发,而且我也无法find任何可以防止这个bug的方法。 因此,我需要的是在计算过程中阻止所有事件的方法,或者以某种方式防止触发的事件中断计算(就像工作簿公式计算不是手动时那样)。 非常感谢您的帮助! 谢谢。 马坦。