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

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

  [复制链接]

39

主题

372

帖子

3086

金币

传奇

Rank: 8Rank: 8

积分
7781

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

楼主
发表于 2021-1-14 08:50:58 | 显示全部楼层
我用的是sw2019.sp5.0,之前是用历遍文件夹导execl的清单,没有问题,刚下了这个历遍装配体的,只出来一个表头就没有,不知道是什么原因,希望楼主帮忙解答一下!
SolidWorks机械工程师网
提示:建议使用谷歌浏览器浏览本网站!如单击这里下载!否则,可能无法下载附件文件!(支持大多数版本的谷歌浏览器,支持360和QQ浏览器的极速模式,即谷歌内核模式,使用IE和Edge浏览器,浏览个别网页以及下载文件时,会误报“***不安全”,此时需要单击“继续访问此不安全站点(不推荐)”才可以继续下载,另外,本网站不含任何不安全的文件,已联系微软公司解决,纯属IE和Edge浏览器误报)
回复 支持 反对

使用道具 举报

39

主题

372

帖子

3086

金币

传奇

Rank: 8Rank: 8

积分
7781

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

沙发
发表于 2021-1-18 14:32:44 | 显示全部楼层
Allate 发表于 2021-1-15 11:24
有没有跳出什么提示呢?如果没有提示信息我也无法判断。

就是没有任何提示,是不是sw版本不一样的原因,我的是sw2019-sp5.0,

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

使用道具 举报

39

主题

372

帖子

3086

金币

传奇

Rank: 8Rank: 8

积分
7781

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

板凳
发表于 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机械工程师网
回复 支持 反对

使用道具 举报

39

主题

372

帖子

3086

金币

传奇

Rank: 8Rank: 8

积分
7781

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

地板
发表于 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机械工程师网
回复 支持 反对

使用道具 举报

39

主题

372

帖子

3086

金币

传奇

Rank: 8Rank: 8

积分
7781

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

5#
发表于 2021-1-27 14:06:34 | 显示全部楼层

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



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

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

使用道具 举报

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

本版积分规则

关闭 卷起
关闭 卷起

手机版|小黑屋| GMT+8, 2024-5-6 17:53 , Processed in 0.261560 second(s), 31 queries .

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

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

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