2016-06-07 88 views
3

我有一個Excel工作簿Sheet 1上兩個形狀類似下面 enter image description here移動形狀作爲用戶滾動向右在Excel(VBA)

我的要求,當用戶朝向片的右側即朝向headers24,header25導航被等等,我希望工作表上的兩個形狀向用戶的右側移動。

是否有人請爲此提出任何建議。

感謝

+0

這是容易的,如果如果您使用滾動條,則使用*箭頭鍵或者* Tab鍵或者* Enter鍵向右/左移動並不那麼容易。 –

+0

@ Gary的學生:我打算隱藏滾動條,所以用戶將不得不使用箭頭鍵導航 –

+0

我會稍後發佈一些示例代碼*(當我上電腦時)* ........ .....我們可以在ActiveCell移動時使用事件宏來移動Shape。 –

回答

3

試試這個..是的,它很容易..

將工作表模塊:其中形狀存在於這個代碼。

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)是您希望在隨鍵盤一起滾動時將形狀固定在的位置。

但是,如果在一個巨大的工作表上沒有滾動條的話,這會很麻煩。所以或者我認爲你可以使用刷新準時,將此代碼放在一個模塊

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 

而且在Sheet1(其中形狀中)下面的代碼

Private Sub Worksheet_Activate() 
    Call StartTimedRefresh 
End Sub 

Private Sub Worksheet_Deactivate() 
    Call StopTimer 
End Sub 
+0

將形狀綁定到ActiveWindow的好主意*(+ 1)* –

+0

非常好的例子。如果你能解釋你的解決方案的第一部分將會很有幫助 –

+0

@RohitSaluja,你面臨什麼問題?你能夠得到第一個解決方案嗎?如果您不確定是否必須將代碼放置在存在形狀的工作表模塊(例如Sheet1)中。 – Rosetta

3

首先創建形狀:

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 

如果您前後移動活動單元格,該框將隨之移動。

注:

這只是演示代碼。您仍然需要:

  • 增加保護,防止試圖移動形狀「關閉屏幕」
  • 基於形狀的大小設置從ActiveCell適當的偏移
+0

請詳細說明'sh.Top = r.Offset(-1,-2).Top'這是什麼代碼行正在做? –

+0

@RohitSaluja它將形狀的頂部移動到兩個單元左側和活動單元下面的一個單元.....所以如果活動單元是** F12 **,參考單元是** D11 ** –

+0

那麼,我當你用'sh.Top'來設置形狀的頂部位置時獲取它。我對'r.offset(-1,-2)'也很好,它說偏移了左邊一個單元和左邊兩列,但是爲什麼語法'r.offset(-1,-2).Top' ? –