Board logo

標題: [發問] 有關"執行階段錯誤13 型態不符合"問題 [打印本頁]

作者: waterful    時間: 2016-8-29 14:22     標題: 有關"執行階段錯誤13 型態不符合"問題

本帖最後由 waterful 於 2016-8-29 14:24 編輯

以下是自己寫的非常陽春的比對新舊單號程式,出問題的在1那行,若改成Find(..., after:=wsh2.Cells(3, 1))則不會出現此錯誤,但程式效率差很多!!
有試著將i, j的型態改為byte, long, single, double, integer, variant等等皆無法改善, 爬了文發現出現此錯誤訊息的原因不一定是因為type定義問題,不知道有哪位大大可以幫我解答,謝謝。
PS.此錯誤出現後,只要將錯誤點掉"停止執行",仍然會跑出想要的資料,只是每次執行到一半都需點掉,所以感到很困擾!!
[attach]25084[/attach]
  1. Sub 剩餘維修單()

  2.     Dim wsh1 As Worksheet, wsh2 As Worksheet
  3.     Dim rngNew As Range
  4.     Dim row1 As Long, row2 As Long
  5.     Dim i As Double, j As Double
  6.                               
  7.     Set wsh1 = Sheets("未完工維修單")
  8.     Set wsh2 = Sheets("list_toexcel")
  9.     row1 = wsh1.[B2].End(xlDown).Row
  10.     row2 = wsh2.[A3].End(xlDown).Row
  11.     Set rngNew = wsh2.Range("A3:A" & row2)
  12.         
  13.     j = 3
  14.         
  15.     'step1.比對舊維修單號是否存在 , 找不到則將此行刪除
  16.     With wsh1

  17.         For i = 2 To row1 Step 1

  18.             '比對新維修單是否存在,找不到則將舊維修單殺掉
  19. 1:      If rngNew.Find(.Cells(i, 2), after:=wsh2.Cells(j, 1)) Is Nothing Then
  20.             
  21.                 .Cells(i, 2).Offset(0).EntireRow.Delete
  22.                 '舊維修單刪除一行後,行數少1
  23.                 row1 = row1 - 1
  24.                 '新維修單少比對一行,以增加程式效率
  25.                 j = j + 1
  26.                 row2 = row2 - 1
  27.                 '改善刪除一行後,程式改從下一行開始比對
  28.                 GoTo 1
  29.                
  30.             End If
  31.             
  32.         Next
  33.       
  34.     End With

  35. End Sub
複製代碼

作者: 准提部林    時間: 2016-8-29 16:47

Sub 刪除_01()
Dim R&, i&
Application.ScreenUpdating = False
With Sheets("未完工維修單")
   R = .[B65536].End(xlUp).Row
   For i = R To 2 Step -1
     If Sheets("list_toexcel").[A:A].Find(.Cells(i, 2), Lookat:=xlWhole) Is Nothing Then
      .Cells(i, 2).EntireRow.Delete
     End If
   Next
End With
End Sub


最基本的刪除列,須從下而上進行,較不易發生錯誤∼
資料較多的話,有其它方式,但要看完整的表格,是否有其它欄位!
 
 
作者: waterful    時間: 2016-8-30 09:57

回復 2# 准提部林
感謝版主,速度真的快很多,而且也不再出現錯誤了!!
完整的表格是真的有一托車的欄位,有的是人key的,有的是系統產生的,但主要還是以單號來做刪選。
這次又學到了Dim R"&"為long,之前一直看不懂,這次總算搞懂了,謝謝版主!!
作者: 准提部林    時間: 2016-8-30 10:24

回復 3# waterful

刪除速度快, 是因為加了下面這行,
Application.ScreenUpdating = False '凍結程式執行過程中的畫面變化, 等執行結束再顯示結果
上面那程式是最基本的刪除法, 對新手易懂易寫!

資料若超過數千或上萬筆以上, 就要用其它更具效能的寫法, 相對有些語法較不易理解,
但對VBA有心, 還是要去接觸, 論壇有很多現成的, 可找看看, 或等其他大大看是否有空做個另解!




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