如果单元格为“0”,则运行Excel宏;A500“;显示/显示在屏幕上
我希望在单元格“A500”后立即运行Excel宏 当向下/向上滚动工作表时,屏幕上显示 我记得在什么地方读到过关于active-x或标准控件的文章 它有一个“在滚动到视图中”事件,所以可以这样做 将控件直接放置在工作表上所需单元格附近。 我现在找不到这个控件 一个更好的方法当然是一个单元公式,子类化仍然是很重要的 从长远来看,我想这是个坏主意:)如果单元格为“0”,则运行Excel宏;A500“;显示/显示在屏幕上,excel,vba,Excel,Vba,我希望在单元格“A500”后立即运行Excel宏 当向下/向上滚动工作表时,屏幕上显示 我记得在什么地方读到过关于active-x或标准控件的文章 它有一个“在滚动到视图中”事件,所以可以这样做 将控件直接放置在工作表上所需单元格附近。 我现在找不到这个控件 一个更好的方法当然是一个单元公式,子类化仍然是很重要的 从长远来看,我想这是个坏主意:) 如上所述,在Onupdate事件的帮助下,(捕捉鼠标滚轮,而不是单击滚动条)(将Sheetname和Range更改为您的) 在名为ClsMonitor
如上所述,在Onupdate事件的帮助下,(捕捉鼠标滚轮,而不是单击滚动条)(将Sheetname和Range更改为您的) 在名为ClsMonitorOnupdate的类中:
Option Explicit
Private WithEvents objCommandBars As Office.CommandBars
Private rMonitor As Range
Private scrol As Boolean
Public Property Set Range(ByRef r As Range): Set rMonitor = r: End Property
Public Property Get Range() As Range: Set Range = rMonitor: End Property
Private Sub Class_Initialize()
Set objCommandBars = Application.CommandBars
End Sub
Private Sub Class_Terminate()
Set objCommandBars = Nothing
End Sub
Private Sub objCommandBars_OnUpdate()
Dim myrng As Range
If ActiveWorkbook.Name <> ThisWorkbook.Name Then Exit Sub
If ActiveSheet.Name <> rMonitor.Parent.Name Then Exit Sub
If TypeName(Selection) <> "Range" Then Exit Sub
If Intersect(Selection, rMonitor) Is Nothing Then Exit Sub
Set myrng = Application.Intersect(ActiveWindow.VisibleRange, ActiveSheet.Range("a500"))
If Not myrng Is Nothing And Not scrol Then scrol = True: MsgBox "chapter"
If myrng Is Nothing And scrol Then scrol = False
End Sub
请在您的问题中包含您正在处理的解决此问题的代码,并解释您在使用该代码时遇到的问题。问题还包括宏应多久运行一次。如果你上下滚动,如果A500再次可见会发生什么。当您滚动A500并保持可见时会发生什么?每次单元格“A500”被滚动到Excel视口时,事件都会触发一次。如果单元格“A500”被滚出或已可见,并且用户再次滚动,则不会触发事件。请检查属性我的用法“Window.VisibleRange”还需要挂起滚轮,我认为这是子类化的,从长远来看很可能不够稳定。看起来不错,我将通过添加一个计时器/监听器“Application.OnTime Now+TimeSerial(0,0,0)”事件以及“ActiveWindow.VisibleRange”来处理此问题,以捕获通过鼠标单击/拖动滚动条完成的滚动。计时器的缺点是Vbe停止/重置按钮也会停止计时器。如果有人能想出一个更好的计时器,那就太好了。或者我会问另一个问题。
Option Explicit
Private WithEvents objCommandBars As Office.CommandBars
Private rMonitor As Range
Private scrol As Boolean
Public Property Set Range(ByRef r As Range): Set rMonitor = r: End Property
Public Property Get Range() As Range: Set Range = rMonitor: End Property
Private Sub Class_Initialize()
Set objCommandBars = Application.CommandBars
End Sub
Private Sub Class_Terminate()
Set objCommandBars = Nothing
End Sub
Private Sub objCommandBars_OnUpdate()
Dim myrng As Range
If ActiveWorkbook.Name <> ThisWorkbook.Name Then Exit Sub
If ActiveSheet.Name <> rMonitor.Parent.Name Then Exit Sub
If TypeName(Selection) <> "Range" Then Exit Sub
If Intersect(Selection, rMonitor) Is Nothing Then Exit Sub
Set myrng = Application.Intersect(ActiveWindow.VisibleRange, ActiveSheet.Range("a500"))
If Not myrng Is Nothing And Not scrol Then scrol = True: MsgBox "chapter"
If myrng Is Nothing And scrol Then scrol = False
End Sub
Option Explicit
Private sRanges As String
Private cMonitor As ClsMonitorOnupdate
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Set cMonitor = Nothing
End Sub
Private Sub Workbook_Open()
Zetaan ActiveSheet
End Sub
Sub Zetuit()
Set cMonitor = Nothing
End Sub
Sub Zetaan(sht As Worksheet)
Select Case sht.Name
Case "Sheet1": sRanges = "A1:ZZ1000"
Case "Other Sheet": sRanges = "A1:ZZ1000"
Case Else: Exit Sub
End Select
Set cMonitor = New ClsMonitorOnupdate
Set cMonitor.Range = Sheets(sht.Name).Range(sRanges)
End Sub
Private Sub Workbook_SheetActivate(ByVal Sh As Object)
Zetaan Sh
End Sub
Private Sub Workbook_SheetDeactivate(ByVal Sh As Object)
Set cMonitor = Nothing
End Sub