Excel VBA:墨迹图片事件失败

我正在尝试编写一个VBA脚本,以允许Excel工作表在正常情况下冻结窗格之前正常向下滚动几行。 下面是我希望在用户滚动页面时运行的代码:

Sub FreezeView() Dim lngTopRow As Long With ActiveWindow.VisibleRange lngTopRow = .Row End With If ((lngTopRow >= 7) And (ActiveWindow.FreezePanes = False)) Then ActiveSheet.Range("B10").Select ActiveWindow.FreezePanes = True Else If ((lngTopRow = 10) And (ActiveWindow.FreezePanes = True)) Then ActiveWindow.FreezePanes = False End If End If ' MsgBox (lngTopRow) End Sub 

据我所知,Excel VBA没有任何直接检测滚动的事件; 然而,基于这篇文章 ,这可能是通过使用InkPicture对象。 不幸的是,此页面上的示例表不再被托pipe。 我试图访问InkPicture的_Painting事件(和其他事件)来完成这个工作,但是还没有能够得到任何这些事件来“开火”。 这里是我一直在使用的代码来完成这个工作:

首先,我使用下面的代码创build了名称为“ clsInkPicEvents ”的类模块:

 Public WithEvents InkPicEvents As InkPicture Private Sub Class_Initialize() MsgBox ("Initialized") End Sub Private Sub InkPicEvents_Click() MsgBox ("Click") End Sub Private Sub InkPicEvents_Painted(ByVal hDC As Long, ByVal Rect As MSINKAUTLib.IInkRectangle) MsgBox ("Painted") End Sub Private Sub InkPicEvents_Painting(ByVal hDC As Long, ByVal Rect As MSINKAUTLib.IInkRectangle, Allow As Boolean) MsgBox ("Painting") End Sub Private Sub InkPicEvents_Resize(Left As Long, Top As Long, Right As Long, Bottom As Long) MsgBox ("Resize") End Sub Private Sub InkPicEvents_Stroke(ByVal Cursor As MSINKAUTLib.IInkCursor, ByVal Stroke As MSINKAUTLib.IInkStrokeDisp, Cancel As Boolean) MsgBox ("Stroke") End Sub 

然后,在“ 模块1 ”中,我有以下脚本来创buildInkPicture对象并实例化类。 我真的不太熟悉这个,所以我不确定我是否正确地做到了这一点:

 Private Sub AddInkPic() Set oInkPic1 = Sheets("Sheet1").OLEObjects.Add _ (ClassType:="msinkaut.InkPicture.1", Left:=Sheets("Sheet1").Range("V12").Left, Top:=Sheets("Sheet1").Range("V12").Top, _ Width:=100, Height:=100) End Sub Private Sub Class_Initialize1() Dim clsInkPic1 As clsInkPicEvents Set clsInkPic1 = New clsInkPicEvents Set clsInkPic1.InkPicEvents = Sheets("Sheet1").OLEObjects("InkPicture1").Object clsInkPic1.InkPicEvents.SetEventInterest ICEI_Painting, True MsgBox (clsInkPic1.InkPicEvents.GetEventInterest(ICEI_Painting)) End Sub 

我试图手动设置事件的兴趣为_Painting事件为真,因为我怀疑它被默认设置为false,但似乎没有奏效。 我也怀疑InkPicture对象的属性之一可能是原因,所以试图改变不同的属性,如:

 Private Sub EditVals() Sheets("Sheet1").OLEObjects("InkPicture1").Object.Enabled = True Sheets("Sheet1").OLEObjects("InkPicture1").Object.InkEnabled = True Sheets("Sheet1").OLEObjects("InkPicture1").Object.AutoRedraw = True Sheets("Sheet1").OLEObjects("InkPicture1").Object.CollectionMode = 2 Sheets("Sheet1").OLEObjects("InkPicture1").Object.EditingMode = 0 End Sub 

但是这似乎没有改变任何东西。 现在我想知道是否它与devise模式有关,因为我注意到,我创buildInkPicture对象之后,直到我再次单击devise模式打开和closures,所以我想知道对象是不是“积极”,直到我这样做,如果启用,然后禁用devise模式可能以某种方式“清除”类实例或东西? 真的不确定。 无论如何,任何帮助将不胜感激! 谢谢。