需要使用VBA将值从autocad写入excel工作表

需要使用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

我在Autocad中使用VBA来计算图形中的块数。 通过互联网上的一些搜索和尝试,我成功地完成了以下代码,并计算了任何图形中的所有块,或按图层或选定的块

 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