找回密码 注册 QQ登录
开思网工业级高精度在线3D打印服务

iCAx开思网

CAD/CAM/CAE/设计/模具 高清视频【积分说明】如何快速获得积分?快速3D打印 手板模型CNC加工服务在线3D打印服务,上传模型,自动报价
打印 上一主题 下一主题

[分享] 宏例子: 打開指定目錄逐一處理所有零件的瑣事

[复制链接]
21
发表于 2014-11-15 13:19:32 | 只看该作者
gt.adan 发表于 2014-11-15 12:19
悶哥請別生氣呀~剛才在上音樂課,所以沒能即時回覆,勿怪~
由於電腦重灌尚未安裝gif軟體,不得已只 ...

找到原因了。
由於VBA某些函數不兼容Unicode,閱讀中文字的時候就會分拆為2個Byte(字節)來處理。
這些函數在BIG5內碼的環境分拆簡體字會出現衝碼(分拆出不兼容檔案名稱的字節),導致報錯。
解決方法有2
1. 採用兼用Unicode函數傳回檔案名稱。(並不容易)
2. 借助其他兼用Unicode的軟件傳回檔案名稱。(例如 Excel)
3. 系統設定為GB內碼。

ps:
1. 在GB內碼的環境分拆正體字是不會出現衝碼的。
2. 設定內碼環境的方法是:控制台》時鐘、語言和區域》地區及語言》系統管理》非 Unicode 程式的語言》變更系統地區設定(設定後需要重啟電腦的)


评分

参与人数 1技术 +2 收起 理由
gt.adan + 2 很给力!

查看全部评分

22
发表于 2014-11-15 14:27:21 | 只看该作者
Francis 发表于 2014-11-15 13:19
找到原因了。
由於VBA某些函數不兼容Unicode,閱讀中文字的時候就會分拆為2個Byte(字節)來處理。
這 ...

太專業了!謝謝悶哥的說明~~^^

我個人覺得這個代碼還是好用的,它是個基礎,是個開始進入批次修改的領域。
要自行加入的代碼內容,就看大家的工作需求了~~
23
发表于 2014-11-15 15:02:14 | 只看该作者
gt.adan 发表于 2014-11-15 14:27
太專業了!謝謝悶哥的說明~~^^

我個人覺得這個代碼還是好用的,它是個基礎,是個開始進入批次修改的領 ...

謝謝阿丹回覆,是的,這段代碼簡短,容易入門。
贈阿丹一個包作為下午茶之用。{:soso_e113:}



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
24
发表于 2014-11-16 19:24:00 | 只看该作者
本帖最后由 Francis 于 2014-11-17 09:50 编辑
gt.adan 发表于 2014-11-13 22:30
謝謝梧桐,期待悶哥繼續開課~~^^

回想一下,可能阿丹對6樓那個對話框依然感興趣,就繼續說說吧。
由於SW-API沒有提供『選取資料夾對話框』的函數,那就需要用到 Windows-API 其中的 shell32.dll 來實現,
做法是,在宏內再加多一個模組(模塊),加入以下語句:
  1. Private Const BIF_RETURNONLYFSDIRS As LongPtr = &H1
  2. Private Const BIF_DONTGOBELOWDOMAIN As LongPtr = &H2
  3. Private Const BIF_RETURNFSANCESTORS As LongPtr = &H8
  4. Private Const BIF_BROWSEFORCOMPUTER As LongPtr = &H1000
  5. Private Const BIF_BROWSEFORPRINTER As LongPtr = &H2000
  6. Private Const BIF_BROWSEINCLUDEFILES As LongPtr = &H4000
  7. Private Const MAX_PATH As Long = 260

  8. Type BrowseInfo
  9.     hOwner As LongPtr
  10.     pidlRoot As LongPtr
  11.     pszDisplayName As String
  12.     lpszINSTRUCTIONS As String
  13.     ulFlags As LongPtr
  14.     lpfn As LongPtr
  15.     lParam As LongPtr
  16.     iImage As LongPtr
  17. End Type

  18. Type SHFILEOPSTRUCT
  19.     hwnd As LongPtr
  20.     wFunc As LongPtr
  21.     pFrom As String
  22.     pTo As String
  23.     fFlags As Integer
  24.     fAnyOperationsAborted As Boolean
  25.     hNameMappings As LongPtr
  26.     lpszProgressTitle As String
  27. End Type

  28. Declare PtrSafe Function SHBrowseForFolderA Lib "shell32.dll" _
  29.   (lpBrowseInfo As BrowseInfo) As LongPtr
  30.   
  31. Declare PtrSafe Function SHGetPathFromIDListA Lib "shell32.dll" _
  32.   (ByVal pidl As LongPtr, ByVal pszPath As String) As Boolean

  33. Function BrowseFolder(Optional Caption As String = "") As String
  34.      
  35.     Dim BrowseInfo As BrowseInfo
  36.     Dim FolderName As String
  37.     Dim ID As LongPtr
  38.     Dim Res As Boolean
  39.      
  40.     With BrowseInfo
  41.         .hOwner = 0
  42.         .pidlRoot = 0
  43.         .pszDisplayName = String$(MAX_PATH, vbNullChar)
  44.         .lpszINSTRUCTIONS = Caption
  45.         .ulFlags = &H1
  46.         .lpfn = 0
  47.     End With
  48.     FolderName = String$(MAX_PATH, vbNullChar)
  49.     ID = SHBrowseForFolderA(BrowseInfo)
  50.     If ID Then
  51.         Res = SHGetPathFromIDListA(ID, FolderName)
  52.         If Res Then
  53.             BrowseFolder = Left$(FolderName, InStr(FolderName, _
  54.             vbNullChar) - 1)
  55.         End If
  56.     End If
  57.      
  58. End Function
