返回列表 上一主題 發帖

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

請幫忙解決錯誤。

本帖最後由 GBKEE 於 2012-11-24 15:35 編輯

book1.rar (626.53 KB)

Private Sub Worksheet_Change(ByVal Target As Range)
Dim A As Range, Rng As Range
If Target.Column = 1 Then
With Sheets("oracle")
For i = 1 To .UsedRange.Rows.Count
   Set A = .UsedRange.Rows(i).Find(Target)
   If Not A Is Nothing Then
     If Rng Is Nothing Then
     Set Rng = .UsedRange.Rows(i)
     Else
     Set Rng = Union(Rng, .UsedRange.Rows(i))
     End If
    End If
Next
End With
End If
If Not Rng Is Nothing Then Rng.Copy Target.Offset(, 1)

End Sub
請問哪裡出錯了,前一千個左右都找對了,但之後的資料就開始亂了。
另外請問
1)如何將尋找範圍規定某一個欄,不是全部都在尋找範圍。
2)If Target.Column = 1 Then 可否改成指定某個字嗎?例如:Target = "TT"
3)可否設定幾個尋找的規則嗎?例如:Client = "John"  Payment term = “TT”   ORIGIN = "USA"
4)可否將Target指定某一個儲存格?
5)可否只是copy 符合規格的某幾個欄的資料嗎?不是全部資料都copy 過去。例如 A 欄,C欄,E欄,其他的都不要。

TOP

回復 1# 198188


    請問有無高人可以幫忙解答?

TOP

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

TOP

回復 3# GBKEE


    If Target.Column = 1 Then   這個好像是 搜尋範圍  他要將 Target 改成  "TT"  ,只是 看了看,感覺不順.....

  多做多想多學習,少看少錯少迷途

  多做=多多練習,多多編寫。
  多想=想想為什麼人家程式要那樣寫,如果換成自己,又會怎寫。
  多學習=學習人家的發問並解答,學習人家的寫法

  少看=只看不做也枉然

TOP

回復 3# GBKEE
Private Sub Worksheet_Change(ByVal Target As Range)
Dim A As Range, Rng As Range
If Target.Column = 1 Then
With Sheets("oracle")
For i = 1 To .UsedRange.Rows.Count
    Set A = .UsedRange.Rows(i).Find(Target)
    If Not A Is Nothing Then
      If Rng Is Nothing Then
      Set Rng = .UsedRange.Rows(i)
      Else
      Set Rng = Union(Rng, .UsedRange.Rows(i))
      End If
     End If
Next
End With
End If
If Not Rng Is Nothing Then Rng.Copy Target.Offset(, 1)

End Sub
資料庫
  A               B                   C                D                 E                F                  G
    姓名        性別        電話        國藉        車牌        年齡        職業
John        男        11111111        China        有        25        Clerk
Peter        男        22222222        Germany        有        30        A/C
David        男        33333333        USA        無        15        Admin
Tina        女        44444444        China        有        25        Clerk
June        女        55555555        Italy        無        35        Clerk

想要效果:
1)如何將尋找範圍規定某一個欄,不是全部都在尋找範圍。
就是想在姓名(A)一欄設定為尋找範圍
例如:規則:想找含有"a"的資料
結果:
Tina        女        44444444        China        有        25        Clerk

2)If Target.Column = 1 Then 可否改成指定某個字嗎?例如:Target = "TT"
如何設定將Target不是Column 而是指定一個字。
規則:Target含有“in”子資料
結果:
John        男        11111111        China        有        25        Clerk
David        男        33333333        USA        無        15        Admin
Tina        女        44444444        China        有        25        Clerk

3)可否設定幾個尋找的規則嗎?例如:Client = "John"  Payment term = “TT”   ORIGIN = "USA"
規則:性別=“男”; 車牌=“有”
結果:
John        男        11111111        China        有        25        Clerk
Peter        男        22222222        Germany        有        30        A/C
規則:國藉=“China"; 車牌=“有”;年齡="25"; 職業="Clerk"
結果:
John        男        11111111        China        有        25        Clerk
Tina        女        44444444        China        有        25        Clerk

4)可否將Target指定某一個儲存格?
例如將Target指定是另一個表的儲存格"A1"
只要A1輸入"男", Target就是"男"
結果:
John        男        11111111        China        有        25        Clerk
Peter        男        22222222        Germany        有        30        A/C
David        男        33333333        USA        無        15        Admin

或者將Target指定是另一個表的儲存格"A1" 及 "A2"
只要A1輸入"男", A2輸入"有“ ;Target就是"男" 和 "有”
結果:
John        男        11111111        China        有        25        Clerk
Peter        男        22222222        Germany        有        30        A/C

5)可否只是copy 符合規格的某幾個欄的資料嗎?不是全部資料都copy 過去。例如 A 欄,C欄,E欄,其他的都不要。
設定只會copy A 欄,B欄,C欄
規則Target="有"
結果:
John        男        11111111
Peter        男        22222222
Tina        女        44444444

TOP

回復 5# 198188


   
EX1.GIF
2012-12-1 10:33


姓名-職業欄 字尾加*可搜查含此字串的資料
如圖 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

回復 6# GBKEE

test.rar (15.06 KB)

是可以尋找出來,但是要在第二欄輸入才會出來,如果第二欄我用的不是姓名尋找,那麼就會有重複
John         男        11111111        a*
John         男        11111111       
Peter        男        22222222       
David        男        33333333       
Tina        女        44444444       
June        女        55555555       
另外我用兩個來尋找,出來的是最後輸入的哪個規格的資料,但我想要的是要全部符合才會出來。另外第二欄出現一次後就需要自己刪除(John 男 11111111)
John         男        11111111        usa*                        clerk*
David        男        33333333                               
                       
請問可否在sheet3 做條件用途
A1 是填數字,寫明會有多少個規則,
A2表示這條規則應用在哪一欄 B2代表要尋找的資料
例如
A1 填 "1"
A2 填 "B"; B2 填 "男"
出來的是
John         男        11111111
Peter        男        22222222
David        男        33333333

例如
A1 填 "3"
A2 填 "D"; B2 填 "A"
A3 填 "E"; B2 填 "有"
A4 填 "F"; B2 填 "CLERK"
出來的是
John         男        11111111       
Tina        女        44444444       

例如
A1 填 "2"
A2 填 "D"; B2 填 "A"
A3 填 "E"; B2 填 "無"
出來的是
David        男        33333333

TOP

回復 7# 198188


請問高人明白我想表示什麼嗎?需要更加詳細表明嗎?

TOP

回復 7# 198188
你應該注意一下G版的縮圖 ,
他這樣做已經將條件區和篩選結果分開了,
你的sheet2一開始是完全空白

TOP

回復 9# stillfish00


這點我知道,不採用Option Explicit就可以了。可以用按鈕或者手動控制。最主要是可以做到那些功能。

TOP

        靜思自在 : 吃苦了苦、苦盡廿來,享福了福、福盡悲來。
返回列表 上一主題