Board logo

標題: [發問] 儲存格(日期)相減時出現"執行階段錯誤13" [打印本頁]

作者: morris_lth    時間: 2016-2-25 11:52     標題: 儲存格(日期)相減時出現"執行階段錯誤13"

程式片斷如下,

Private Sub CommandButton4_Click() '
  Dim sh4 As Worksheet, sh6 As Worksheet
  Dim l As Integer, FinalRow As Integer
  Set sh4 = Sheets("Sheet4")
  Set sh6 = Sheets("Sheet6")
  Application.ScreenUpdating = False
  FinalRow = sh4.Range("A" & Rows.Count).End(xlUp).Row '
      For l = 2 To FinalRow
          sh4.Cells(l, 9).Copy sh6.Cells(l, 4)
          sh4.Cells(l, 5).Copy sh6.Cells(l, 5)
          sh4.Cells(l, 2).Copy sh6.Cells(l, 6)
          sh6.Cells(l, 7) = sh6.Cells(l, 6) - sh6.Cells(l, 5)  <-----錯誤出現在此"執行階段錯誤13 型態不符合"
       Next
End sub
================
Sh6 E列及F列是由SH4 複製過來, E &F 列顯示的是日期例如 2016/02/01
當儲存格顯示的日期是2016/02/01 這種格式程式就會出現"執行階段錯誤13"
若是將已複製的儲存格用滑鼠左鍵點2下,日期的顯示就會由"2016/02/01"變成"2016/2/1"
這種格式程式就可以運行正常. 有什麼方式在COPY時可以先將日期顯示改成這種"2016/2/1",
作者: morris_lth    時間: 2016-2-25 14:14

[[attach]23330[/attach]
加附件,SHEET3 是ERP系統轉出來的原始檔
作者: stillfish00    時間: 2016-2-25 16:53

回復 1# morris_lth
試試這樣
sh6.Cells(l, 7) = Datediff("d",CDate(sh6.Cells(l, 5)),CDate(sh6.Cells(l, 6)))
作者: morris_lth    時間: 2016-2-25 17:27

可以! 太厲害了~
能否解釋一下, 為何您的方式OK, 我原有的方式就會受限於
日期格式2016/02/01出現錯誤,2016/2/1 就能正常?
作者: stillfish00    時間: 2016-2-25 19:06

本帖最後由 stillfish00 於 2016-2-25 19:13 編輯

回復 4# morris_lth
sh6.Cells(l, 6) => Range 物件
sh6.Cells(l, 5) => Range 物件
兩物件無法相減會採用 Range的預設屬性即.Value 相減
故會變 sh6.Cells(l, 6).Value - sh6.Cells(l, 5).Value

你用TypeName(sh6.Cells(l, 6).Value)會傳回 String,
表示 sh6.Cells(l, 6).Value 其實是字串。

字串無法相減(因此產生Error)
所以我用CDate把字串轉為Date資料型態
兩筆Date求間隔,用DateDiff來做,"d"表示計算間隔單位為"日"

另一種方法就是先設定好儲存格格式為日期,就不會誤判斷為字串。

日期格式2016/02/01出現錯誤,2016/2/1 就能正常?
你看看點兩下變為2016/2/1的儲存格,右鍵儲存格格式是不是變日期了?




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