Private Sub Worksheet_SelectionChange(ByVal Target As Range)
With ActiveSheet.Shapes(1)
.Left = ActiveWindow.VisibleRange(2, 2).Left
.Top = ActiveWindow.VisibleRange(2, 2).Top
End With
End Sub
当您使用键盘滚动时,坐标(2,2)是您希望形状固定的位置。
但是,在一个巨大的工作表上没有滚动条会很麻烦。因此,我认为您可以使用"ontime刷新",将此代码放置在一个模块中。
Private eTime
Sub ScreenRefresh()
With ThisWorkbook.Worksheets("Sheet1").Shapes(1)
.Left = ThisWorkbook.Windows(1).VisibleRange(2, 2).Left
.Top = ThisWorkbook.Windows(1).VisibleRange(2, 2).Top
End With
End Sub
Sub StartTimedRefresh()
Call ScreenRefresh
eTime = Now + TimeValue("00:00:01")
Application.OnTime eTime, "StartTimedRefresh"
End Sub
Sub StopTimer()
Application.OnTime eTime, "StartTimedRefresh", , False
End Sub
Private Sub Worksheet_Activate()
Call StartTimedRefresh
End Sub
Private Sub Worksheet_Deactivate()
Call StopTimer
End Sub
ActiveSheet.Shape(1).Left
,您正在尝试固定形状的左坐标,并使用 ActiveWIndow.VisibleRange(2,2)
将 Shape(1) 的位置设置为坐标 (2,2)。但我无法理解 ActiveWindow.VisibleRange(2,2).Left
的语法用法。 - Rohit SalujaVisibleRange([RowIndex], [ColumnIndex])
。比如说,如果VisibleRange.Address现在是A1:X30
,那么VisibleRange(1,1)将是A1,VisibleRange(1,2)将是B1,VisibleRange(2,1)将是A2,VisibleRange(2,2)将是B2,依此类推.. - Rosetta首先创建形状:
Sub Creator()
Dim shp As Shape
Set shp = ActiveSheet.Shapes.AddShape(1, 100, 10, 60, 60)
shp.TextFrame.Characters.Text = "I will follow"
shp.Name = "MyButton"
End Sub
接下来在工作表代码区:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim sh As Shape, r As Range
Set sh = ActiveSheet.Shapes("MyButton")
Set r = ActiveCell
sh.Top = r.Offset(-1, -2).Top
sh.Left = r.Offset(-1, -2).Left
End Sub
sh.Top = r.Offset(-1, -2).Top
这行代码的作用是什么? - Rohit Salujash.Top
来设置形状的顶部位置时,我理解了。我也可以理解 r.offset(-1,-2)
,它表示向左偏移一个单元格和两列,但是为什么要使用语法 r.offset(-1,-2).Top
? - Rohit Saluja