机械社区

 找回密码
 注册会员

QQ登录

只需一步,快速开始

搜索
楼主: 醉生梦

solidworks 批量执行宏

[复制链接]
发表于 2021-7-15 19:53:30 | 显示全部楼层
观摩一下
回复

使用道具 举报

发表于 2021-9-29 15:35:14 | 显示全部楼层
有个使用场景,现在我使用的图号分离宏需要打开零件才能进行属性修改,每次在装配体里多修改几个零件名称或者新做零件就会忘了改属性,如果可以批量打开零件,然后中间插入执行图号分离宏的工具执行,就可以自动帮我一次性修改零件属性了(但是俺不会写,有没有大佬帮帮忙呜呜呜)
回复 支持 反对

使用道具 举报

发表于 2021-11-28 10:05:46 | 显示全部楼层
Dim swApp As Object, v$ q( {* D6 l! _! T( j
Dim Part As Object: [8 y4 u5 B& M4 D# }; H9 g; ~4 H* V
Dim sldPath As String, D3 ?5 ]; A" M3 R

/ z* h2 @! r) U) S5 U. LDim boolstatus As Boolean
0 w' n# K& \1 h/ O9 TDim longstatus As Long, longwarnings As Long
. D0 }) Q2 C  l6 Q/ Y; {; a6 c& B+ @9 X

+ V  A" p, N5 D, G0 j& }! x) ^
' O. [- o9 e2 X" Z0 k; ~4 ?$ H9 D: p+ a( X/ l
Sub Test()0 ^) ^. @& a6 l2 h1 {- I7 A( N
Set swApp = Application.SldWorks( e+ i2 e# x" c" ^
sldPath = "C:\Users\kbisi\Desktop\实验\" '设定目录1 U4 R& `, p7 o$ D( k/ Z- C+ p

! H" g' c  m, r) y3 ]swFileName = Dir(sldPath & "*.sld*")  '搜寻首个零件档案名称
! k: R+ p/ b4 H) B& GIf UCase(Right(swFileName, 3)) = "PRT" Then swFileTYpe = 12 J% Z5 m/ t) u
If UCase(Right(swFileName, 3)) = "ASM" Then swFileTYpe = 2
% Y. v( Y+ G) Y% w" @, r* x- t' q( d
Do While swFileName <> ""
' n; N, J" ~& \5 V  i
: m! Z7 d9 o! f4 _Set swApp = Application.SldWorks
  g, |& W" |; S& m$ E' p0 O
/ \  \& s& Y1 L. g6 X0 u8 u/ x/ e'Set swDoc = swApp.OpenDoc(sldPath & swFileName, swFileTYpe) '开启零件% o' {4 |" w. O

! L5 C* q8 B4 o( J% DSet swModel = swApp.OpenDoc6(sldPath & swFileName, swFileTYpe, swOpenDocOptions_Silent, "", longstatus, longwarnings)
8 x, }: J8 W* E* m9 ~! p+ u! h( J& }6 m3 w: y7 \/ t

5 u6 w- ?- N" H, `) G" k$ ~3 H8 o5 ^; `4 ?6 i

- j& V+ F" |/ C1 n' B$ H7 F! l
) A  X% i2 c9 K0 t1 k6 ~2 h) m3 s- YSet Part = swApp.ActiveDoc
+ Q) K( G: U4 A, D  {9 z
+ S- w. V- u9 C, A% U. XCall plmain
4 {' F& J' `0 ^( J7 {( ]) h$ l  X6 i* K3 X! Q; `+ x

) |! u" ]) k  E" A6 @'
7 X) P# {8 C! u2 C: s# |5 ?1 ]% i2 G
+ [7 U. B+ b$ W% e4 Z# c, ~

& z) h/ Q2 R0 ~+ [* i' M" c* K5 `Part.Save '保存%/ J% |- s7 S8 y1 e( E
swApp.CloseDoc (swFileName) '关闭零件4 r# k* v3 B; `

- C% X0 Z2 R0 J* j6 q+ c, {If swFileName = "" Then Exit Do5 w. P% y2 ?- q2 x8 _

* f' c. r/ f0 [# F) H( ~
0 }( k* Q* H, b2 z6 E- Y  i" ?8 a9 xswFileName = Dir '搜寻下一个零件档案名称0
) f  T8 ^* O8 F8 b, [3 @( y; e& w8 j
Loop '循环搜寻
0 r- p1 @: P: `; l8 I9 ]& J6 nEnd Sub
( ], p# d& _4 E( W2 K( g0 x  j/ o按F8一行看程序错误为什么老是跳过Then swFileTYpe = 2
回复 支持 反对

使用道具 举报

发表于 2021-11-28 10:06:58 | 显示全部楼层
Dim swApp As Object: F. [7 G& ]1 D& N4 l
Dim Part As Object' u6 J( I+ L5 A0 o% V! P7 ~
Dim sldPath As String1 }* a$ a5 }  X

+ h1 J- f, K; J* S: S8 ^Dim boolstatus As Boolean5 H; p+ K/ K0 Q* S
Dim longstatus As Long, longwarnings As Long
9 [& t9 q% q7 |* F, {4 ~, f  d% c, ]! J, A- ?  U
  ?, ^# C3 a, ^% k0 t
' P( y& {" R0 P

  }& B& S: ]- f2 `+ w1 ZSub Test()% t; X: n6 h! O/ H- R+ f
Set swApp = Application.SldWorks/ s2 h/ w& C6 ^, T
sldPath = "C:\Users\kbisi\Desktop\实验\" '设定目录' _/ z, x! R; y* z; w
9 ~. d' R: i; ^! F$ W/ l* I
swFileName = Dir(sldPath & "*.sld*")  '搜寻首个零件档案名称9 k' q* v3 ^. [  t. @3 K+ L: c
If UCase(Right(swFileName, 3)) = "PRT" Then swFileTYpe = 1
+ I' Q+ ~0 t- {- [" YIf UCase(Right(swFileName, 3)) = "ASM" Then swFileTYpe = 2' n6 B6 I$ v: W; t  R
6 Q9 Y+ Z/ h* q9 ?5 S
Do While swFileName <> ""! J& I. U/ J  H4 b" o6 P$ `2 s" I1 O
6 I' r: X0 m3 [/ L
Set swApp = Application.SldWorks
# C0 B  T6 A# G" t: J
  i0 ^& E6 ~7 h& M" D& }! t'Set swDoc = swApp.OpenDoc(sldPath & swFileName, swFileTYpe) '开启零件1 X. R4 g$ g) D! N# ^% Z
- `% I: W! W5 Q6 y' }  \
Set swModel = swApp.OpenDoc6(sldPath & swFileName, swFileTYpe, swOpenDocOptions_Silent, "", longstatus, longwarnings)
$ G, `# a! R" W
$ @0 b, K6 P: C$ r0 y$ S; P4 w, a
7 R+ e; ~  k- Z- g- X% r8 R+ e6 _" s) z$ l4 N1 o. f$ E. M

- c) J: K2 t1 H, N' ^, O+ e  G3 P# b! M( S: ^
Set Part = swApp.ActiveDoc
$ B% Y$ z; Q# Z  b. Z) R$ L1 D  l+ m6 P' D
Call plmain  M+ g& h9 i# ?2 w  V
. u& g- `/ g4 C: V

, m# E; D9 C& n5 V'$ D: j2 q- t5 l( c  t# m+ n5 N- M
9 n  t" Z) C- Z7 C" i! p; W& P* Z
2 ^0 }8 j" Z9 ~+ ^$ z2 r/ o8 R  M

' n- F8 j  o: `+ Q0 ePart.Save '保存%
& t: ?; C& d3 y: w# U& g) S. [% DswApp.CloseDoc (swFileName) '关闭零件
1 |; _3 P) @# Y: f* z+ s
9 L+ F4 L6 P( l: ~$ H6 TIf swFileName = "" Then Exit Do
6 e! f$ Z9 ^; o& S) \2 D" X% q$ c2 s0 q3 R; f
1 v# J. P, p/ i, |- R$ z4 |' R3 W
swFileName = Dir '搜寻下一个零件档案名称0
0 p2 R" F, s1 I; S  F4 f
. X8 G" x8 [& m% Q7 D$ s) xLoop '循环搜寻8 t4 u$ ]) G% r! @3 J: r
End Sub
回复 支持 反对

使用道具 举报

发表于 2021-11-28 10:12:10 | 显示全部楼层
Dim swApp As Object8 l& ]* i$ x- z; P) u# Q' Q
Dim Part As Object3 A2 j* R6 i0 Q" G7 ^/ p4 Y5 \
Dim sldPath As String
  b. _! B1 I/ o) |* XDim boolstatus As Boolean
