2013-04-16 283 views
3

我想在特定單元格位置添加形狀,但由於某些原因無法獲得在所需位置添加的形狀。下面是我使用添加形狀代碼:vba在Excel中的特定單元格位置添加形狀

Cells(milestonerow, enddatecellmatch.Column).Activate 

Dim cellleft As Single 
Dim celltop As Single 
Dim cellwidth As Single 
Dim cellheight As Single 

cellleft = Selection.Left 
celltop = Selection.Top 

ActiveSheet.Shapes.AddShape(msoShapeOval, cellleft, celltop, 4, 10).Select 

我使用的變量捕捉左側和頂部位置,檢查與值我添加形狀,當看到正在在我的代碼設置的值在錄製宏時在手動位置手動。當我運行我的代碼時,cellleft = 414.75和celltop = 51,但是當我在錄製宏時手動添加形狀到活動單元位置時,cellleft = 318.75和celltop = 38.25。我一直在解決這個問題,並且在線查看了很多關於添加形狀的現有問題,但我無法弄清楚。任何幫助將不勝感激。

+0

上述代碼對我來說絕對合適。 –

+0

'。激活'在第一行不一定意味着它等於選擇然後...你需要檢查它。或者在第一行中簡單地將'.Activate'改成'.Select'。 –

+1

我有同樣的問題。 .Cell.Left和形狀的真實位置之間有一點區別。 這個「bug」只發生在excel 2007上。在excel 2003中,vba代碼運行良好。在2010年,我不知道。 我嘗試Debug.Print,但我看不到任何效果。 – 2013-09-04 14:30:43

回答

6

這似乎是爲我工作。我在最後添加了調試語句以顯示形狀的.Top.Left是否等於單元的.Top.Left值。

爲此,我選擇了單元格C2

Shape inserted at cell's top & left

Sub addshapetocell() 

Dim clLeft As Double 
Dim clTop As Double 
Dim clWidth As Double 
Dim clHeight As Double 

Dim cl As Range 
Dim shpOval As Shape 

Set cl = Range(Selection.Address) '<-- Range("C2") 

clLeft = cl.Left 
clTop = cl.Top 
clHeight = cl.Height 
clWidth = cl.Width 

Set shpOval = ActiveSheet.Shapes.AddShape(msoShapeOval, clLeft, clTop, 4, 10) 

Debug.Print shpOval .Left = clLeft 
Debug.Print shpOval .Top = clTop 

End Sub 
+0

我在你的調試部分中添加了圖形和單元格左和頂點都是相同的,所以我不知道它爲什麼不起作用。我保存了工作簿,關閉了Excel,然後重新打開,然後工作正常,所以不確定是什麼問題,但感謝您的回答。 – Casey

0

我發現這個問題是由只有當縮放級別不是100%會發生的錯誤引起的。在這種情況下,單元格位置通知不正確。

解決方法是將縮放比例更改爲100%,設置位置,然後更改回原始縮放比例。您可以使用Application.ScreenUpdatinf來防止閃爍。

Dim oldZoom As Integer 
oldZoom = Wn.Zoom 
Application.ScreenUpdating = False 
Wn.Zoom = 100 'Set zoom at 100% to avoid positioning errors 

    cellleft = Selection.Left 
    celltop = Selection.Top 
    ActiveSheet.Shapes.AddShape(msoShapeOval, cellleft, celltop, 4, 10).Select 

Wn.Zoom = oldZoom 'Restore previous zoom 
Application.ScreenUpdating = True 
相關問題