2013-05-21 25 views
3

我正在使用一個小的宏來添加和刪除受保護的工作表中的行。爲此,每行都有一個「刪除」按鈕。添加新行時,會複製最後一行(包括「刪除」按鈕),然後清除其內容。ActiveSheet.Shapes(Application.Caller).TopLeftCell.Row返回錯誤的行

對於刪除行,我交出了一些參數,包括「刪除」按鈕的(因此是項目的)行。爲此,我使用:

RowToDelete = ActiveSheet.Shapes(Application.Caller).TopLeftCell.Row 

此代碼正常工作對現有的生產線,但它會失敗以來的工作簿上次打開(除了最後一個)添加的所有線路。對於所有其他它將刪除添加的下一行,而不是「真正的」。

我想這是一個緩存問題,因爲「Application.Caller」包含正確的字符串,但會返回不再攜帶該名稱的複製形狀的行。

有沒有辦法清除相關緩存或強制Shapes()不使用緩存?

非常感謝您的幫助。

+1

當你創建你的形狀給他們他們連接到的行的名稱(名稱屬性)。對於在現有的行之間添加的行,只需向最後一行運行一個循環並更改它們的名稱,然後將+1加到形狀的數字部分 – 2013-05-21 11:26:02

+0

這或多或少是我所做的問題,即「ActiveSheet.Shapes (Application.Caller).TopLeftCell.Row將返回錯誤形狀的行,假設我們從行A和Shape1開始,並添加了Shape2(Shape1的副本)和Shape3(Shape2的一個副本)的2行B和C,那麼如果按下了Shape2,上面的代碼將返回Shape3的行而不是Shape2 –

+0

如果你的按鈕是一個ActiveX控件,它將不會在行被刪除的同時被刪除(添加一個'ActiveSheet.Shapes(Application .Caller).delete'在這種情況下)與表格控制按鈕,該按鈕會自動刪除在同一時間行比我說的是,你可能有幾個按鈕堆疊在相同的位置(舊按鈕作爲好吧) –

回答

0

我發現了一個解決方法,我並不太滿意,但現在必須執行此技巧。我使用隨機形狀名稱來避免錯誤的返回值。看起來,如果形狀名稱在查找工作之前不存在。

shp.Name = "Shape" & Format(i, "0000") & (Rnd * 999) 

必須有一些緩存問題,因爲按鈕在保存並重新打開工作簿後工作正常。

+0

如果它是緩存問題,si在嘗試之前會先做一些保存或者炮兵的方法:保存,關閉,重新打開,嘗試。 –

0

我有同樣的問題。這些按鈕由其他按鈕創建,如您的按鈕。但是,它只是在創建按鈕的代碼中開始執行它,我開始爲它添加一個名稱。所以,另一種不太令人滿意的處理方式就是沒有「shp.name =」這一行。當我把它拿出來時,它就停止了。我的猜測是,按照命名按鈕的自然方式,它自然避免了這種情況。就像您有工作表一樣,刪除工作表並添加另一工作表,它仍會記住舊工作表並將新工作表命名爲更高的數字。 刪除緩存的代碼會很好。如果問題有不同的要求,我相信有人知道該怎麼做。尋找,給出: Application.Restart() 雖然我還沒有嘗試過。