需要使用VBA将值从autocad写入excel工作表
我在Autocad中使用VBA来计算图形中的块数。 通过互联网上的一些搜索和尝试,我成功地完成了以下代码,并计算了任何图形中的所有块,或按图层或选定的块需要使用VBA将值从autocad写入excel工作表,excel,vba,autocad,Excel,Vba,Autocad,我在Autocad中使用VBA来计算图形中的块数。 通过互联网上的一些搜索和尝试,我成功地完成了以下代码,并计算了任何图形中的所有块,或按图层或选定的块 Sub BlockCount_Test() dispBlockCount "COUNT_ALL" dispBlockCount "COUNT_BY_LAYER" dispBlockCount "COUNT_BY_FILTER" End Sub Sub dispBlockCount(ByVal strAction As
Sub BlockCount_Test()
dispBlockCount "COUNT_ALL"
dispBlockCount "COUNT_BY_LAYER"
dispBlockCount "COUNT_BY_FILTER"
End Sub
Sub dispBlockCount(ByVal strAction As String)
On Error Resume Next
Dim objBlkSet As AcadSelectionSet
Dim objBlkRef As AcadBlockReference
Dim strBlkNames() As String
Dim iGpCode(0) As Integer
Dim vDataVal(0) As Variant
Dim iSelMode As Integer
Dim iBlkCnt As Integer
iGpCode(0) = 0
vDataVal(0) = "INSERT"
iSelMode = 0 '|-- Selection Modes (0 = Select All, 1 = Select On Screen) --|
Set objBlkSet = getSelSet(iGpCode, vDataVal, iSelMode)
If objBlkSet.Count <> 0 Then
Select Case strAction
Case "COUNT_ALL"
ReDim strBlkNames(objBlkSet.Count - 1)
iBlkCnt = 0
For Each objBlkRef In objBlkSet
strBlkNames(iBlkCnt) = objBlkRef.Name
iBlkCnt = iBlkCnt + 1
Next
MsgBox getUniqBlockCount(strBlkNames), , "Count All"
Case "COUNT_BY_LAYER"
Dim objCadEnt As AcadEntity
Dim vBasePnt As Variant
ThisDrawing.Utility.GetEntity objCadEnt, vBasePnt, "Pick a block reference:"
If Err.Number <> 0 Then
MsgBox "No block references selected."
objBlkSet.Delete
Exit Sub
Else
If objCadEnt.ObjectName = "AcDbBlockReference" Then
Dim objCurBlkRef As AcadBlockReference
Dim strLyrName As String
iBlkCnt = 0
Set objCurBlkRef = objCadEnt
strLyrName = objCurBlkRef.Layer
For Each objBlkRef In objBlkSet
If StrComp(objBlkRef.Layer, strLyrName, vbTextCompare) = 0 Then
ReDim Preserve strBlkNames(iBlkCnt)
strBlkNames(iBlkCnt) = objBlkRef.Name
iBlkCnt = iBlkCnt + 1
End If
Next
MsgBox getUniqBlockCount(strBlkNames), , "Count by Layer"
Else
ThisDrawing.Utility.prompt "The selected object is not a block reference."
End If
End If
Case "COUNT_BY_FILTER"
Dim strFilter As String
iBlkCnt = 0
strFilter = ThisDrawing.Utility.GetString(False, "Enter a filter option:")
If strFilter <> "" Then
For Each objBlkRef In objBlkSet
If UCase(objBlkRef.Name) Like UCase(strFilter) Then
ReDim Preserve strBlkNames(iBlkCnt)
strBlkNames(iBlkCnt) = objBlkRef.Name
iBlkCnt = iBlkCnt + 1
End If
Next
MsgBox getUniqBlockCount(strBlkNames), , "Count by Filter"
Else
ThisDrawing.Utility.prompt "Search criteria should not be empty."
End If
Case Else
ThisDrawing.Utility.prompt "Invalid action mode."
End Select
Else
ThisDrawing.Utility.prompt "No block references were found."
End If
objBlkSet.Delete
If Err.Number <> 0 Then
ThisDrawing.Utility.prompt Err.Description
End If
End Sub
Function getSelSet(ByRef iGpCode() As Integer, vDataVal As Variant, iSelMode As Integer) As AcadSelectionSet
Dim objSSet As AcadSelectionSet
Set objSSet = ThisDrawing.SelectionSets.Add("EntSet")
Select Case iSelMode
Case 0
objSSet.Select acSelectionSetAll, , , iGpCode, vDataVal
Case 1
ReSelect:
objSSet.SelectOnScreen iGpCode, vDataVal
If objSSet.Count = 0 Then
Dim iURep As Integer
iURep = MsgBox("No entities selected, Do you want to select again?", _
vbYesNo, "Select Entity")
If iURep = 6 Then GoTo ReSelect
objSSet.Delete
Set getSelSet = Nothing
Exit Function
End If
Case Else
ThisDrawing.Utility.prompt "Invalid selection mode...."
End Select
Set getSelSet = objSSet
End Function
Function getUniqBlockCount(ByRef strBlkNames() As String) As String
Dim strUniqBlkNames() As String
Dim iBlkCount() As Integer
Dim iArIdx1, iArIdx2 As Integer
iArIdx1 = 0: iArIdx2 = 0
For iArIdx1 = LBound(strBlkNames) To UBound(strBlkNames)
If iArIdx1 = 0 Then
ReDim strUniqBlkNames(iArIdx2)
strUniqBlkNames(iArIdx2) = strBlkNames(iArIdx1)
iArIdx2 = iArIdx2 + 1
End If
Dim iUnqArIdx As Integer
Dim blUniq As Boolean
blUniq = True
For iUnqArIdx = LBound(strUniqBlkNames) To UBound(strUniqBlkNames)
If StrComp(strBlkNames(iArIdx1), strUniqBlkNames(iUnqArIdx), vbTextCompare) = 0 Then
blUniq = False
Exit For
End If
Next
If blUniq Then
ReDim Preserve strUniqBlkNames(iArIdx2)
strUniqBlkNames(iArIdx2) = strBlkNames(iArIdx1)
iArIdx2 = iArIdx2 + 1
End If
Next
iArIdx1 = 0: iArIdx2 = 0
For iArIdx1 = LBound(strUniqBlkNames) To UBound(strUniqBlkNames)
For iArIdx2 = LBound(strBlkNames) To UBound(strBlkNames)
If StrComp(strBlkNames(iArIdx2), strUniqBlkNames(iArIdx1), vbTextCompare) = 0 Then
ReDim Preserve iBlkCount(iArIdx1)
iBlkCount(iArIdx1) = iBlkCount(iArIdx1) + 1
End If
Next
Next
For iUnqArIdx = LBound(iBlkCount) To UBound(iBlkCount)
strUniqBlkNames(iUnqArIdx) = strUniqBlkNames(iUnqArIdx) & vbTab & vbTab & vbTab & iBlkCount(iUnqArIdx) & vbCrLf
Next
Dim strTitle, strBlkCount As String
strBlkCount = Join(strUniqBlkNames)
strTitle = "Block Name" & vbTab & vbTab & "Count" & vbCrLf
strTitle = strTitle & String(14, "-") & vbTab & vbTab & String(8, "-") & vbCrLf
getUniqBlockCount = strTitle & strBlkCount
End Function
Sub BlockCount\u Test()
dispBlockCount“全部计数”
dispBlockCount“按层计数”
dispBlockCount“按过滤器计数”
端接头
子dispBlockCount(ByVal strAction作为字符串)
出错时继续下一步
将Dim objBlkSet设置为AcadSelectionSet
尺寸objBlkRef作为AcadBlockReference
将strBlkNames()设置为字符串
将iGpCode(0)设置为整数
Dim vDataVal(0)作为变量
作为整数的Dim iSelMode
将iBlkCnt设置为整数
iGpCode(0)=0
vDataVal(0)=“插入”
iSelMode=0'|--选择模式(0=全部选择,1=在屏幕上选择)--|
Set objBlkSet=getSelSet(iGpCode、vDataVal、iSelMode)
如果objBlkSet.Count为0,则
选择案例策略
案例“全部计数”
ReDim strBlkNames(objBlkSet.Count-1)
iBlkCnt=0
对于objBlkSet中的每个objBlkRef
strBlkNames(iBlkCnt)=objBlkRef.Name
iBlkCnt=iBlkCnt+1
下一个
MsgBox getUniqBlockCount(strBlkNames),“全部计数”
案例“按层计数”
模糊的对象被视为不一致
Dim vBasePnt作为变型
ThisDrawing.Utility.GetEntity objCadEnt,vBasePnt,“拾取块参照:”
如果错误号为0,则
MsgBox“未选择块参照。”
objBlkSet.Delete
出口接头
其他的
如果objCadEnt.ObjectName=“AcDbBlockReference”,则
作为AcadBlockReference的Dim objCurBlkRef
作为字符串的Dim strLyrName
iBlkCnt=0
设置objCurBlkRef=objCadEnt
strLyrName=objCurBlkRef.Layer
对于objBlkSet中的每个objBlkRef
如果StrComp(objBlkRef.Layer、strLyrName、vbTextCompare)=0,则
ReDim保留strBlkNames(iBlkCnt)
strBlkNames(iBlkCnt)=objBlkRef.Name
iBlkCnt=iBlkCnt+1
如果结束
下一个
MsgBox getUniqBlockCount(strBlkNames),“按层计数”
其他的
ThisDrawing.Utility.prompt“选定对象不是块参照。”
如果结束
如果结束
案例“按过滤器计数”
作为字符串的Dim strFilter
iBlkCnt=0
strFilter=ThisDrawing.Utility.GetString(False,“输入过滤器选项:”)
如果是strFilter“”,则
对于objBlkSet中的每个objBlkRef
如果UCase(objBlkRef.Name)与UCase(strFilter)类似,那么
ReDim保留strBlkNames(iBlkCnt)
strBlkNames(iBlkCnt)=objBlkRef.Name
iBlkCnt=iBlkCnt+1
如果结束
下一个
MsgBox getUniqBlockCount(strBlkNames),“按筛选器计数”
其他的
ThisDrawing.Utility.prompt“搜索条件不应为空。”
如果结束
其他情况
ThisDrawing.Utility.prompt“操作模式无效。”
结束选择
其他的
ThisDrawing.Utility.prompt“未找到块参照。”
如果结束
objBlkSet.Delete
如果错误号为0,则
ThisDrawing.Utility.prompt错误说明
如果结束
端接头
函数getSelSet(ByRef iGpCode()为整数,vDataVal为变量,iSelMode为整数)为AcadSelectionSet
Dim objSSet为AcadSelectionSet
Set objSSet=ThisDrawing.SelectionSets.Add(“EntSet”)
选择案例iSelMode
案例0
对象集。选择acSelectionSetAll、iGpCode、vDataVal
案例1
重新选择:
objSSet.SelectOnScreen iGpCode,vDataVal
如果objSSet.Count=0,则
作为整数的Dim iURep
iURep=MsgBox(“未选择任何实体,是否要再次选择?”_
vbYesNo,“选择实体”)
如果iURep=6,则转到重新选择
objSSet.Delete
Set getSelSet=Nothing
退出功能
如果结束
其他情况
ThisDrawing.Utility.prompt“选择模式无效…”
结束选择
Set getSelSet=objSSet
端函数
函数getUniqBlockCount(ByRef strBlkNames()作为字符串)作为字符串
Dim strUniqBlkNames()作为字符串
Dim iBlkCount()为整数
尺寸iArIdx1,iArIdx2为整数
iArIdx1=0:iArIdx2=0
对于iArIdx1=LBound(strBlkNames)到UBound(strBlkNames)
如果iArIdx1=0,则
ReDim strUniqBlkNames(iArIdx2)
strUniqBlkNames(iArIdx2)=strBlkNames(iArIdx1)
iArIdx2=iArIdx2+1
如果结束
Dim iUnqArIdx作为整数
Dim blUniq为布尔型
blUniq=True
对于iUnqArIdx=LBound(strUniqBlkNames)到UBound(strUniqBlkNames)
如果StrComp(strBlkNames(iArIdx1)、strUniqBlkNames(iUnqArIdx)、vbTextCompare)=0,则
blUniq=False
退出
如果结束
下一个
如果是布伦里克的话
ReDim Preserve strUniqBlkNames(iArIdx2)
strUniqBlkNames(iArIdx2)=strBlkNames(iArIdx1)
iArIdx2=iArIdx2+1
如果结束
下一个
iArIdx1=0:iArIdx2=0
对于iArIdx1=LBound(strUniqBlkNames)到UBound(strUniqBlkNames)
对于iArIdx2=LBound(strBlkNames)到UBound(strBlkNames)
如果StrComp(strBlkNames(iArIdx2)、strUniqBlkNames(iArIdx1)、vbTextCompare)=0,则
ReDim保存iBlkCount(iArIdx1)
iBlkCount(iArIdx1)=iBlkCount(iArIdx1)+1
如果结束
下一个
下一个
对于iUnqArIdx=LBound(iBlkCount)到UBound(iBlkCount)
strUniqBlkNames(iUnqArIdx)=strUniqBlkNames(iUnqArIdx)&vbTab&vbTab&vbTab&iBlkCount(iUnqArIdx)&vbCrLf
下一个
Dim strTitle,strBlkCount作为字符串
strBlkCount=Join(strUniqBlkNames)
strTitle=“Block Name”&vbTab&vbTab&“Count”&vbCrLf
strTitle=strTitle&String(14“-”)和vbTab&vbTab&String(8“-”)和vbCrLf
getUniqBlockCount=strTitle和strBlkCount
端函数
我的目标是获取这些块编号,并将它们自动插入excel工作表、特定工作表和单元格中。
有人能帮我找到解决这个问题的办法吗?
我设法调用了一个excel工作表,但我目前不知道如何将块计数放在正确的位置。
i、 假设我想把它们列在一个列表中,因为它们出现在我从代码中的计数中得到的表上,我如何才能做到这一点<
Dim oApp_Excel as Excel.Application
Dim oBook as Excel.workbook
Set oApp_Excel = CreateObject("EXCEL.APPLICATION")
set oBook = oApp_Excel.workbooks.add
oBook.sheets("<Name>").cells(<Counter>, <Column_Number>).value = <BlockNr (based on counter)>
oBook.SaveAs(<Path>)
oBook.close
oApp_Excel.quit
set oBook = nothing
If err <> 0 Then
MsgBox "Could not start Excel!", vbExclamation, "Warning"
End
Else
excelApp.Visible = True
excelApp.ScreenUpdating = False
'Add a new workbook and set the objects.
Set wkbObj = excelApp.Workbooks.Add(1)
Set shtObj = excelApp.Worksheets(1)
shtObj.Name = "Measured Polylines"
With shtObj.Range("A1:D1")
.Font.Bold = True
.Autofilter
End With