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

 找回密码
 立即注册

QQ登录

只需一步,快速开始

好品数字
好品数字
楼主: Allate
打印 上一主题 下一主题

【改良】批量获取自定义属性及缩略图保存到Excel的宏

  [复制链接]

39

主题

372

帖子

3078

金币

传奇

Rank: 8Rank: 8

积分
7761

最佳新人活跃会员热心会员宣传达人灌水之王突出贡献

41#
发表于 2021-1-18 16:06:58 | 只看该作者
Allate 发表于 2021-1-18 15:41
那你的表头能截图看看?
另外你说的历遍文件夹导execl的清单那个宏,可以的话给个链接吧。

图是用历遍装配体的,只出来表头,下面代码是历遍文件夹的,也是在论坛抄的,


Option Explicit

' 定义用户类型以减少#If VBA7语句的数量
' 不能删除他们...
Private Type LongPtr_T
#If VBA7 Then
    Value As LongPtr
    ' Compare automatically resized LongPtr to fixed size Long and LongLong
#Else
    Value As Long
#End If
End Type

' Win32数据类型. Different signatures for different versions of VBA
Private Type BROWSEINFO
#If VBA7 Then
    hWndOwner       As LongPtr
    pidlRoot        As LongPtr
    pszDisplayName  As Long
    lpszTitle       As String
    ulFlags         As Long
    lpfnCallback    As LongPtr
    lParam          As Long
    iImage          As Long
#Else
    hWndOwner As Long
    pidlRoot        As Long
    pszDisplayName  As Long
    lpszTitle       As String
    ulFlags         As Long
    lpfnCallback    As Long
    lParam          As Long
    iImage          As Long
#End If
End Type

Private Const MAX_PATH = 260
'Directories only
Private Const BIF_RETURNONLYFSDIRS = &H1&
'Windows 2000 (Shell32.dll 5.0) extended dialog
Private Const BIF_NEWDIALOGSTYLE = &H40
' show edit box
Private Const BIF_EDITBOX = &H10&

Private Const WM_USER = &H400
Private Const BFFM_INITIALIZED = 1
Private Const BFFM_SELCHANGED = 2
Private Const BFFM_SETSTATUSTEXTA = (WM_USER + 100)

Private Const BFFM_SETSELECTIONA = (WM_USER + 102)
Private Const BFFM_SETEXPANDED = (WM_USER + 16)

Private m_sDefaultFolder As String

Public Const SWP_NOMOVE = 2
Public Const SWP_NOSIZE = 1
Private Const SWP_NOZORDER = 4

Private Type RECT
    Left As Long
    Top As Long
    Right As Long
    Bottom As Long
End Type

' Win32 API declarations. Different signatures for different versions of VBA.
' Note the mandatory use of PtrSafe keyword in VBA7.
#If VBA7 Then
Private Declare PtrSafe Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hWnd As LongPtr, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Private Declare PtrSafe Function SHBrowseForFolder Lib "Shell32" (lpbi As BROWSEINFO) As Long
Private Declare PtrSafe Function SHGetPathFromIDList Lib "Shell32" (ByVal pidList As LongPtr, ByVal lpBuffer As String) As Long
Private Declare PtrSafe Sub CoTaskMemFree Lib "ole32" (ByVal hMem As LongPtr)
Private Declare PtrSafe Function SetWindowPos Lib "user32" (ByVal hWnd As LongPtr, _
                                       ByVal hWndInsertAfter As LongPtr, _
                                       ByVal x As Long, _
                                       ByVal y As Long, _
                                       ByVal cx As Long, _
                                       ByVal cy As Long, _
                                       ByVal wFlags As Long) As Long
Private Declare PtrSafe Function GetWindowRect Lib "user32.dll" (ByVal hWnd As LongPtr, lpRect As RECT) As Long

#Else
Private Declare PtrSafe Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Private Declare PtrSafe Function SHBrowseForFolder Lib "Shell32" (lpbi As BROWSEINFO) As Long
Private Declare PtrSafe Function SHGetPathFromIDList Lib "Shell32" (ByVal pidList As Long, ByVal lpBuffer As String) As Long
Private Declare PtrSafe Sub CoTaskMemFree Lib "ole32" (ByVal hMem As Long)
Private Declare PtrSafe Function SetWindowPos Lib "user32" (ByVal hWnd As Long, _
                                       ByVal hWndInsertAfter As Long, _
                                       ByVal x As Long, _
                                       ByVal y As Long, _
                                       ByVal cx As Long, _
                                       ByVal cy As Long, _
                                       ByVal wFlags As Long) As Long
Private Declare PtrSafe Function GetWindowRect Lib "user32.dll" (ByVal hWnd As Long, lpRect As RECT) As Long

#End If

Private lastKnownPosition As RECT
Private lockLastKnownPosition As Boolean

