返回列表 上一主題 發帖

[轉貼] VBA的寫作技巧與增進效能

本帖最後由 luhpro 於 2011-10-31 22:33 編輯
如果我復製儲存格後,只想貼上部份格式,目前程式如下, 請問這可以在簡化嗎?
Sheet9.Rows(1).Copy
    Sheet1.Rows(1).PasteSpecial Paste:=xlPasteFormats
    Sheet9.Rows(1).Copy
    Sheet1.Rows(1).PasteSpecial Paste:=xlPasteValidation
wind6424 發表於 2011-10-19 15:01

1. 當重複參照同一標的物時
可善用 With ... End With

2. 當 Copy 後若貼上後馬上又要貼上的話,
無須再次 Copy

3. Sheet1 是保留字不能直接拿來引用,
會發生錯誤
Set Sh9R = Sheets("Sheet9").Rows(1)
Set Sh1R = Sheets("Sheet1").Rows(1)

Sh9R.Copy
With Sh1R
  .PasteSpecial Paste:=xlPasteFormats
  .PasteSpecial Paste:=xlPasteValidation
End With

後記修正 :
後來經過測試發現問題點應該不在 Sheet1 (即其並非保留字),
它應是代表 Sheets(1).
而 Sheet9 發生問題的原因是 我測試時所新建的 Excel 檔其預設值都只會開到 Sheets(3),
故而用 Sheet9 會發生錯誤.

然而因為 Sheet Name 並不會與 Sheet No. 完全相對應,
所以該 Sheet1 到底是不是 Sheet(1) 沒進 VBA 一般是看不出來的,
所以還是建議使用 Sheets("Sheet1") 形式再搭配 With 來簡化程式,
這是個人的寫程式習慣僅供參考.

TOP

本帖最後由 luhpro 於 2011-10-31 22:27 編輯
請問 luhpro 大
如果我的要貼的地方是變數,是不是不能這樣寫
因為我執行會有問題
正確的方式是要如何寫 ...
wind6424 發表於 2011-10-28 09:56

使用 With ... End With 的關鍵就是 將 "重複使用" 的元件藉由 With 宣告,
而能改以 . 來取代以減少程式的大小及判讀(或解析)的複雜度.
有點像DOS指令用 * 來取代某一 "不確定大小與範圍" 的文字組合.

y = Sheet1.Range("A1").End(xlDown).Row+1
    (此處我會改為 y = Sheets("Sheet1").Range("A1").End(xlDown).Row+1 原因詳參 #39)
與底下 Sh1R 的
Sheets("Sheet1").Rows(x)
兩者共有的部份就是 "Sheets("Sheet1")" 了.

故而我們可以改為 :
Set Sh9R = Sheets("Sheet9").Rows(1)

With Sheets("Sheet1")
  y = .Range("A1").End(xlDown).Row+1
  Sh9R.Copy
  With .Rows(x)
    .PasteSpecial Paste:=xlPasteFormats
    .PasteSpecial Paste:=xlPasteValidation
  End With
End With

不過因為這個討論串是專門討論 "VBA的寫作技巧與增進效能" 的,
為避免模糊了首篇文章的討論焦點,
若還需要繼續討論建議請你另開新串討論為宜(你可以在開串文首打上:
此篇為延續 "VBA的寫作技巧與增進效能" 串中第 XX 篇的討論<建議要加上連結>),
就可以順利接續下去討論了.

TOP

        靜思自在 : 一個人不怕錯,就怕不改過,改過並不難。
返回列表 上一主題