Board logo

標題: 利用Find找日期,出現錯誤!! [打印本頁]

作者: hugh0620    時間: 2018-7-3 11:29     標題: 利用Find找日期,出現錯誤!!

Dear 大大
         
           對於Find的使用,經常還是會卡卡的,
           經常需要計算生產區間的工作天,所以,會常使用到Find,
           確定生產開始與結束的日期,再進行分析。
           
           所以,有沒有大大可以有資料或範本能更清楚的說明Find的正確使用方式,
           避免會卡到這個問題。
           
            下圖是執行上的錯誤。
             並附上檔案,請大大協助解決。
            [attach]28906[/attach]
             [attach]28907[/attach]
作者: linyancheng    時間: 2018-7-3 14:40

請先確實宣告變數
作者: hugh0620    時間: 2018-7-3 15:39

回復 2# linyancheng


    所以,要設定哪個變數呢??  該如何設定呢??
作者: hcm19522    時間: 2018-7-3 16:05

X12=SUMPRODUCT((EOMONTH(G$11:G$1499*1,0)=EOMONTH(DATE(LOOKUP(9^9,V$12:V12),W12,1),0))*(M$11:M$1499=""))
作者: hugh0620    時間: 2018-7-3 16:20

回復 4# hcm19522


    感謝!!  但需要的是程式碼的解決。  (因不止只有解決一筆,而是N筆資料。)
作者: hcm19522    時間: 2018-7-3 16:29

回復 5# hugh0620
下拉~~~~~~
作者: hugh0620    時間: 2018-7-3 17:45

回復 6# hcm19522

           再次感謝!!

          但需要的是程式碼的解法非函數的解法
          資料是持續的更新,筆數不一定,不考慮用函數來解決這個問題。
          這個部分,僅是我整個架構一部分要解決的問題,所以,會考量到檔案大小的問題。
作者: naruto018    時間: 2018-7-4 08:04

回復 1# hugh0620


    因為Find找不到要尋找的文字
所以回傳Nothing給變數
導致下一行變數的處理出錯
作者: Kubi    時間: 2018-7-4 08:39

回復 1# hugh0620
A = A.Offset(0, 0).Row
等號右邊的 A 於上行被設定成 Range 物件變數,而等號左邊的 A 是卻是以數值變數(指向Row)呈現,可能是此陳述式出現矛盾的問題關鍵。
另外還需要如8樓的 naruto018 大說的 Find 須加寫若找不到時的防呆機制。
作者: hugh0620    時間: 2018-7-4 08:40

回復 8# naruto018


          問題清楚!!

          之前測試時,在RUN的時候是沒有問題,現在要把工具在做一些調整後,
          就發生這個Nothing的問題出來,有試著在程式碼修改,但試完還是錯誤,
          不知道該如何修正這個問題。
作者: GBKEE    時間: 2018-7-4 14:06

回復 10# hugh0620
Application.CountA([AB10:AM10000])=0,沒有資料,當然Find(K)找不到
  1. For K = MS01 To ME02
  2. MsgBox Application.CountA([AB10:AM10000])
  3. Set C = 工作表7.Range("AB10:AM10000").Find(K)
  4.     TE01 = C.Offset(0, 0).Row
  5. DS = 0
  6.     For L = A To B
  7.    
  8.         If Range("I" & L) = K Then
  9.            DS = DS + Range("O" & L)
  10.         End If
  11.     Next
  12. 1
  13.     C.Offset(1, 0) = DS
  14.     D = D + 1
  15. Next
複製代碼

作者: doom834    時間: 2018-7-27 13:48

加入 is nothing
Set A = Sheets("行事曆").Range("G3:G10000").Find(ST)
If A Is Nothing Then
    '自行加入找不到ST這個字串或數字時的動作
Else
    A = A.Offset(0, 0).Row
End If
作者: a5007185    時間: 2018-7-28 00:24

回復 10# hugh0620

誠如GBKEE超級版主所言,
Find之所以出現問題,
是因為你尋找的範圍沒有資料,
Find找不到你變數K的值,
你應該要修改一下[AB10:AM10000]的範圍。

另外,你Find的值導向 TE01 這個變數,
但是這個變數再後面也都沒有再出現,
所以是有點摸不著頭緒。

如果你需要其他協助,
建議你可以把你的整個邏輯跟目的跟版上熱心大大們分享,
我相信你可以得到很好的回饋的!

祝你順心 : )
作者: hugh0620    時間: 2018-8-3 08:55

回復 13# a5007185


      嗨!! 你可能誤解了, 提供的檔案,是針對我一開始PO的文,
              A、B的部分在執行的過程中產生錯誤,而非去討論下半段資料的範圍。
              A、B的資料是有的,但還是發生錯誤
              因為,在每次撰寫FIND時,這個問題一直重複性的發生。
              
              下半段的部分,只是最初我在測試統計區間資料時,在同一個SHEET做簡單的模擬,
              後來,工具做好後,沒有再去修正這個部分!!
              
              其實設計的邏輯,就如同程式碼的內容,主要是:統計區間的工作天數!!         
              後害塞到每一筆資料中(開始日、結束日)。 這個部分就下是半段的部分,這個是沒有問題的!!