Public Function BrowseForFolder() As String
  Dim tBI         As BROWSEINFO
  Dim lngPIDL     As LongPtr_T
  Dim strPath     As String

  With tBI
    .lpszTitle = "选择一个要输出文件属性的文件夹."

    ' TO DO: Do you want the new UI? Or the initial selected folder visible when the dialog opens?
    ' Choose one of the following:
    '  New UI. Selected folder is probably out of view.
    .ulFlags = BIF_RETURNONLYFSDIRS Or BIF_NEWDIALOGSTYLE Or BIF_EDITBOX
    ' ... or ...
    ' Old UI. Selected folder is scrolled into view when dialog opens.
    '.ulFlags = .ulFlags = BIF_RETURNONLYFSDIRS
    ' ... or ...
    ' Old UI with edit box. Selected folder is scrolled into view when dialog opens.
    ' Focus defaults to the edit box making the selected folder less obvious in the tree.
    '.ulFlags = .ulFlags = BIF_RETURNONLYFSDIRS Or BIF_EDITBOX

    .lpfnCallback = GetAddress(AddressOf BrowseCallbackProc).Value
  End With

  lockLastKnownPosition = True
  lngPIDL.Value = SHBrowseForFolder(tBI)
  If (lngPIDL.Value <> 0) Then
    ' get path from ID list
    strPath = Space$(MAX_PATH)
    SHGetPathFromIDList lngPIDL.Value, strPath
    strPath = Left$(strPath, InStr(strPath, Chr$(0)) - 1)
    ' release list
    CoTaskMemFree lngPIDL.Value
  End If
  BrowseForFolder = strPath
End Function

' Callback function for Win32 API.
' Must conform to the expected method signature therefore cannot use our LongPtr_t
#If VBA7 Then
Private Function BrowseCallbackProc(ByVal hWnd As LongPtr, ByVal uMsg As Long, ByVal lParam As Long, ByVal lpData As Long) As Long
#Else
Private Function BrowseCallbackProc(ByVal hWnd As Long, ByVal uMsg As Long, ByVal lParam As Long, ByVal lpData As Long) As Long
#End If
        ' If dialog has been initialised, record its current location
        If Not lockLastKnownPosition Then
            GetWindowRect hWnd, lastKnownPosition
        End If

        Select Case uMsg
        Case BFFM_INITIALIZED
            ' Start recording the dialogs location
            lockLastKnownPosition = False

            If Len(m_sDefaultFolder) > 0 Then
                ' Move the dialog to the last recorded position
                SetWindowPos hWnd, 0, lastKnownPosition.Left, lastKnownPosition.Top, 0, 0, SWP_NOSIZE + SWP_NOZORDER
                ' Set the selected folder
                SendMessage hWnd, BFFM_SETSELECTIONA, True, ByVal m_sDefaultFolder
            End If
        Case BFFM_SELCHANGED
            SendMessage hWnd, BFFM_SETEXPANDED, True, ByVal m_sDefaultFolder

        End Select
End Function

' Workaround for syntax limitation of AddressOf. Can only use in a function call, not an assignment
#If VBA7 Then
Private Function GetAddress(nAddress As LongPtr) As LongPtr_T
#Else
Private Function GetAddress(nAddress As Long) As LongPtr_T
#End If
    Dim address As LongPtr_T
    address.Value = nAddress
    GetAddress = address
End Function


001.png
SolidWorks机械工程师网
提示:建议使用谷歌浏览器浏览本网站!如单击这里下载!否则,可能无法下载附件文件!(支持大多数版本的谷歌浏览器,支持360和QQ浏览器的极速模式,即谷歌内核模式,使用IE和Edge浏览器,浏览个别网页以及下载文件时,会误报“***不安全”,此时需要单击“继续访问此不安全站点(不推荐)”才可以继续下载,另外,本网站不含任何不安全的文件,已联系微软公司解决,纯属IE和Edge浏览器误报)
回复 支持 反对

使用道具 举报

39

主题

372

帖子

3078

金币

传奇

Rank: 8Rank: 8

积分
7761

最佳新人活跃会员热心会员宣传达人灌水之王突出贡献

42#
发表于 2021-1-18 16:36:43 | 只看该作者
Allate 发表于 2021-1-18 15:41
那你的表头能截图看看?
另外你说的历遍文件夹导execl的清单那个宏,可以的话给个链接吧。

https://www.swbbsc.com/thread-238103-1-2.html
图是历遍装配体,只出来表头的效果,

链接是历遍文件夹的,可以运行,就是垃圾零件文件太多了,也一起导出来,
另外还有两个个问题是,
1.零件配置有两个的,截图就有两个重叠一起,如果是画钣金的,都有一个平板配置在,导出来的表格都是平板图片压在默认成型图片,这样截图就没效果了。
2.截图是带边线上色,默认背景的,如果能改成白底,消除隐藏线的最好不过了,因为毕竟现在用的打印机大多都是黑白,这样打印才看得清楚。

