SolidWorks机械工程师网——最大的SolidWorks学习平台

标题: 麻烦哪位大佬指证一下代码错误 [打印本页]

作者: ufong13    时间: 2024-9-24 23:59
标题: 麻烦哪位大佬指证一下代码错误
下面的宏代码用于在配置特定中自动生成项目号一栏,当文件名格式为E2401A000000000 零件,文件号的前6号代表了项目号,E为项目属性,24为年代号,代表2024年,01为项目序号,代表24年第一个项目号,A代表设备数量,A表示此项目只有一台设备,如果是B就表示此项目有两台设备,当项目只有一台设备时项目号格式就是E2024-01-1,最后的-1省略不做,项目号即为E2024-01。当项目有两台的设备时,文件名为E2401B000000000 零件,项目号就需要在最后加写上与B对应的-2,即项目号为E2024-01-2。


宏运行时提示用户定义类型未定义


  1. Sub SetProjectNumberFromFileName()  
  2.     Dim swApp As SldWorks.SldWorks  
  3.     Dim Part As SldWorks.ModelDoc2  
  4.     Dim custPropMgr As SldWorks.CustomPropertyManager  
  5.     Dim fileName As String  
  6.     Dim filePath As String  
  7.     Dim projectCode As String  
  8.     Dim projectYear As String  
  9.     Dim projectNumber As String  
  10.     Dim deviceCount As String  
  11.     Dim finalProjectNumber As String  
  12.       
  13.     ' 获取SolidWorks应用程序对象  
  14.     Set swApp = Application.SldWorks  
  15.       
  16.     ' 检查是否有活动文档  
  17.     If swApp.ActiveDoc Is Nothing Then  
  18.         MsgBox "没有打开的文档", vbExclamation  
  19.         Exit Sub  
  20.     End If  
  21.       
  22.     ' 获取活动文档  
  23.     Set Part = swApp.ActiveDoc  
  24.       
  25.     ' 确保是零件文档  
  26.     If Not TypeOf Part Is SldWorks.ModelDoc2 Then  
  27.         MsgBox "当前文档不是零件文档", vbExclamation  
  28.         Exit Sub  
  29.     End If  
  30.       
  31.     ' 获取文件名和路径  
  32.     filePath = Part.GetPathName  
  33.     fileName = Dir(filePath)  
  34.       
  35.     ' 提取项目号信息  
  36.     ' 假设文件名格式为 "E2401A000000000 零件.sldprt" 或 "E2401B000000000 零件.sldprt"  
  37.     projectCode = Left(fileName, 7) ' 提取前7个字符  
  38.     projectYear = Mid(projectCode, 2, 2) ' 提取年份后两位  
  39.     projectYear = "20" & projectYear ' 转换为完整的年份格式  
  40.     projectNumber = Mid(projectCode, 4, 2) ' 提取项目序号  
  41.     deviceCount = Mid(projectCode, 7, 1) ' 提取设备数量标识  
  42.       
  43.     ' 根据设备数量格式化最终的项目号  
  44.     If deviceCount = "A" Then  
  45.         finalProjectNumber = "E" & projectYear & "-" & projectNumber  
  46.     ElseIf deviceCount = "B" Then  
  47.         finalProjectNumber = "E" & projectYear & "-" & projectNumber & "-2"  
  48.     Else  
  49.         MsgBox "无法识别的设备数量标识:" & deviceCount, vbExclamation  
  50.         Exit Sub  
  51.     End If  
  52.       
  53.     ' 获取特定配置的自定义属性管理器  
  54.     ' 注意:这里假设我们操作的是默认配置,如果要针对特定配置,需要额外处理  
  55.     Set custPropMgr = Part.Extension.CustomPropertyManager("") ' 空字符串表示默认配置  
  56.       
  57.     ' 尝试设置或更新项目号自定义属性  
  58.     Dim errCode As Long  
  59.     errCode = custPropMgr.Add2("项目号", finalProjectNumber, swCustomInfo_ConfigurationSpecific, swCustPropertyTypeText, "")  
  60.       
  61.     ' 如果属性已存在,则更新它  
  62.     If errCode = swCustomPropertyInfo_AlreadyExists Then  
  63.         errCode = custPropMgr.Edit2("项目号", finalProjectNumber, swCustomInfo_ConfigurationSpecific, swCustPropertyTypeText)  
  64.     End If  
  65.       
  66.     ' 检查是否有错误  
  67.     If errCode <> 0 And errCode <> swCustomPropertyInfo_AlreadyExists Then  
  68.         MsgBox "设置自定义属性时出错:" & errCode, vbExclamation  
  69.     Else  
  70.         MsgBox "项目号已成功设置为:" & finalProjectNumber, vbInformation  
  71.     End If  
  72.       
  73.     ' 清理  
  74.     Set custPropMgr = Nothing  
  75.     Set Part = Nothing  
  76.     Set swApp = Nothing  
  77. End Sub
复制代码