0 @+ w2 s9 J2 PDim longstatus As Long, longwarnings As Long
* ]1 p/ n$ k, V$ Z6 W7 nSub Test()
/ Y8 @( r" I/ n( _. mSet swApp = Application.SldWorks# G; ]3 b; P3 z% _$ u% K$ g8 ^
sldPath = "C:\Users\kbisi\Desktop\实验\" '设定目录
8 u# p+ k2 h' I0 b5 n5 dswFileName = Dir(sldPath & "*.sld*")  '搜寻首个零件档案名称6 V- C, u% `2 z4 |6 f# ?4 p
If UCase(Right(swFileName, 3)) = "PRT" Then swFileTYpe = 19 ~! i7 d3 W2 E: |% I( X6 \/ Y
If UCase(Right(swFileName, 3)) = "ASM" Then swFileTYpe = 2
- {+ P6 P) K8 I& B" U% u/ VDo While swFileName <> ""
( ?4 n' g: _: N2 D" Z! }Set swApp = Application.SldWorks
" m' p3 M; T5 B: a$ \# Q1 V'Set swDoc = swApp.OpenDoc(sldPath & swFileName, swFileTYpe) '开启零件
) v& o# O/ K( W) f4 E* F# LSet swModel = swApp.OpenDoc6(sldPath & swFileName, swFileTYpe, swOpenDocOptions_Silent, "", longstatus, longwarnings)6 p; j! @  U6 w3 }- i
Set Part = swApp.ActiveDoc
  q7 e; ]0 K, J  FCall plmain
5 S+ ^  b+ r& u4 h% PPart.Save '保存%6 t& L) i0 p0 }' u# N2 d
swApp.CloseDoc (swFileName) '关闭零件/ P. l0 [3 A+ f: ^- y* e3 O) v$ X
If swFileName = "" Then Exit Do
# k: R% v( b2 LswFileName = Dir '搜寻下一个零件档案名称04 ^9 c, W  X- Q: X8 o: e5 H! j
Loop '循环搜寻" v5 J3 X0 F( R; K
End Sub   老是被跳过
回复 支持 反对

使用道具 举报

发表于 2021-11-28 13:44:09 | 显示全部楼层
kbisi 发表于 2021-11-28 10:052 E, |" R  d- L
Dim swApp As Object' X; e7 G; E. J  |# J0 v3 Z
Dim Part As Object9 C  V- q) N: A# T+ n- H6 q6 }
Dim sldPath As String