001.png
SolidWorks机械工程师网
提示:建议使用谷歌浏览器浏览本网站!如单击这里下载!否则,可能无法下载附件文件!(支持大多数版本的谷歌浏览器,支持360和QQ浏览器的极速模式,即谷歌内核模式,使用IE和Edge浏览器,浏览个别网页以及下载文件时,会误报“***不安全”,此时需要单击“继续访问此不安全站点(不推荐)”才可以继续下载,另外,本网站不含任何不安全的文件,已联系微软公司解决,纯属IE和Edge浏览器误报)
回复 支持 反对

使用道具 举报

37

主题

990

帖子

1万

金币

版主

Rank: 7Rank: 7Rank: 7Rank: 7

积分
19509

最佳新人活跃会员热心会员宣传达人灌水之王突出贡献

43#
 楼主| 发表于 2021-1-18 17:27:58 | 只看该作者
tg000057 发表于 2021-1-18 14:32
就是没有任何提示,是不是sw版本不一样的原因,我的是sw2019-sp5.0,

原来两个贴都是你在回复我,真是 ...

你再下载一次,我更新过,看看有没有区别。
SolidWorks机械工程师网
回复 支持 反对

使用道具 举报

2

主题

1253

帖子

712

金币

传奇

Rank: 8Rank: 8

积分
5851

最佳新人活跃会员热心会员宣传达人灌水之王突出贡献

44#
发表于 2021-1-20 21:28:27 | 只看该作者
楼主辛苦了!
SolidWorks机械工程师网
回复 支持 反对

使用道具 举报

2

主题

1253

帖子

712

金币

传奇

Rank: 8Rank: 8

积分
5851

最佳新人活跃会员热心会员宣传达人灌水之王突出贡献

45#
发表于 2021-1-21 21:51:11 | 只看该作者

   经典案例图书
活到老学到老!
SolidWorks机械工程师网
回复 支持 反对

使用道具 举报

0

主题

12

帖子

9

金币

天使

Rank: 2Rank: 2

积分
68

最佳新人

46#
发表于 2021-1-21 23:47:12 | 只看该作者
谢谢分享!
SolidWorks机械工程师网
回复 支持 反对

使用道具 举报

0

主题

12

帖子

9

金币

天使

Rank: 2Rank: 2

积分
68

最佳新人

47#
发表于 2021-1-21 23:48:13 | 只看该作者

   经典案例图书
很不错,顶一下!
SolidWorks机械工程师网
回复 支持 反对

使用道具 举报

0

主题

13

帖子

13

金币

天使

Rank: 2Rank: 2

积分
54

最佳新人

48#
发表于 2021-1-22 00:04:14 | 只看该作者
SolidWorks机械工程师网,顶一下。
SolidWorks机械工程师网
回复 支持 反对

使用道具 举报

16

主题

1146

帖子

108

金币

传奇

Rank: 8Rank: 8

积分
5459

最佳新人活跃会员热心会员宣传达人灌水之王突出贡献

49#
发表于 2021-1-23 11:52:52 | 只看该作者
楼主不能提取特定属性,只能自定义属性!!
SolidWorks机械工程师网
回复 支持 反对

使用道具 举报

16

主题

1146

帖子

108

金币

传奇

Rank: 8Rank: 8

积分
5459

最佳新人活跃会员热心会员宣传达人灌水之王突出贡献

50#
发表于 2021-1-23 11:54:14 | 只看该作者
楼主不能提取特定属性,只能自定义属性!!
SolidWorks机械工程师网
回复 支持 反对

使用道具 举报

37

主题

990

帖子

1万

金币

版主

Rank: 7Rank: 7Rank: 7Rank: 7

积分
19509

最佳新人活跃会员热心会员宣传达人灌水之王突出贡献

51#
 楼主| 发表于 2021-1-25 08:22:36 | 只看该作者
liyuyin007 发表于 2021-1-23 11:54
楼主不能提取特定属性,只能自定义属性!!

你自己动手改动一下就好,方法见下图:

SolidWorks机械工程师网
回复 支持 反对

使用道具 举报

0

主题

365

帖子

53

金币

长老

Rank: 6Rank: 6Rank: 6

积分
1308

最佳新人活跃会员热心会员宣传达人灌水之王突出贡献

52#
发表于 2021-1-27 07:52:38 | 只看该作者
quanshouzhu 发表于 2020-12-10 12:09
付了金币无法下载没有权限是什么鬼?



感谢楼主分享,很不错!
SolidWorks机械工程师网
回复 支持 反对

使用道具 举报

39

主题

372

帖子

3078

金币

传奇

Rank: 8Rank: 8

积分
7761