复制代码
這就可以生成了自己的『選取資料夾對話框』的函數:BrowseFolder 了。


再回到自訂表單(用戶窗體)見5樓,建立多一個按鈕,
雙擊新增的按鈕,貼上以下代碼:
  1. Private Sub CommandButton2_Click()
  2. myPath = BrowseFolder("TEST")
  3. TextBox1 = TextBox1 & myPath & Chr(13)
  4. End Sub
复制代码
需注意,宏程序的名稱 必須與 按鈕的名稱“CommandButton?”一致。
修改2個按鈕的Caption,可讓用起來更便利,
例如:按鈕 CommandButton1的Caption叫做『處理資料夾內所有零件的瑣事』及 按鈕 CommandButton2的Caption叫做『選取資料夾』。

注意:由於這個做法存在3個致命弱點:
1. 在某情況有衝碼現象。
2. 瀏覽資料夾不能設定默認路徑,及不會記憶之前的路徑位置,導致每次都要從『我的電腦』點選下去,非常繁瑣。
3. 資料夾內不一定所有零件檔案都需要處理瑣事的,執行前要把例外檔案移開,非常不便。

加上採用Excel作為界面的課題已經開展,感到這課題繼續下去的意義不大,
但又顧慮到做事需有始有終,故此作出上述說明。

如各位有興趣,是可繼續討論這課題下去的。




25
发表于 2014-11-17 21:24:03 | 只看该作者
本帖最后由 wutong490 于 2014-11-19 21:44 编辑

还请检验一下。
有如下问题,当我录制一个存为igs的宏后 ,我做的宏可以执行另存零件为igs,更换文件夹后还处理第一次选择文件夹的零件。
当关闭SW再开启的时候,宏就不处理零件了


(测试宏已经删除)

26
发表于 2014-11-17 23:07:59 | 只看该作者
繼續期待阿丹跟進這課題,不希望又出現另一宗半途而廢的事件。
27
发表于 2014-11-17 23:32:32 | 只看该作者
本帖最后由 gt.adan 于 2014-11-17 23:35 编辑
Francis 发表于 2014-11-17 23:07
繼續期待阿丹跟進這課題,不希望又出現另一宗半途而廢的事件。

悶哥請放心!「半途而廢」就請您寬心了,這一點阿丹絕無可能讓您失望~
尤其這還是阿丹主動要求悶哥繼續指導的呢!

請給阿丹一點點時間,忙完專案或是其間有較完整的時間一定立刻練習、回覆!


28
发表于 2014-11-17 23:51:27 | 只看该作者
Francis 发表于 2014-11-17 23:07
繼續期待阿丹跟進這課題,不希望又出現另一宗半途而廢的事件。

{:soso_e115:}
插嘴了,见谅
29
发表于 2014-11-18 00:17:25 | 只看该作者
本帖最后由 Francis 于 2014-11-18 00:28 编辑
wutong490 发表于 2014-11-17 21:24
还请检验一下。
有如下问题,当我录制一个存为igs的宏后 ,我做的宏可以执行另存零件为igs,更换文件夹后 ...
  1. longstatus = Part.SaveAs3("C:\Users\Administrator\Desktop\闸板\顶密封销.IGS", 0, 0)
复制代码
以上這句錄製回來的,打開什麼文件也好,都只會保存到代碼中的文件位置及名稱。

需使用GetPathName傳回整個文件名稱,可參考如以下代碼:
  1. MyFileName=Part.GetPathName
  2. MyFileNameL=LEN(MyFileName)
  3. MyFileNameIGS=Left(MyFileName, MyFileNameL - 6) & "IGS"
  4. Part.SaveAs3 MyFileNameIGS, 0, 0
复制代码

30
发表于 2014-11-18 00:22:13 | 只看该作者

梧桐,謝謝你提醒我還有功課沒交。回覆一下你的問題…
使用你分享的另存igs代碼 ,樓上所說的情況,在我測試是ok的!
沒有重啟程序就不存檔的問題~
請繼續熱情參與討論,求教於悶哥,一同學習!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3D打印手板模型快速制作服务,在线报价下单!

QQ 咨询|手机版|联系我们|iCAx开思网  

GMT+8, 2025-1-25 09:13 , Processed in 0.029402 second(s), 9 queries , Gzip On, Redis On.

Powered by Discuz! X3.3

© 2002-2025 www.iCAx.org

快速回复 返回顶部 返回列表