找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 857|回复: 7

[VBA函数]:对扩展数据进行操作的函数

[复制链接]

已领礼包: 181个

财富等级: 日进斗金

发表于 2002-11-14 19:11:57 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

×
我编了两个函数,可以像属性操作那样方便的操作扩展数据。

  1.   [FONT=courier new]
  2. '获取扩展数据
  3. EntObj    包含扩展数据的对象
  4. Name     扩展数据的注册应用程序名称
  5. Tag        标签(唯一)
  6. Value     值
  7. Public Function GetXDataText(ByVal EntObj As AcadObject, ByVal Name As String, ByVal Tag As String) As String
  8.     Dim xdType As Variant
  9.     Dim xdData As Variant
  10.     Dim i As Integer
  11.     Dim temp As Variant
  12.    
  13.     On Error GoTo ErrTrap
  14.     If EntObj Is Nothing Then Exit Function
  15.     If Name = "" Or Tag = "" Then Exit Function
  16.     GetXDataText = ""
  17.     EntObj.GetXData Name, xdType, xdData
  18.     If Not IsEmpty(xdType) Then
  19.         For i = LBound(xdType) To UBound(xdType)
  20.             If xdData(i) <> "" Then
  21.                 temp = Split(xdData(i), "=", , vbTextCompare)
  22.                 If Not IsEmpty(temp) Then
  23.                     If StrComp(temp(0), Tag, vbTextCompare) = 0 Then
  24.                         If UBound(temp) >= 1 Then GetXDataText = temp(1)
  25.                         Exit For
  26.                     End If
  27.                 End If
  28.                 temp = Empty
  29.             End If
  30.         Next
  31.     End If
  32.     xdType = Empty
  33.     xdData = Empty
  34.     Exit Function
  35.    
  36. ErrTrap:
  37.     Debug.Print "GetXDataText: " & Err.Number & ", " & Err.Description
  38.     On Error GoTo 0
  39. End Function

  40. '设置扩展数据
  41. Public Sub SetXDataText(ByRef EntObj As AcadObject, ByVal Name As String, ByVal Tag As String, ByVal Text As String)
  42.     Dim xdType As Variant
  43.     Dim xdData As Variant
  44.     Dim i As Integer
  45.     Dim temp As Variant
  46.     Dim bExist As Boolean

  47.     On Error GoTo ErrTrap
  48.     If EntObj Is Nothing Then Exit Sub
  49.     If Name = "" Or Tag = "" Then Exit Sub
  50.     EntObj.GetXData Name, xdType, xdData
  51.     If Not IsEmpty(xdType) Then
  52.         For i = LBound(xdType) To UBound(xdType)
  53.             If xdData(i) <> "" Then
  54.                 temp = Split(xdData(i), "=", , vbTextCompare)
  55.                 If Not IsEmpty(temp) Then
  56.                     If StrComp(temp(0), Tag, vbTextCompare) = 0 Then
  57.                         bExist = True
  58.                         xdData(i) = Tag & "=" & Text
  59.                         EntObj.SetXData xdType, xdData
  60.                         Exit For
  61.                     End If
  62.                 End If
  63.                 temp = Empty
  64.             End If
  65.         Next
  66.         If bExist = False Then
  67.             temp = UBound(xdType) + 1
  68.             ReDim Preserve xdType(0 To temp)
  69.             ReDim Preserve xdData(0 To temp)
  70.             xdType(temp) = 1000
  71.             xdData(temp) = Tag & "=" & Text
  72.             EntObj.SetXData xdType, xdData
  73.             temp = Empty
  74.         End If
  75.     Else
  76.         ReDim xdType(0 To 1) As Integer
  77.         ReDim xdData(0 To 1) As Variant
  78.         xdType(0) = 1001
  79.         xdData(0) = Name
  80.         xdType(1) = 1000
  81.         xdData(1) = Tag & "=" & Text
  82.         EntObj.SetXData xdType, xdData
  83.     End If
  84.     xdType = Empty
  85.     xdData = Empty
  86.     Exit Sub
  87.    
  88. ErrTrap:
  89.     Debug.Print "SetXDataText: " & Err.Number & ", " & Err.Description
  90.     On Error GoTo 0
  91. End Sub
  92.   [/FONT]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2002-11-21 22:22:50 | 显示全部楼层