最佳新人活跃会员热心会员宣传达人灌水之王突出贡献

53#
发表于 2021-1-27 14:06:34 | 只看该作者
楼主大大,我想问一下,这个路径这里字符去掉7个,是为什么。之前我和其他小伙伴一样,都是只出来一个表头就结束,一直想不通为什么,然后将它和原来历遍文件夹那个代码作对比,找出它们的不同点,一个个排除,这个是最笨的办法了,然后我msgbox FilePath 出来这个并不是我的完整路径,被删除了后面一段,才发现后面那个-7。然后我把-7去除,就完美运行了。所以,这个是不是并于电脑遍文件夹设置那里部份的?



然后,装配体零件不能轻化,否则读取不到。

01.png
SolidWorks机械工程师网
回复 支持 反对

使用道具 举报

37

主题

990

帖子

1万

金币

版主

Rank: 7Rank: 7Rank: 7Rank: 7

积分
19509

最佳新人活跃会员热心会员宣传达人灌水之王突出贡献

54#
 楼主| 发表于 2021-1-27 14:18:06 | 只看该作者
tg000057 发表于 2021-1-27 14:06
楼主大大,我想问一下,这个路径这里字符去掉7个,是为什么。之前我和其他小伙伴一样,都是只出来一个表头 ...

这个可能就是系统的差异了,大部分电脑上面用命令GetTitle都是不带后缀的,要另外用这个“-7”来去掉后缀——这里很明显你的这个GetTitle是带后缀名的,一开始我没注意到会有这个差异,失误了,多谢指出
P.S.附件已经重新更正
SolidWorks机械工程师网
回复 支持 反对

使用道具 举报

1

主题

206

帖子

2046

金币

传奇

Rank: 8Rank: 8

积分
6353

最佳新人活跃会员热心会员宣传达人灌水之王突出贡献

55#
发表于 2021-1-27 14:32:49 | 只看该作者
加入QQ群
参与讨论和学习

SolidWorks技术交流群

或扫描二维码加入

Allate 发表于 2021-1-27 14:18
这个可能就是系统的差异了,大部分电脑上面用命令GetTitle都是不带后缀的,要另外用这个“-7”来去掉后缀 ...

gettitle受系统是否显示扩展名的设置的影响。正是因为gettitle的这个不确定性,所以建议不用它,改用getpathname后再处理。
SolidWorks机械工程师网
回复 支持 反对

使用道具 举报

37

主题

990

帖子

1万

金币

版主

Rank: 7Rank: 7Rank: 7Rank: 7

积分
19509

最佳新人活跃会员热心会员宣传达人灌水之王突出贡献

56#
 楼主| 发表于 2021-1-27 15:14:02 | 只看该作者

   经典案例图书
xiaocake 发表于 2021-1-27 14:32
gettitle受系统是否显示扩展名的设置的影响。正是因为gettitle的这个不确定性,所以建议不用它,改用getp ...

是呢,正打算以后放弃这个API
SolidWorks机械工程师网
回复 支持 反对

使用道具 举报

0

主题

25

帖子

569

金币

长老

Rank: 6Rank: 6Rank: 6

积分
1360

最佳新人活跃会员宣传达人

57#
发表于 2021-2-5 14:05:49 | 只看该作者
加入QQ群
参与讨论和学习

SolidWorks技术交流群

或扫描二维码加入

谢谢分享,值得拥有
SolidWorks机械工程师网
回复 支持 反对

使用道具 举报

0

主题

94

帖子

201

金币

堂主

Rank: 4

积分
593

最佳新人活跃会员热心会员宣传达人

58#
发表于 2021-2-10 13:08:13 | 只看该作者

   经典案例图书
好东西,努力学习学习!
SolidWorks机械工程师网
回复 支持 反对

使用道具 举报

0

主题

94

帖子

201

金币

堂主

Rank: 4

积分
593

最佳新人活跃会员热心会员宣传达人

59#
发表于 2021-2-10 13:09:21 | 只看该作者

好东西,努力学习学习!
SolidWorks机械工程师网
回复 支持 反对

使用道具 举报

13

主题

33

帖子

9

金币

天使

Rank: 2Rank: 2

积分
151

最佳新人活跃会员宣传达人

60#
发表于 2021-2-11 10:46:21 | 只看该作者
我用win10自带的IE浏览器,下载正常。
请问:表格里的“名称”在零件里哪里输入?
SolidWorks机械工程师网
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭 卷起
关闭 卷起

手机版|小黑屋| GMT+8, 2024-4-27 11:20 , Processed in 0.204890 second(s), 30 queries .

SolidWorks机械工程师网 ( 鲁ICP备14025122号-2 ) 鲁公网安备 37028502190335号

声明:本网言论纯属发表者个人意见,与本网立场无关。
如涉版权,可发邮件: admin@swbbsc.com

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