作者: 沉默的人    时间: 2024-9-25 13:29
顶一下,坐等高手!
作者: wjbg2019    时间: 2024-9-25 13:54
那一句报错?
作者: ufong13    时间: 2024-9-25 20:54
已经解决了,我把图号分离的代码与上面项目号的代码合在一起了,现在可能实现项目号、图号、名称根据文件名进行自动填写,下一步准备解决根据文件名自动识别填写材料号、焊接件、组件及部件
  1. Dim a As Integer

  2. Dim b As String

  3. Dim m As String

  4. Dim e As String

  5. Dim k As String

  6. Dim t As String

  7. Dim c As String

  8. Dim j As Integer

  9. Dim strmat As String

  10. Dim tempvalue As String

  11. Dim Part As SldWorks.ModelDoc2

  12. Dim swApp As SldWorks.SldWorks

  13. Dim swModelDoc As SldWorks.ModelDoc2

  14. Dim swConfig As SldWorks.Configuration

  15. Dim CustPropMgr As SldWorks.CustomPropertyManager

  16. Dim swModel As SldWorks.ModelDoc2
  17.     Dim projectCode As String
  18.     Dim projectYear As String
  19.     Dim projectNumber As String
  20.     Dim deviceCount As String
  21.     Dim finalProjectNumber As String
  22.     Dim fileName As String
  23.     Dim filePath As String

  24. Sub main()

  25. Set swApp = Application.SldWorks

  26. Set swModelDoc = swApp.ActiveDoc

  27. Set swConfig = swModelDoc.ConfigurationManager.ActiveConfiguration

  28. Set swModel = swApp.ActiveDoc

  29. Set CustPropMgr = swModel.Extension.CustomPropertyManager(swModel.ConfigurationManager.ActiveConfiguration.Name)

  30. '设定变量

  31. c = swApp.ActiveDoc.GetTitle() '零件名

  32. strmat = Chr(34) + Trim("SW-Material" + "@") + c + Chr(34)

  33. a = InStr(c, " ") - 1 '重点:分隔标识符,这里是一个空格,也可换成其他符号

  34. If a > 0 Then

  35. k = Left(c, a)

  36. t = Left(LTrim(e), 3)

  37. If t = "GBT" Then

  38. e = "GB/T" + Mid(k, 4)

  39. Else

  40. e = k

  41. End If

  42. b = Mid(c, a + 2)

  43. t = Right(c, 7)

  44. If t = ".SLDPRT" Or t = ".SLDASM" Or t = ".sldprt" Or t = ".sldasm" Then

  45. j = Len(b) - 7

  46. Else

  47. j = Len(b)

  48. End If

  49. m = Left(b, j)

  50. End If

  51.    
  52. ' 获取SolidWorks应用程序对象
  53.     Set swApp = Application.SldWorks
  54.       
  55.     ' 检查是否有活动文档
  56.     If swApp.ActiveDoc Is Nothing Then
  57.         MsgBox "没有打开的文档", vbExclamation
  58.         Exit Sub
  59.     End If
  60.       
  61.     ' 获取活动文档
  62.     Set Part = swApp.ActiveDoc
  63.       
  64.     ' 确保是零件文档
  65.     If Not TypeOf Part Is SldWorks.ModelDoc2 Then
  66.         MsgBox "当前文档不是零件文档", vbExclamation
  67.         Exit Sub
  68.     End If
  69.    
  70. ' 获取文件名和路径
  71.     filePath = Part.GetPathName
  72.     fileName = Dir(filePath)

  73. ' 提取项目编号信息
  74.     ' 假设文件名格式为 "E2401A000000000 零件.sldprt" 或 "E2401B000000000 零件.sldprt"
  75.     projectCode = Left(fileName, 7) ' 提取前7个字符
  76.     projectYear = Mid(projectCode, 2, 2) ' 提取年份后两位
  77.     projectYear = "20" & projectYear ' 转换为完整的年份格式
  78.     projectNumber = Mid(projectCode, 4, 2) ' 提取项目序号
  79.     deviceCount = Mid(projectCode, 6, 1) ' 提取设备数量标识
  80.    
  81. ' 根据设备数量格式化最终的项目编号
  82.     If deviceCount = "A" Then
  83.         finalProjectNumber = "E" & projectYear & "-" & projectNumber
  84.     ElseIf deviceCount = "B" Then
  85.         finalProjectNumber = "E" & projectYear & "-" & projectNumber & "-2"
  86.     ElseIf deviceCount = "C" Then
  87.         finalProjectNumber = "E" & projectYear & "-" & projectNumber & "-3"
  88.     ElseIf deviceCount = "D" Then
  89.         finalProjectNumber = "E" & projectYear & "-" & projectNumber & "-4"
  90.     ElseIf deviceCount = "E" Then
  91.         finalProjectNumber = "E" & projectYear & "-" & projectNumber & "-5"
  92.     ElseIf deviceCount = "F" Then
  93.         finalProjectNumber = "E" & projectYear & "-" & projectNumber & "-6"
  94.     ElseIf deviceCount = "G" Then
  95.         finalProjectNumber = "E" & projectYear & "-" & projectNumber & "-7"
  96.     ElseIf deviceCount = "H" Then
  97.         finalProjectNumber = "E" & projectYear & "-" & projectNumber & "-8"
  98.     ElseIf deviceCount = "I" Then
  99.         finalProjectNumber = "E" & projectYear & "-" & projectNumber & "-9"
  100.     Else
  101.         MsgBox "无法识别的设备数量标识:" & deviceCount, vbExclamation
  102.         Exit Sub
  103.     End If
  104. '删除原有
  105. CustPropMgr.Delete ("项目编号")

  106. CustPropMgr.Delete ("代号")

  107. CustPropMgr.Delete ("名称")

  108. '新增

  109. CustPropMgr.Add2 "项目编号", swCustomInfoText, finalProjectNumber

  110. CustPropMgr.Add2 "代号", swCustomInfoText, e

  111. CustPropMgr.Add2 "名称", swCustomInfoText, m



  112. End Sub
复制代码

作者: tantingshuai123    时间: 2024-9-26 22:20
好东西,努力学习学习!




欢迎光临 SolidWorks机械工程师网——最大的SolidWorks学习平台 (https://www.swbbsc.com/) Powered by Discuz! X3.2