作者: a5007185    時間: 2018-8-3 09:15

回復 14# hugh0620

抱歉,我稍微整理以上各位大大表述的意見。

Find函數如果該範圍找不到你的目標的時候,
函數會回饋「Nothing」,
而既然Set A = Nothing,
當然A就不會有Row的屬性,
所以程式才會跳錯,
這就是你問題的所在。

所以為了避免這個問題,
在執行 A = A.Offset(0, 0).Row 之前先檢查A是否存在,
若不存在則跳出訊息並停止程式運作。
  1. Set A = 工作表7.Range("G3:G10000").Find(ST)
  2. If A Is Nothing Then
  3.     MsgBox "A部分輸入的日期不存在": Exit Sub
  4. Else
  5.     A = A.Offset(0, 0).Row
  6. End If

  7. Set B = 工作表7.Range("G3:G10000").Find(ED)
  8. If B Is Nothing Then
  9.     MsgBox "A部分輸入的日期不存在": Exit Sub
  10. Else
  11.     B = B.Offset(0, 0).Row
  12. End If
複製代碼

作者: hugh0620    時間: 2018-8-3 09:43

回復 12# doom834


          嗨,謝謝你的提醒, 不加入is nothing 是故意的,
                  為什麼不加入,由於,在計算生產的負載情況,不能計算錯誤,
                  情願讓程式在跑時候,發現錯誤,無法執行下去,使用者就會反應!!
作者: hugh0620    時間: 2018-8-3 10:14

回復 15# a5007185

          嗨!!    可能還是沒有清楚提問的問題!!
                  
                   問題點:資料有,但卻發生找不到資料的問題
                  
                   而非是探討,資料沒有時的處置!!
作者: ikboy    時間: 2018-8-3 10:14

了解A 是否有物件:
Set A = ......
if not A is Nothing then  ..........
作者: hugh0620    時間: 2018-8-3 10:24

[attach]29123[/attach]
                              
                               同一樣的檔案,相同A、B的設定,下半段做了小調整,整個程式是可以被執行的。
                               但我還是不能理解的是,為什麼當初A、B會出現Nothing (但資料上明明有),
                               我後來的處理是,把
                                Set A = 工作表7.Range("G3:G10000").Find(ST)   <=不動
                                       A = A.Offset(0, 0).Row             <=A改成A01,A01 = A.Offset(0, 0).Row
                               重新RUN,就可以RUN,A也沒有再發生Nothing的情況。
                               然後,A01 = A.Offset(0, 0).Row 又改回A = A.Offset(0, 0).Row
                               試著在run,也沒有發生問題。
                              
                               雖是,問題被解決,但我還是不了解,到底是怎麼回事,
                               是哪個環節、或是設定上的需要如何調整!!
                               這是我疑惑的地方,有請大大指教!!
作者: stillfish00    時間: 2018-8-3 10:38

回復 17# hugh0620
G欄資料格式是自訂而非日期,Find時會當成字串來比,但你傳入Find的ST是Date,所以找不到。
要嘛傳入ST前再format轉成字串
要嘛G欄格式都改日期
作者: stillfish00    時間: 2018-8-3 10:39

本帖最後由 stillfish00 於 2018-8-3 10:49 編輯

回復 19# hugh0620
沒這回事,19# 檔案還是會出現錯誤。
作者: hugh0620    時間: 2018-8-3 15:13

本帖最後由 hugh0620 於 2018-8-3 15:22 編輯
G欄資料格式是自訂而非日期,Find時會當成字串來比,但你傳入Find的ST是Date,所以找不到 ...
stillfish00 發表於 2018-8-3 10:38


        
應該不是這個問題,如果是這個問題,我應該要去調整D欄位的格式,但我並沒有這樣子處理,
僅是在程式碼上做修正而已。

如果有比較好的處理方式,我都有提供檔案,可以進行修改及測試。
  
還是比較想了解,哪個環節出了錯誤!!
作者: hugh0620    時間: 2018-8-3 15:17

回復  hugh0620
沒這回事,19# 檔案還是會出現錯誤。
stillfish00 發表於 2018-8-3 10:39


   
     [attach]29128[/attach]
     
     修正後,檔案是可以被正常執行!!
     不了解,檔案還是會出現錯誤??
     是否可以截圖或是上傳GIF檔看一下!!
作者: stillfish00    時間: 2018-8-3 23:09

回復 23# hugh0620
我知道為啥結果不一樣了。
你可以試試先按Ctrl+F,你能跑是因為你目前的選項是在搜尋'公式' ,我的是在搜尋'內容'所以執行時有Error

Find 的參數有很多是Optional,但是當你沒指定這些參數時,他會以上次使用的值作為預設值。
這裡的上次包含使用者有用到Ctrl+F搜尋時選擇的選項。

所以,用Find的話最好還是明確指定這些參數。
作者: hugh0620    時間: 2018-8-4 09:04