1 p' w" b( E& a9 o& n希望可以得到解答6 v4 V% H& Z- p' D2 l% n/ \( u
回复 支持 反对

使用道具 举报

发表于 2021-11-28 13:45:15 | 显示全部楼层
kbisi 发表于 2021-11-28 10:05
5 }8 ^; }# `8 ~5 T) N* yDim swApp As Object/ c1 J' p; `: R; |$ v' v5 z
Dim Part As Object: Z, w& D7 _+ f
Dim sldPath As String

: Y! _7 k6 r, ]1 c' t& c) ?和楼主一样打不开装配体
) Z  D2 F4 z5 c7 O1 J$ }: f. y
回复 支持 反对

使用道具 举报

发表于 2022-2-10 23:22:01 | 显示全部楼层
多少积分可以分享
回复 支持 反对

使用道具 举报

发表于 2022-2-18 10:31:55 | 显示全部楼层
kbisi 发表于 2021-11-28 13:44' ?" h3 R6 j1 G
希望可以得到解答
- A# }: K% K0 t& |
无法打开装配体文件,是因为你把文件类型判定的语句放在循环外了,挪到do...loop内即可,那个call语句调用了什么?用不上可以先屏蔽。
5 H6 O' C0 h; P; J# T+ j* w( @经过测试,下面的程序可正常打开零件和装配体
1 D: `  C: B2 N! ^) a
7 }# ]9 a+ ]- o7 K/ T' ******************************************************************************
/ D1 K# k8 z8 c' 读取指定目录下的Prt/asm文件,关闭1 a& Y) r$ f7 B) Z: c
' ******************************************************************************
2 T" [8 ?6 h! w$ SDim swApp As Object$ F* l$ m( j- c) G7 Y5 j. _3 S

, _6 U* A# n& T; Z3 N# ODim Part As Object
; h3 a9 Q/ [- m: z* n  iDim boolstatus As Boolean
4 X3 M, _- z4 B2 QDim longstatus As Long, longwarnings As Long9 s, }; B7 l1 k3 J- ~+ \4 G0 I* b
'Dim sldPath As String
* O( _' P" u( R. B% c- IConst sldPath As String = "E:\3Dtest\BOM1\"  '设定目录
! v6 S. Z  z: h4 f
+ o, h  }3 ^4 Q2 R$ ]2 TSub main()! |7 j; c. t0 i& R" ?  V8 m. P6 N
, L1 [8 d! X1 \1 e. m
    Set swApp = _
7 j- f  s9 `2 {, R/ G    Application.SldWorks' g6 A8 }$ V  k7 e& h' n# E2 c
    Set Part = swApp.ActiveDoc
; x! o1 F/ ~5 z        ; F1 V! H. h+ ^$ P
    swFileName = Dir(sldPath & "*.sld*") - w% N2 s) C' ?3 ^
