ananiviv 发表于 2007-6-3 19:37:00

[求助]请进来看下这段VBA代码

<p>这段代码 我找到时 说明是可以将AUTOCAD中的属性块中的属性提取到Excel中<br/>我用的是AUTOCAD2007 打开VBA复制进去 然后工具-引用,把Microsoft&nbsp; Excel勾选上<br/>然后编译&nbsp;&nbsp; 光标停留在“mspace As Object”这句上 <br/>编译报错&nbsp; “成员已经存在于本对象模块派生出的对象模块中”<br/>然后小弟查了很久 也不知道 对不对 把mspace改成了myspace<br/>再编译就没有报错 通过了<br/>但是运行宏的时候 又报错“运行时错误429,ActiveX部件不能创建对象”<br/>请各位帮忙看一下 或者 高手可以指点一下小弟<br/>感激万分</p><p><br/>Public acad As Object<br/>Public mspace As Object<br/>Public excel As Object<br/>Public AcadRunning As Integer<br/>Public excelSheet As Object<br/>Sub Extract()<br/>&nbsp;&nbsp;&nbsp; Dim sheet As Object<br/>&nbsp;&nbsp;&nbsp; Dim shapes As Object<br/>&nbsp;&nbsp;&nbsp; Dim elem As Object<br/>&nbsp;&nbsp;&nbsp; Dim excel As Object<br/>&nbsp;&nbsp;&nbsp; Dim Max As Integer<br/>&nbsp;&nbsp;&nbsp; Dim Min As Integer<br/>&nbsp;&nbsp;&nbsp; Dim NoOfIndices As Integer<br/>&nbsp;&nbsp;&nbsp; Dim excelSheet As Object<br/>&nbsp;&nbsp;&nbsp; Dim RowNum As Integer<br/>&nbsp;&nbsp;&nbsp; Dim Array1 As Variant, Array2 As Variant<br/>&nbsp;&nbsp;&nbsp; Dim Count As Integer</p><p></p><p>&nbsp;&nbsp;&nbsp; Set excel = GetObject(, "Excel.Application")<br/>Set excelSheet = excel.Worksheets("sheet1")<br/>&nbsp;&nbsp;&nbsp;&nbsp; Dim Sh As Object, rngStart As Range<br/>&nbsp;&nbsp;&nbsp;&nbsp; If TypeName(ActiveSheet) &lt;&gt; "Worksheet" Then Exit Sub<br/>&nbsp;&nbsp;&nbsp;&nbsp; Set Sh1 = ExcelSheet1<br/>Set rngStart = Sh1.Range("A1")<br/>&nbsp;&nbsp;&nbsp; With rngStart.Rows(1)<br/>End With<br/>&nbsp;&nbsp;&nbsp; Set acad = Nothing<br/>&nbsp;&nbsp;&nbsp; On Error Resume Next<br/>&nbsp;&nbsp;&nbsp; Set acad = GetObject(, "AutoCAD.Application")<br/>&nbsp;&nbsp;&nbsp; If Err &lt;&gt; 0 Then<br/>&nbsp;&nbsp;&nbsp; Set acad = CreateObject("AutoCAD.Application")<br/>&nbsp;&nbsp;&nbsp; MsgBox "请打开 AutoCAD 图形文件!"<br/>&nbsp;&nbsp;&nbsp; Exit Sub<br/>&nbsp;&nbsp;&nbsp; End If</p><p>&nbsp;&nbsp;&nbsp; Set doc = acad.ActiveDocument<br/>&nbsp;&nbsp;&nbsp; Set mspace = doc.ModelSpace<br/>&nbsp;&nbsp;&nbsp; RowNum = 1<br/>&nbsp;&nbsp;&nbsp; Dim Header As Boolean<br/>&nbsp;&nbsp;&nbsp; Header = False<br/>&nbsp;&nbsp;&nbsp; For Each elem In mspace<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; With elem<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If StrComp(.EntityName, "AcDbBlockReference", 1) = 0 Then<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If .HasAttributes Then<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Array1 = .GetAttributes<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Array2 = .GetConstantAttributes<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; For Count = LBound(Array1) To UBound(Array1)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If Header = False Then<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If StrComp(Array1(Count).EntityName, "AcDbAttribute", 1) = 0 Then<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; excelSheet.Cells(RowNum, Count + 1).Value = Array1(Count).TagString<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; End If<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; End If<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Next Count<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; For Count = LBound(Array2) To UBound(Array2)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If Header = False Then<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If StrComp(Array2(Count).EntityName, "AcDbAttributeDefinition", 1) = 0 Then<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; excelSheet.Cells(RowNum, UBound(Array1) + 1 + Count + 1).Value = Array2(Count).TagString<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; End If<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; End If<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Next Count<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RowNum = RowNum + 1<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; For Count = LBound(Array1) To UBound(Array1)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; excelSheet.Cells(RowNum, Count + 1).Value = Array1(Count).TextString<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Next Count<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; For Count = LBound(Array2) To UBound(Array2)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; excelSheet.Cells(RowNum, UBound(Array1) + 1 + Count + 1).Value = Array2(Count).TextString<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Next Count<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Header = True<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; End If<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; End If<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; End With<br/>&nbsp;&nbsp;&nbsp; Next elem<br/>&nbsp;&nbsp;&nbsp; NumberOfAttributes = RowNum - 1<br/>&nbsp;&nbsp;&nbsp; If NumberOfAttributes &gt; 0 Then<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Worksheets("属性取出").Range("A1").Sort _<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; key1:=Worksheets("属性取出").Columns("A"), _<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Header:=xlGuess<br/>&nbsp;&nbsp;&nbsp; Else<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MsgBox "无法提出图形文件中的属性或此图形文件中无任何属性!"<br/>&nbsp;&nbsp;&nbsp; End If<br/>&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp; Set currentcell = Range("A2")<br/>&nbsp;&nbsp;&nbsp; Do While Not IsEmpty(currentcell)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Set nextCell = currentcell.Offset(1, 0)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If nextCell.Value = currentcell.Value Then<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Set TCell = currentcell.Offset(1, 3)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TCell.Value = TCell.Value + 1<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; currentcell.EntireRow.Delete<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; End If<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Set currentcell = nextCell<br/>&nbsp;&nbsp;&nbsp; Loop</p><p>&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp; Set acad = Nothing<br/>End Sub</p>