回復  hugh0620
我知道為啥結果不一樣了。
你可以試試先按Ctrl+F,你能跑是因為你目前的選項是在搜尋'公 ...
stillfish00 發表於 2018-8-3 23:09



         Ctrl+F的方式,在遇到問題的時候,也有試著用過這樣的方式,
        也有寫設定LookIn:=xlValues,但也測試過,不行!!
        
         有沒有一個Find跟Format的相關參數上的說明跟範例,
         能更方便了解如何使用!!
         (不熟悉規範及使用方式,應用上,就會很卡!! 也需要這方面的求助跟指導)
作者: stillfish00    時間: 2018-8-6 18:19

本帖最後由 stillfish00 於 2018-8-6 18:20 編輯

回復 25# hugh0620
Find 參數說明 : https://msdn.microsoft.com/zh-tw ... e-find-method-excel

自己簡單試幾種寫法, 除了第二種會Fail如同之前講的,其他都能成功吧。
  1. Sub TestCases()
  2.     Dim ST As Date
  3.     Dim ED As Date
  4.     ST = 工作表7.Range("W3")
  5.     ED = 工作表7.Range("X3")
  6.     With 工作表7
  7.         Set A = .Range("G3:G10000").Find(What:=ST, After:=.[G3], LookIn:=xlFormulas, LookAt:=xlWhole)
  8.         If Not A Is Nothing Then Debug.Print "#1", A.Row Else Debug.Print "#1", "Find Fail"
  9.         Set A = .Range("G3:G10000").Find(What:=ST, After:=.[G3], LookIn:=xlValues, LookAt:=xlWhole)
  10.         If Not A Is Nothing Then Debug.Print "#2", A.Row Else Debug.Print "#2", "Find Fail"
  11.         Set A = .Range("G3:G10000").Find(What:=Format(ST, "yyyy/mm/dd"), After:=.[G3], LookIn:=xlValues, LookAt:=xlWhole)
  12.         If Not A Is Nothing Then Debug.Print "#3", A.Row Else Debug.Print "#3", "Find Fail"
  13.         Set A = .Range("G3:G10000").Find(What:=.Range("W3").Text, After:=.[G3], LookIn:=xlValues, LookAt:=xlWhole)
  14.         If Not A Is Nothing Then Debug.Print "#4", A.Row Else Debug.Print "#4", "Find Fail"
  15.     End With
  16. End Sub
複製代碼

作者: Kubi    時間: 2018-8-6 21:05

回復 25# hugh0620
這裡有一篇不知是否有幫助?
https://excelmacromastery.com/excel-vba-find/#Using_SearchFormatwith_Find
請看:Using SearchFormat with Find 篇及其範例
其中有一句:
Application.FindFormat.Clear
可清除前次設定的 Find Format
作者: GBKEE    時間: 2018-8-7 07:38

本帖最後由 GBKEE 於 2018-8-7 07:47 編輯

回復 25# hugh0620

Range.Find 方法
說明中的 l 備註
如果沒有找到符合的儲存格,則此方法會傳回 Nothing。Find 方法不會影響選取範圍或作用儲存格。
每次使用此方法時,都會儲存 LookIn、LookAt、SearchOrder 及 MatchByte 的設定如果下次呼叫此方法時不指定這些引數的值,便會使用儲存值。如果設定這些引數,將會變更 [尋找] 對話方塊中的設定,而修改 [尋找] 對話方塊中的設定,則會變更省略這些引數時所使用的儲存值。若要避免發生問題,每次使用此方法時,請明確設定這些引數。您可以使用 FindNext 及 FindPrevious 方法,重複進行搜尋。

修改19#檔案的程式
  1. Private Sub CommandButton1_Click()
  2. Dim ST As Date
  3. Dim ED As Date
  4. Dim a As Range
  5. ST = 工作表7.Range("W3")
  6. ED = 工作表7.Range("X3")
  7. Set a = 工作表7.Range("G3:G10000").Find(ST, LookIn:=xlValues)
  8. MsgBox a Is Nothing  &"  找不到 " & ST
  9. 'Find 尋找日期, 資訊的類型,為公式.
  10. Set a = 工作表7.Range("G3:G10000").Find(ST, LookIn:=xlFormulas)
  11. MsgBox a Is Nothing &"  找到 " & ST
  12. End Sub
複製代碼

作者: 准提部林    時間: 2018-8-7 16:43

假設第一次開啟EXCEL後,並未執行任何的搜尋動作,
只進行這檔案的FIND, 而有時可, 有時不可(確定尋找值是存在的),
則應不是搜尋條件參數的問題了~~
作者: 准提部林    時間: 2018-8-7 16:55

若用FIND一直有困擾, 可改用MATCH函數
Dim ST&
ST = Range("W3")
A = Application.Match(ST, [G:G], 0)
If IsError(A) Then MsgBox "找不到 W3 的日期!!!": Exit Sub
MsgBox A
作者: mhl9mhl9    時間: 2018-8-17 00:21

回復 1# hugh0620
不用find而用match就簡單許多了>>>>A=worksheetfunction.match([W3],[G:G],0)>>>>A是第A行




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