Board logo

標題: 不同的程式寫法 [打印本頁]

作者: fangsc    時間: 2012-6-14 22:17     標題: 不同的程式寫法

想請教以下這一段程式是否有執行起來比較快的寫法 ?
我只是想參考看看不同的程式寫法.
感謝...
  For fcsty = 4 To put_rownum
            If .Cells(fcsty, "B") <> "" And Not .Cells(fcsty, "A") Like "*合計" Then
               ' 增加判斷 "B"欄為空白, 或是保留 "合計" 的列.
                If .Cells(fcsty, hid_colnum) < put_maxnum And .Cells(fcsty, hid_colnum) > put_minnum Then
                    .Rows(fcsty).Hidden = True
                End If
            End If
        Next
    End With


_________________________________________
整段程式
Sub ProductsQ1FP()
ActiveSheet.PivotTables("樞紐分析表1").PivotFields("Group").ClearAllFilters
ActiveWindow.FreezePanes = False ' 取消凍結視窗
Dim put_rownum As Integer
Dim hid_colnum As Integer
ActiveSheet.Rows.Hidden = False '取消所有的隱藏
ActiveSheet.Range("c4").Select  '游標放在c4
ActiveWindow.FreezePanes = True '凍結視窗
ActiveWindow.ScrollColumn = 3   '凍結列與欄的視窗
ActiveSheet.PivotTables("樞紐分析表1").PivotFields("Group").AutoSort xlDescending, _
    "加總 的Q1F-P"
put_rownum = ActiveSheet.Range("c2").Value  '最後一列
put_maxnum = ActiveSheet.Range("b1").Value  '大於
put_minnum = ActiveSheet.Range("b2").Value  '小於
hid_colnum = ActiveSheet.Range("f1").Value  '排序欄
With ActiveSheet
        .Cells(4, hid_colnum).Select            '游標放置點
        For fcsty = 4 To put_rownum
            If .Cells(fcsty, "B") <> "" And Not .Cells(fcsty, "A") Like "*合計" Then
               ' 增加判斷 "B"欄為空白, 或是保留 "合計" 的列.
                If .Cells(fcsty, hid_colnum) < put_maxnum And .Cells(fcsty, hid_colnum) > put_minnum Then
                    .Rows(fcsty).Hidden = True
                End If
            End If
        Next
    End With
End Sub
作者: register313    時間: 2012-6-16 10:59

回復 1# fangsc

一次隱藏
  1. With ActiveSheet
  2.   For fcsty = 4 To put_rownum
  3.     If .Cells(fcsty, "B") <> "" And Not .Cells(fcsty, "A") Like "*合計" Then
  4.        If .Cells(fcsty, hid_colnum) < put_maxnum And .Cells(fcsty, hid_colnum) > put_minnum Then
  5.           Rng = IIf(Rng = "", "A" & fcsty, Rng & "," & "A" & fcsty)
  6.        End If
  7.     End If
  8.   Next
  9. End With
  10. Rows("4:" & put_rownum).Hidden = False
  11. Range(Rng).EntireRow.Hidden = True
  12. End Sub
複製代碼

作者: fangsc    時間: 2012-6-17 11:55

本帖最後由 GBKEE 於 2012-6-17 13:38 編輯

回復 2# register313


    執行有一些問題.
是不是需要宣告Rng變數, 但我加入了Rng變數宣告,也無效.
敬請指點. 謝謝.
作者: register313    時間: 2012-6-17 20:48

Rng字串變數之字元數受限於255個字元
造成執行錯誤,不知有何方法可解決?
[attach]11428[/attach]
作者: GBKEE    時間: 2012-6-17 20:55

回復 4# register313
  1. Sub ProductsQ1FP()
  2. Dim Rng As Range
  3. ' 12Q1Fcst Vs. Q1Plan
  4. ActiveSheet.PivotTables("樞紐分析表1").PivotFields("Group").ClearAllFilters
  5. ActiveWindow.FreezePanes = False ' 取消凍結視窗
  6. Dim fcsty, put_rownum, hid_colnum, put_maxnum, put_minnum As Integer
  7. ActiveSheet.Rows.Hidden = False '取消所有的隱藏
  8. ActiveSheet.Range("c4").Select  '游標放在c4
  9. ActiveWindow.FreezePanes = True '凍結視窗
  10. ActiveWindow.ScrollColumn = 3   '凍結列與欄的視窗
  11. ActiveSheet.PivotTables("樞紐分析表1").PivotFields("Group").AutoSort xlDescending, _
  12.     "加總 的Q1F-P"
  13. ' 樞紐分析以加總的Q1F-P做排序
  14. put_rownum = ActiveSheet.Range("a1").Value  '最後一列
  15. put_maxnum = ActiveSheet.Range("b1").Value  '大於
  16. put_minnum = ActiveSheet.Range("b2").Value  '小於
  17. hid_colnum = ActiveSheet.Range("f1").Value  '排序欄
  18. With ActiveSheet
  19.   For fcsty = 4 To put_rownum
  20.     If .Cells(fcsty, "B") <> "" And Not .Cells(fcsty, "A") Like "*合計" Then
  21.        If .Cells(fcsty, hid_colnum) < put_maxnum And .Cells(fcsty, hid_colnum) > put_minnum Then
  22.          If Rng Is Nothing Then
  23.             Set Rng = .Range("A" & fcsty)
  24.         Else
  25.             Set Rng = Union(Rng, .Range("A" & fcsty))
  26.         End If
  27.        End If
  28.     End If
  29.   Next
  30.   .Rows("4:" & put_rownum).Hidden = False
  31. End With
  32. Rng.EntireRow.Hidden = True
  33. End Sub
複製代碼

作者: register313    時間: 2012-6-17 21:06

回復 5# GBKEE

一次性動作

法1:語法簡單,但Rng字串受限255個字元(儲存格範圍受限制)
Rng = IIf(Rng = "", "A" & fcsty, Rng & "," & "A" & fcsty)

法2:語法較長,但Rng儲存格範圍不受限制
If Rng Is Nothing Then
    Set Rng = .Range("A" & fcsty)
Else
    Set Rng = Union(Rng, .Range("A" & fcsty))
End If
  
如此解釋是否正確
作者: GBKEE    時間: 2012-6-17 21:09

回復 6# register313
範圍如可預知    Rng = IIf(Rng = "", "A" & fcsty, Rng & "," & "A" & fcsty) 是簡單些
作者: fangsc    時間: 2012-6-17 22:10

感謝二位指導.
程式看不太懂,基本功還是需要多練習,好好理解一下,可以應用在別的地方.




歡迎光臨 麻辣家族討論版版 (http://forum.twbts.com/)