我正在发愁
split()
编译错误
子程序或函数未定义
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 181个

财富等级: 日进斗金

 楼主| 发表于 2002-11-22 08:54:07 | 显示全部楼层
忘了说明,Split只有在VBA6.0以上才有的。可以放在VB中,做一个动态链接库,以后直接调用就可以了。或者用R2002,它的VBA版本是6.0的。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 181个

财富等级: 日进斗金

 楼主| 发表于 2002-11-22 09:00:05 | 显示全部楼层
你可以用VB6.0为R2000版本中所没有的VBA函数做一个库,使用时只要引用就可以了,相当于扩充了CAD中VBA的功能。
附上一些例子。

  1.   [FONT=courier new]
  2. Public Enum VbTriState
  3.     vbFalse = 0
  4.     vbTrue = -1
  5.     vbUseDefault = -2
  6. End Enum

  7. Public Enum VbCompareMethod
  8.     vbBinaryCompare = 0
  9.     vbDatabaseCompare = 2
  10.     vbTextCompare = 1
  11. End Enum

  12. Public Function VBFilter(ByVal SourceArray As Variant, ByVal Match As String, Optional ByVal Include As Boolean = True, Optional ByVal Compare As VbCompareMethod = vbBinaryCompare)
  13.     VBFilter = ""
  14.     On Error GoTo ErrTrap
  15.     VBFilter = Filter(SourceArray, Match, Include, Compare)
  16.     Exit Function

  17. ErrTrap:
  18.     Debug.Print "VBFilter: " & Err.Number & ", " & Err.Description
  19.     On Error GoTo 0
  20. End Function

  21. Public Function VBFormatCurrency(ByVal Expression As Variant, Optional ByVal NumDigitsAfterDecimal As Long = -1, Optional ByVal IncludeLeadingDigit As VbTriState = vbUseDefault, Optional ByVal UseParensForNegativeNumbers As VbTriState = vbUseDefault, Optional ByVal GroupDigits As VbTriState = vbUseDefault) As String
  22.     VBFormatCurrency = ""
  23.     On Error GoTo ErrTrap
  24.     VBFormatCurrency = FormatCurrency(Expression, NumDigitsAfterDecimal, IncludeLeadingDigit, UseParensForNegativeNumbers, GroupDigits)
  25.     Exit Function

  26. ErrTrap:
  27.     Debug.Print "VBFormatCurrency: " & Err.Number & ", " & Err.Description
  28.     On Error GoTo 0
  29. End Function

  30. Public Function VBFormatDateTime(ByVal Expression As Variant, Optional ByVal NamedFormat As VbDateTimeFormat = vbGeneralDate) As String
  31.     VBFormatDateTime = ""
  32.     On Error GoTo ErrTrap
  33.     VBFormatDateTime = FormatDateTime(Expression, NamedFormat)
  34.     Exit Function

  35. ErrTrap:
  36.     Debug.Print "VBFormatDateTime: " & Err.Number & ", " & Err.Description
  37.     On Error GoTo 0
  38. End Function

  39. Public Function VBFormatNumber(ByVal Expression As Variant, Optional ByVal NumDigitsAfterDecimal As Long = -1, Optional ByVal IncludeLeadingDigit As VbTriState = vbUseDefault, Optional ByVal UseParensForNegativeNumbers As VbTriState = vbUseDefault, Optional ByVal GroupDigits As VbTriState = vbUseDefault) As String
  40.     VBFormatNumber = ""
  41.     On Error GoTo ErrTrap
  42.     VBFormatNumber = FormatNumber(Expression, NumDigitsAfterDecimal, IncludeLeadingDigit, UseParensForNegativeNumbers, GroupDigits)
  43.     Exit Function

  44. ErrTrap:
  45.     Debug.Print "VBFormatNumber: " & Err.Number & ", " & Err.Description
  46.     On Error GoTo 0
  47. End Function

  48. Public Function VBFormatPercent(ByVal Expression As Variant, Optional ByVal NumDigitsAfterDecimal As Long = -1, Optional ByVal IncludeLeadingDigit As VbTriState = vbUseDefault, Optional ByVal UseParensForNegativeNumbers As VbTriState = vbUseDefault, Optional ByVal GroupDigits As VbTriState = vbUseDefault) As String
  49.     VBFormatPercent = ""
  50.     On Error GoTo ErrTrap
  51.     VBFormatPercent = FormatPercent(Expression, NumDigitsAfterDecimal, IncludeLeadingDigit, UseParensForNegativeNumbers, GroupDigits)
  52.     Exit Function

  53. ErrTrap:
  54.     Debug.Print "VBFormatPercent: " & Err.Number & ", " & Err.Description
  55.     On Error GoTo 0
  56. End Function

  57. Public Function VBInStrRev(ByVal StringCheck As String, StringMatch As String, Optional ByVal Start As Long = -1, Optional ByVal Compare As VbCompareMethod = vbBinaryCompare) As Long
  58.     VBInStrRev = ""
  59.     On Error GoTo ErrTrap
  60.     VBInStrRev = InStrRev(StringCheck, StringMatch, Start, Compare)
  61.     Exit Function

  62. ErrTrap:
  63.     Debug.Print "VBInStrRev: " & Err.Number & ", " & Err.Description
  64.     On Error GoTo 0
  65. End Function

  66. Public Function VBJoin(ByVal SourceArray As Variant, Optional ByVal Delimiter As Variant) As String
  67.     VBJoin = ""
  68.     On Error GoTo ErrTrap
  69.     VBJoin = Join(SourceArray, Delimiter)
  70.     Exit Function

  71. ErrTrap:
  72.     Debug.Print "VBJoin: " & Err.Number & ", " & Err.Description
  73.     On Error GoTo 0
  74. End Function

  75. Public Function VBReplace(ByVal Expression As String, ByVal Find As String, ByVal ReplaceWith As String, Optional ByVal Start As Long = 1, Optional ByVal Count As Long = -1, Optional ByVal Compare As VbCompareMethod = vbBinaryCompare) As String
  76.     VBReplace = ""
  77.     On Error GoTo ErrTrap
  78.     VBReplace = Replace(Expression, Find, ReplaceWith, Start, Count, Compare)
  79.     Exit Function

  80. ErrTrap:
  81.     Debug.Print "VBReplace: " & Err.Number & ", " & Err.Description
  82.     On Error GoTo 0
  83. End Function

  84. Public Function VBRound(ByVal Number As Variant, Optional ByVal NumDigitsAfterDecimal As Long)
  85.     VBRound = ""
  86.     On Error GoTo ErrTrap
  87.     VBRound = Round(Number, NumDigitsAfterDecimal)
  88.     Exit Function

  89. ErrTrap:
  90.     Debug.Print "VBRound: " & Err.Number & ", " & Err.Description
  91.     On Error GoTo 0
  92. End Function

  93. Public Function VBSplit(ByVal Expression As String, Optional ByVal Delimiter As Variant, Optional ByVal Limit As Long = -1, Optional ByVal Compare As VbCompareMethod = vbBinaryCompare) As Variant
  94.     VBSplit = Empty
  95.     On Error GoTo ErrTrap
  96.     VBSplit = Split(Expression, Delimiter, Limit, Compare)
  97.     Exit Function

  98. ErrTrap:
  99.     Debug.Print "VBSplit: " & Err.Number & ", " & Err.Description
  100.     On Error GoTo 0
  101. End Function
  102.   [/FONT]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1261个

财富等级: 财源广进

发表于 2005-11-26 01:33:50 | 显示全部楼层
谢谢
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-11-26 17:34:43 | 显示全部楼层
正需要扩展数据进行操作的函数 。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-12-6 10:45:04 | 显示全部楼层
不知道怎么利用,我有一堆数据是利用扩展数据的
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-12-10 12:35:45 | 显示全部楼层
斑竹先生,怎样修改实体上的扩展数据?能给个编程示例吗?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-9-28 21:24 , Processed in 0.401908 second(s), 45 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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