; R( Y5 N! m8 u8 q# I
    Do While swFileName <> ""
% C7 O2 q3 p* n0 l% T* a        Set swApp = Application.SldWorks
/ }4 a$ T/ X; D4 L8 D5 N        If UCase(Right(swFileName, 3)) = "PRT" Then swFileTYpe = 1
% r% J# z0 o, E8 `! Z        If UCase(Right(swFileName, 3)) = "ASM" Then swFileTYpe = 2, ^/ O9 _$ X, E9 W

4 H" c- f% s* z0 D7 h% ?        Set swModel = swApp.OpenDoc6(sldPath & swFileName, swFileTYpe, swOpenDocOptions_Silent, "", longstatus, longwarnings)
+ ~% z+ T' c- _0 }3 h' C4 Q- T  ^4 a        Set Part = swApp.ActiveDoc/ ]& W- q* H' Q' D6 r3 q
        'Call plmain
! d, q* p9 n4 E% J        'Part.Save '保存' ?5 y' w. b) G  O9 w8 J: F) Q! W
        swApp.CloseDoc (swFileName) '关闭零件
0 X' W8 ^7 Q1 ^7 k0 l" L, k# \. r        If swFileName = "" Then Exit Do:
: l; W5 J3 M1 D; ?6 ?5 p        swFileName = Dir '搜寻下一个零件档案名称8 n: K5 y4 d! @+ f" @
    Loop '循环搜寻
$ h0 A" k0 H7 |/ P: M
6 K0 C! c% a* i, ?+ }2 eEnd Sub
- \3 f2 B; F" x9 @$ _5 b7 X$ b! Q4 p4 [9 T+ R) v$ s
! g5 y7 J3 e# r  w' ^1 M7 t  G
回复 支持 反对

使用道具 举报

发表于 2024-1-7 12:50:21 | 显示全部楼层
能提供你成功运行的一个代打为参考吗我的一直报错" @1 {2 p5 W: V. a2 W6 T1 o

, L0 R. D, R* H0 j' {; |
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

小黑屋|手机版|Archiver|机械社区 ( 京ICP备10217105号-1,京ICP证050210号,浙公网安备33038202004372号 )

GMT+8, 2025-5-1 14:18 , Processed in 0.055760 second(s), 14 queries , Gzip On.

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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