返回列表 上一主題 發帖

[發問] 請教改良速度方法

回復 2# 198188
你列出的程序,但沒說明目的效果,是沒人明瞭你要請教什麼.
例如:Client = "John"  Payment term = “TT”   ORIGIN = "USA"  這也看不懂你要請教什麼.

TOP

回復 5# 198188


   

姓名-職業欄 字尾加*可搜查含此字串的資料
如圖 Sheet2 的程式碼
  1. Option Explicit
  2. Private Sub Worksheet_Change(ByVal Target As Range)         '這是工作表的觸發事件
  3.     Dim xlFind As Range, F As String, W As String
  4.     Application.EnableEvents = False                        'EnableEvents 屬性 如果指定物件能觸發事件,則本屬性為 True。讀/寫 Boolean。
  5.     If Target.Row = 2 Then                                  '改變輸入(資料)的儲存格列位=2
  6.         If Target.Column >= 1 And Target.Column <= 7 Then   '改變輸入(資料)的儲存格欄位介於 A欄:G欄 間
  7.         'If Target.Row = 2 And Target.Column >= 1 And Target.Column <= 7 Then  '兩判斷式 可合併
  8.             Cells(Rows.Count, "A").End(xlUp).CurrentRegion.Offset(1) = ""   '清除舊有尋找的資料
  9.             W = Replace(Target, "*", "")                                    '去掉 "*"字串
  10.             Set xlFind = Sheets("資料庫").Columns(Target.Column).Find(W, LOOKAT:=IIf(InStr(Target, "*"), xlPart, xlWhole))
  11.                       '在Sheets("資料庫").Columns(Target.Column) 的相同欄位中Target有"*"  尋找有xlPart(部份)相同
  12.             If Not xlFind Is Nothing Then           '尋找到
  13.                 F = xlFind.Address                  '設下第一個找到的位置
  14.                 Do
  15.                     With Cells(Rows.Count, "A").End(xlUp).Offset(1)
  16.                         Cells(.Row, "A") = xlFind.Parent.Cells(xlFind.Row, "A")  'xlFind.Parent: Parent 物件的父層
  17.                         Cells(.Row, "B") = xlFind.Parent.Cells(xlFind.Row, "B")  'xlFind.Row:    找到的列號
  18.                         Cells(.Row, "C") = xlFind.Parent.Cells(xlFind.Row, "C")
  19.                         ' Cells(.Row, "C") 前面沒加  . 是在這Sheet 的 Cells(儲存格)
  20.                     End With
  21.                     Set xlFind = Sheets("資料庫").Columns(Target.Column).FindNext(xlFind) '接著往下找
  22.                 Loop While F <> xlFind.Address      '離開迴圈: 直到尋找回第一個找到的位置
  23.             End If
  24.          End If
  25.     End If
  26.     Application.EnableEvents = True
  27. End Sub
複製代碼

TOP

回復 22# 198188
測試完成約12秒,時間不算長吧!
  1. Option Explicit
  2. Sub Worksheet()
  3.     Dim LastRec As Integer
  4.     Dim i As Integer, T
  5.     T = Time
  6.     With Worksheets("Oracle")
  7.          LastRec = .Range("G1").End(xlDown).Row
  8.         .Range("A2:A" & LastRec).Value = .Range("G2:G" & LastRec).Value  '全部直接給值會快些
  9.         For i = 2 To LastRec
  10.             If IsError(Application.VLookup(Worksheets("Oracle").Range("C" & i).Value, Sheets("Follower").Range("A:E"), 5, False)) Then
  11.                 .Range("B" & i).Value = ""
  12.             Else
  13.                 .Range("B" & i).Value = Application.VLookup(Worksheets("Oracle").Range("c" & i).Value, Sheets("Follower").Range("A:E"), 5, False)
  14.             End If
  15.         Next
  16.     End With
  17.     MsgBox Format(Time - T, "HH:MM:SS")
  18. End Sub
複製代碼

TOP

回復 24# 198188
Option Explicit 陳述式 在模組層次中強迫每個在模組�堛瘍僂くㄔ眸楨�確的宣告。
模組層有Option Explicit作用是:  系統會提醒,沒宣告的變數須宣告. 要養成這習慣 有助程式的偵錯.

TOP

回復 26# 198188
你要在何種狀態下不按鈕就自動run
1.檔案開啟時
A: 在ThisWorkbook這模組中有一預設的程序
  1. Private Sub Workbook_Open()
  2.    '這裡的程式碼不按鈕就自動run
  3. End Sub
複製代碼
B: 在VBA 的一般模組 寫上
  1. Sub AUTO_OPEN()  
  2. '這裡的程式碼不按鈕就自動run
  3. End Sub
複製代碼
2.檔案開啟後選定(移動)到這工作表,在這工作表模組中有一預設的程序
  1. Private Sub Worksheet_Activate()
  2.    '這裡的程式碼不按鈕就自動run
  3. End Sub
複製代碼
3.使用 OnTime 方法
  1. Sub AUTO_OPEN()  
  2. Application.OnTime Now + TimeValue("00:05:00"), "模組.程式名稱"
  3. End Sub
複製代碼

TOP

回復 29# 198188
18# 附檔 [Rule] 工作表  Ordered Date 欄位的進階篩選公式
=">="&DATEVALUE("2012/10/1")    指定日期
=">="&TODAY()                                    當日

TOP

回復 31# 198188
可自行試一下啊!!!

TOP

本帖最後由 GBKEE 於 2012-12-6 10:29 編輯

回復 33# 198188
請看圖解

TOP

回復 35# 198188


  

TOP

回復 37# 198188
" 執行階段錯誤‘9’:陣列索引超出範圍"-> 就是找不到!!! (這兩工作表名稱檢查看看)  
VLookup(Wb.Worksheets("New form of payment report").Range("B" & j).Value, Worksheets("outstanding payments").Range("A:A"), 1, False)

TOP

        靜思自在 : 人生不一定球球是好球,但是有歷練的強打者,隨時都可以揮棒。
返回列表 上一主題