如果单元格为“0”,则运行Excel宏;A500“;显示/显示在屏幕上

如果单元格为“0”,则运行Excel宏;A500“;显示/显示在屏幕上,excel,vba,Excel,Vba,我希望在单元格“A500”后立即运行Excel宏 当向下/向上滚动工作表时,屏幕上显示 我记得在什么地方读到过关于active-x或标准控件的文章 它有一个“在滚动到视图中”事件,所以可以这样做 将控件直接放置在工作表上所需单元格附近。 我现在找不到这个控件 一个更好的方法当然是一个单元公式,子类化仍然是很重要的 从长远来看,我想这是个坏主意:) 如上所述,在Onupdate事件的帮助下,(捕捉鼠标滚轮,而不是单击滚动条)(将Sheetname和Range更改为您的) 在名为ClsMonitor

我希望在单元格“A500”后立即运行Excel宏 当向下/向上滚动工作表时,屏幕上显示

我记得在什么地方读到过关于active-x或标准控件的文章 它有一个“在滚动到视图中”事件,所以可以这样做 将控件直接放置在工作表上所需单元格附近。 我现在找不到这个控件

一个更好的方法当然是一个单元公式,子类化仍然是很重要的 从长远来看,我想这是个坏主意:)


如上所述,在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