SolidWorks專門論壇 SolidWorks forum

 找回密碼
 註冊
查看: 35263|回復: 14

VBA.Left 執行階段錯誤

[複製鏈接]
發表於 2014/10/29 14:07:49 | 顯示全部樓層 |閱讀模式
下面這段就是有問題的語法

'只取檔名,如:"Part"
myFileName = Left(swModel.GetTitle, InStrRev(swModel.GetTitle, ".") - 1)

VBA.Left 執行階段錯誤,這問題不一定每台電腦都會出現~
以我舉例,在我電腦打好一個巨集並且執行,沒有問題~ "Part"
但是把 swp 丟到另一台電腦就會出現 Left 錯誤...
2014-10-29 13 46 33.jpg

我不清楚也懶得查證是什麼原因,以下就是 SolidWorks 避開使用 Left 的語法


'-----------------------------------------------------------------------------
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2

Sub main()
    Set swApp = Application.SldWorks
    Set swModel = swApp.ActiveDoc

    Dim myFileName_Extension, myFileName As String

    '取得檔名與副檔名,如:"Part.SLDPRT"
    myFileName_Extension = Right(swModel.GetPathName, (Len(swModel.GetPathName) - InStrRev(swModel.GetPathName, "\")))

    '只取檔名,如:"Part"
    myFileName = Mid(myFileName_Extension, 1, InStrRev(myFileName_Extension, ".") - 1)

    MsgBox ("檔名+副檔名:" & myFileName_Extension & vbCrLf & "檔名:" & myFileName): Exit Sub
End Sub
'-----------------------------------------------------------------------------


很奇怪... Right & Mid 竟然沒事...不是三兄弟嗎...
當然~ 有更好的寫法,依需求也可以用 StrReverse 寫~
我只是單純證明 Right & Mid 可以使用...

發表於 2014/10/29 14:55:44 | 顯示全部樓層
可能是你第一個程式是用GetTitle的方式? 我猜測的,統一用getPathName方式看看~

點評

我測試時,兩台電腦都是一樣的SWP檔喔,因為一直試一直錯 我才打 [我不清楚也懶得查證是什麼原因] ... 其實我已經試過很多方法了...  發表於 2014/10/30 08:05
發表於 2014/10/29 15:41:15 | 顯示全部樓層
檔案總管的“隱藏已知檔案類型的副檔名”選項選上了,導致GetTitle傳回Part1而不是Part1.SLDPRT,InStrRev(swModel.GetTitle, ".")就會傳回0,Left(swModel.GetTitle, -1)當然會出錯。

點評

嗯嗯~ 剛好這個方式我也試過了,但是~我單獨用下面方式 myFileName = swModel.GetTitle 也是出現一樣錯誤...  詳情 回復 發表於 2014/10/30 08:05
讚!  發表於 2014/10/29 16:07
 樓主| 發表於 2014/10/30 08:05:34 | 顯示全部樓層
Francis 發表於 2014/10/29 15:41
檔案總管的“隱藏已知檔案類型的副檔名”選項選上了,導致GetTitle傳回Part1而不是Part1.SLDPRT,InStrRev( ...

嗯嗯~ 剛好這個方式我也試過了,但是~我單獨用下面方式

myFileName = swModel.GetTitle

也是出現一樣錯誤...

點評

悶大已經講了很清楚了, 你再仔細研究一下, 試著去偵錯, 看看變數的值, 找出問題所在。 要取檔名不要用 GetTitle, 就像 comelon 說的 : 用 GetPathName 我以前也遇過這個問題  詳情 回復 發表於 2014/10/30 20:33
發表於 2014/10/30 08:33:01 | 顯示全部樓層
悶大,不知道是和我一樣感覺.... " 無言以對"

點評

什麼意思呢?  發表於 2014/10/30 11:57
發表於 2014/10/30 20:33:49 | 顯示全部樓層
小小誠 發表於 2014/10/30 08:05
嗯嗯~ 剛好這個方式我也試過了,但是~我單獨用下面方式

myFileName = swModel.GetTitle

悶大已經講了很清楚了, 你再仔細研究一下, 試著去偵錯, 看看變數的值, 找出問題所在。
要取檔名不要用 GetTitle, 就像 comelon 說的 : 用 GetPathName
我以前也遇過這個問題

點評

我不懂耶? 為什麼取檔名不要用 GetTitle ?如同之前所說,下面這個張圖的方法我也試過了,取消或打勾,都是正常的... (VBA 跟 資料夾選項 會有關係嗎? 是否可舉例說明,以後我會更加注意) [attachi  詳情 回復 發表於 2014/10/30 22:43
 樓主| 發表於 2014/10/30 22:43:46 | 顯示全部樓層
hoisee 發表於 2014/10/30 20:33
悶大已經講了很清楚了, 你再仔細研究一下, 試著去偵錯, 看看變數的值, 找出問題所在。
要取檔名不要用 Ge ...

我不懂耶? 為什麼取檔名不要用 GetTitle ?如同之前所說,下面這個張圖的方法我也試過了,取消打勾,都是正常的...
(VBA 跟 資料夾選項 會有關係嗎? 是否可舉例說明,以後我會更加注意)
2014-10-30 22 34 39.jpg


我電腦跑下面這隻程式完全正常,但是在另一台電腦跑,又會在 Left 出現錯誤
(真的很抱歉...我真的不懂你們的意思...)
  1. Dim swApp As SldWorks.SldWorks
  2. Dim swModel As SldWorks.ModelDoc2

  3. Sub main()
  4.     Set swApp = Application.SldWorks
  5.     Set swModel = swApp.ActiveDoc

  6.     Dim FileName As String
  7.     Dim Left_FileName As String

  8.     Dim Right_FileName As String
  9.     Dim Mid_FileName As String

  10.     FileName = swModel.GetTitle
  11.     Left_FileName = Left(swModel.GetTitle, InStrRev(swModel.GetTitle, ".") - 1)

  12.     Right_FileName = Right(swModel.GetPathName, (Len(swModel.GetPathName) - InStrRev(swModel.GetPathName, "")))

  13.     Mid_FileName = Mid(Right_FileName, 1, InStrRev(Right_FileName, ".") - 1)
  14.     'MsgBox ("使用Mid:" & MidFileName)

  15.     MsgBox ("使用GetTitle 取檔名+副檔名:" & FileName & vbCrLf & _
  16.             "使用Left 取檔名-副檔名:" & Left_FileName & vbCrLf & vbCrLf & _
  17.             "使用Right 取檔名+副檔名:" & Right_FileName & vbCrLf & _
  18.             "使用Mid 取檔名-附檔名:" & Mid_FileName)
  19. End Sub
複製代碼

發表於 2014/10/30 23:27:48 | 顯示全部樓層
GetTitle是用來獲取軟體標題列內的文字,這些文字是受到系統的設定所影響的,比對以下兩張圖片就可明白:
SNAG-0001.png SNAG-0002.png
由於軟體標題列內的文字,是按照開啟文件那一刻的系統設定,開啟檔案後才修改才設定,標題列內的文字是不會隨之變改的,導致樓主的誤解。

點評

這張圖讓問題一目了然,雖然還沒遇過這個坑 但還是受教了,如果改天程式帶到別台電腦出錯 至少還知道從什麼地方開始除錯  詳情 回復 發表於 2018/5/28 20:48
這張圖真是一目了然  詳情 回復 發表於 2018/5/28 20:47
正解!!! 原來 GetTitle 有這種危險存在...(不知道適合用在什麼時候!) 因為我個人是習慣 [顯示] 副檔名~ 根本想不到這問題... 謝謝 悶哥~ 以後還請您多多指教~  詳情 回復 發表於 2014/10/30 23:55
 樓主| 發表於 2014/10/30 23:55:39 | 顯示全部樓層
Francis 發表於 2014/10/30 23:27
GetTitle是用來獲取軟體標題列內的文字,這些文字是受到系統的設定所影響的,比對以下兩張圖片就可明白:

...

正解!!!
原來 GetTitle 有這種危險存在...(不知道適合用在什麼時候!)

因為我個人是習慣 [顯示] 副檔名~ 根本想不到這問題...
謝謝 悶哥~ 以後還請您多多指教~


發表於 2018/5/28 20:47:19 | 顯示全部樓層
Francis 發表於 2014/10/30 23:27
GetTitle是用來獲取軟體標題列內的文字,這些文字是受到系統的設定所影響的,比對以下兩張圖片就可明白:

...

這張圖真是一目了然
發表於 2018/5/28 20:48:47 | 顯示全部樓層
Francis 發表於 2014/10/30 23:27
GetTitle是用來獲取軟體標題列內的文字,這些文字是受到系統的設定所影響的,比對以下兩張圖片就可明白:

...

這張圖讓問題一目了然,雖然還沒遇過這個坑
但還是受教了,如果改天程式帶到別台電腦出錯
至少還知道從什麼地方開始除錯
發表於 2018/5/28 21:49:07 來自手機 | 顯示全部樓層
你把left的命名空间写全就可以了
您需要登錄後才可以回帖 登錄 | 註冊

本版積分規則

手機版上論壇|論壇來自幾何科技 論壇架構版次 20240312

GMT+8, 2024/4/26 01:51 , Processed in 0.273427 second(s), 19 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2023 Discuz! Team.

快速回復 返回頂部 返回列表