wenwengg 发表于 2007-6-5 15:08:00

<p>去掉这句Public mspace As Object</p>

ananiviv 发表于 2007-6-5 22:35:00

<p>已经尝试了 错误依然存在</p>

wenwengg 发表于 2007-6-7 08:05:00

<p>Sub Extract()<br/>&nbsp;&nbsp;&nbsp; Dim sheet As Object<br/>&nbsp;&nbsp;&nbsp; Dim shapes As Object<br/>&nbsp;&nbsp;&nbsp; Dim elem As Object<br/>&nbsp;&nbsp;&nbsp; Dim Excel As Object<br/>&nbsp;&nbsp;&nbsp; Dim Max As Integer<br/>&nbsp;&nbsp;&nbsp; Dim Min As Integer<br/>&nbsp;&nbsp;&nbsp; Dim NoOfIndices As Integer<br/>&nbsp;&nbsp;&nbsp; Dim ExcelSheet As Object<br/>&nbsp;&nbsp;&nbsp; Dim RowNum As Integer<br/>&nbsp;&nbsp;&nbsp; Dim Array1 As Variant<br/>&nbsp;&nbsp;&nbsp; Dim count As Integer<br/>&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp; Set Excel = GetObject(, "Excel.Application")<br/>'&nbsp;&nbsp;&nbsp; Worksheets("Sheet1").Activate<br/>&nbsp;&nbsp;&nbsp; Set ExcelSheet = Excel.ActiveWorkbook.Sheets("Sheet1")<br/>'&nbsp;&nbsp;&nbsp; ExcelSheet.Range(Cells(1, 1), Cells(1000, 100)).Clear<br/>'&nbsp;&nbsp;&nbsp; ExcelSheet.Range(Cells(1, 1), Cells(1, 100)).Font.Bold = True<br/>&nbsp;&nbsp;&nbsp; Set acad = Nothing<br/>&nbsp;&nbsp;&nbsp; On Error Resume Next<br/>&nbsp;&nbsp;&nbsp; Set acad = GetObject(, "AutoCAD.Application")<br/>&nbsp;&nbsp;&nbsp; If Err &lt;&gt; 0 Then<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Set acad = CreateObject("AutoCAD.Application")<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; acad.Visible = True<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MsgBox "Please open a drawing file and then restart this macro."<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Exit Sub<br/>&nbsp;&nbsp;&nbsp; End If<br/>&nbsp;&nbsp;&nbsp; Set doc = acad.ActiveDocument<br/>'&nbsp;&nbsp;&nbsp; Set mspace = doc.ModelSpace<br/>&nbsp;&nbsp;&nbsp; Set mspace = doc.PaperSpace<br/>&nbsp;&nbsp;&nbsp; RowNum = 1<br/>&nbsp;&nbsp;&nbsp; Dim Header As Boolean<br/>&nbsp;&nbsp;&nbsp; Header = False<br/>&nbsp;&nbsp;&nbsp; For Each elem In mspace<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; With elem<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If StrComp(.EntityName, "AcDbBlockReference", 1) = 0 Then<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If .HasAttributes Then<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Array1 = .GetAttributes<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; For count = LBound(Array1) To UBound(Array1)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If Header = False Then<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If StrComp(Array1(count).EntityName, "AcDbAttribute", 1) = 0 Then<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ExcelSheet.Cells(RowNum, count + 1).Value = Array1(count).TagString<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; End If<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; End If<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Next count<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RowNum = RowNum + 1<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; For count = LBound(Array1) To UBound(Array1)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ExcelSheet.Cells(RowNum, count + 1).Value = Array1(count).TextString<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Next count<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Header = True<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; End If<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; End If<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; End With<br/>&nbsp;&nbsp;&nbsp; Next elem<br/>&nbsp;&nbsp;&nbsp; NumberOfAttributes = RowNum - 1<br/>&nbsp;&nbsp;&nbsp; If NumberOfAttributes &gt; 0 Then<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Worksheets("Sheet1").Range("A1").Sort _<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Key1:=Worksheets("Sheet1").Columns("A"), _<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Header:=xlGuess<br/>&nbsp;&nbsp;&nbsp; Else<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MsgBox "No attributes found in the current drawing."<br/>&nbsp;&nbsp;&nbsp; End If<br/>&nbsp;&nbsp;&nbsp; Set acad = Nothing<br/>End Sub</p><p><br/></p>

yanjun_lyg 发表于 2007-6-7 23:38:00

<p>这段程序是用在Excel的VBA中,且要把 Set Sh1 = ExcelSheet1改为 Set Sh1 = ExcelSheet</p>
页: [1]
查看完整版本: [求助]请进来看下这段VBA代码