2012-05-18 102 views
1

我已經在VBA中編寫了一個宏,它只是填充表單中另一個單元格的給定單元格的值。我這樣做了很多的片單元組成,並且我做它像這樣:在excel中添加新行而不會破壞使用Range.Value的vba宏

Range("B3").Value = Range("B200") 
Range("B4").Value = Range("B201") 
'etc. 

現在,我常常被插入新行添加值,所以我可能會插入B200之間的新行 B201,它會破壞宏,因爲它不會自動更新,當我插入新行時。

如何編碼宏,以便在插入新行或列時自動調用單元格引用?

+0

如果有幾個細胞,然後作爲Shiin建議的命名範圍將幫助,但如果你有很多像你在評論中提到的細胞(1-500)的命名,然後將細胞的這一程序將真正得到痛苦,恐怕... –

+0

是的,有很多細胞 - 所以有更好的方法嗎? – GideonShalev

+0

AFAIK沒有其他辦法。您必須單獨命名所有500個單元格。有一個替代方案,雖然它不那麼痛苦,並且需要稍微編輯您的代碼。這會有幫助嗎? –

回答

1

嘗試給出範圍的名稱。如果您按名稱引用該範圍,則Excel會搜索它並檢索定義它的行。添加新行時,範圍名稱會更新其定義。

除了上面的內容,我認爲本教程舉例說明了我的觀點: http://www.homeandlearn.co.uk/excel2007/excel2007s7p6.html這是如何定義範圍的名稱。

本教程介紹瞭如何使用它在宏和VBA: http://excel.tips.net/T003106_Using_Named_Ranges_in_a_Macro.html

我希望這有助於:d

+0

嗨,Shiin,這會有幫助嗎? – GideonShalev

+0

嗨Shiin,我該怎麼做?假設我目前在宏中使用1-500行。我是否給整個系列命名?如果是這樣 - 比如說我稱之爲「Range1」,那麼當我在行250後面插入新行時,如何引用單元格不會中斷? – GideonShalev

+0

+ 1 Shiin建議使用命名範圍。 –

1

這不是一個答案,但替代。

命名你的範圍是Shiin建議的方法,但如果你有500個單元,那麼就像我之前提到的那樣,命名500個單元並在你的代碼中使用它們可能會非常痛苦。另一種方法是使用智能代碼。讓我們舉個例子

比方說,你有這樣的

Sub Sample() 
    Range("B3").Value = Range("B200") 
    Range("B4").Value = Range("B201") 
    Range("B5").Value = Range("B201") 
    ' And 
    ' So On 
    ' till 
    Range("B500").Value = Range("B697") 
End Sub 

代碼編寫這些代碼的最好方法是這樣的

Sub Sample() 
    Dim i As Long 

    For i = 200 To 697 
     Range("B" & i - 197).Value = Range("B" & i) 
    Next i 
End Sub 

,如果你插入時說排線說300則簡單地打破了上面的代碼分兩部分

Sub Sample() 
    Dim i As Long 

    For i = 200 To 299 
     Range("B" & i - 197).Value = Range("B" & i) 
    Next i 

    For i = 301 To 698 
     Range("B" & i - 197).Value = Range("B" & i) 
    Next i 
End Sub 

所以每次插入一行,只需打破for循環成一個額外的部分。這看起來很乏味,但比命名500單元格並在代碼中使用它們要好得多。

如果您打算只使用一次宏(即1次使用),則請繼續閱讀

如果您擔心用戶插入該行後單元格不會更新,則您可以代替分配值來指定公式。

例如

Range("B3").Formula = "=B200" 

這將會把公式=B200細胞B3。所以下次當你插入一行,使第200行移動它的位置的時候,你會發現,該公式自動獲取細胞更新B3

HTH

2

我的建議是,以確保該行要從中檢索值具有唯一值,您可以在任何時候隨時查找值,然後從找到的單元格行的列B中獲取值。所以現在你想要在B200中獲得價值,A200總是有文字:「最終總計」,這是獨一無二的。

Dim MyRNG As Range 

Set MyRNG = Range("A:A").Find("Final Total", LookIn:=xlValues, LookAt:=xlWhole) 
Range("B3").Value = Range("B" & MyRNG.Row) 
Range("B4").Value = Range("B" & MyRNG.Row + 1) 
+0

謝謝傑裏 - 看起來像解決了問題! – GideonShalev

+0

請您點擊這個答案上的upvote箭頭,然後將其標記爲已接受?謝謝。 –

+0

它不會讓我 - 關於沒有足夠的聲望點的東西 – GideonShalev