返回列表 上一主題 發帖

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

從此文章學到精華,這些簡化方式在各先進提供解答中
都可以學到,經由此篇更精華吸收,感恩
總是利用巨集錄製,再依學習到的VBA語法
想想怎麼簡化,來到這看看其他人的寫法
再看看以前寫的,總是可以學到一些
像是單純現存數據,以前總是犯了選取cells
再處理,近日學到一些,針對利用處理數據
寫了一段處理格式的語法
目前處理資料尚可,但一直持續學習簡化增進效能技巧中
關於Application.ScreenUpdating 學到,正在運用簡化中
目前正在學習如何簡化,如果有簡化idea 煩請提供供學習,感恩

KRowEnd = Cells(Rows.Count, 1).End(xlUp).Row '以 A欄資料為基礎 =1 判斷範圍
kcolend = Cells(1, Columns.Count).End(xlToLeft).Column '以 第一列資料為基礎 =1判斷判斷範圍

MsgBox "列數KRowEnd=" & KRowEnd
MsgBox "欄數kcolend=" & kcolend

Range(Cells(1, 1), Cells(1, kcolend)).Select

    With Selection.Interior
        .ColorIndex = 36 '淺黃色
        .Pattern = xlSolid
    End With
    Selection.Font.ColorIndex = 3


Range(Cells(2, 1), Cells(KRowEnd, kcolend)).Select

    ActiveWindow.FreezePanes = True
    Selection.FormatConditions.Delete
    Selection.FormatConditions.Add Type:=xlExpression, Formula1:= _
        "=MOD(ROW(),2)"
    Selection.FormatConditions(1).Interior.ColorIndex = 15
Range(Cells(1, 1), Cells(1, kcolend)).Select
    Selection.AutoFilter
    Cells.EntireColumn.AutoFit

TOP

専心看了一片,很實用.
50 字節以內
不支持自定義 Discuz! 代碼

TOP

感謝大大分享!

TOP

看完成之後~觀念還是很模糊~應該先去買本書來看~

TOP

被版主猜中了,,,就是,用那種笨方式,,得到結果..

好好給它學起來,版主所教的...

感恩..

TOP

如果我復製儲存格後,只想貼上部份格式,
目前程式如下, 請問這可以在簡化嗎?
或是有其他的寫法

    Sheet9.Rows(1).Copy
    Sheet1.Rows(1).PasteSpecial Paste:=xlPasteFormats
    Sheet9.Rows(1).Copy
    Sheet1.Rows(1).PasteSpecial Paste:=xlPasteValidation

TOP

好實際的貼切問題說明
我的頭腦突然出現一線光
真是~讚
開心學習,學習很開心

TOP

本帖最後由 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

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

2. 當 Copy 後若貼上後馬上又要貼上的話,
無須 ...
luhpro 發表於 2011-10-20 23:01

請問 luhpro 大
如果我的要貼的地方是變數,是不是不能這樣寫
因為我執行會有問題
正確的方式是要如何寫??
謝謝
y = Sheet1.Range("A1").End(xlDown).Row+1
Set Sh9R = Sheets("Sheet9").Rows(1)
Set Sh1R = Sheets("Sheet1").Rows(x)

Sh9R.Copy
With Sh1R
  .PasteSpecial Paste:=xlPasteFormats
  .PasteSpecial Paste:=xlPasteValidation
End 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

        靜思自在 : 自己害自己,莫過於亂發脾氣。
返回列表 上一主題