试试这个
- Option Explicit
- 'A custom type that holds the scale factors of the block.
- Private Type ScaleFactor
- X As Double
- Y As Double
- Z As Double
- End Type
- Sub InsertBlocks()
- '--------------------------------------------------------------------------------------------------------------------------
- 'Inserts blocks in AutoCAD using data - insertion point, block name/full path, scale factors, rotation angle - from Excel.
- 'Note that the block name or the block path must already exists, otherwise nothing will be inserted.
- 'The code uses late binding, so no reference to external AutoCAD (type) library is required.
- 'It goes without saying that AutoCAD must be installed at your computer before running this code.
-
- 'Written by: Christos Samaras
- 'Date: 21/04/2014
- 'e-mail: xristos.samaras@gmail.com
- 'site: http://www.myengineeringworld.net
- '--------------------------------------------------------------------------------------------------------------------------
-
- ' Define the block
-
- 'Declaring the necessary variables.
- Dim acadApp As Object
- Dim height As Double
- Dim acadDoc As Object
- Dim acadBlock As Object
- Dim attributeObj As Object
- Dim LastRow As Long
- Dim i As Long
- Dim InsertionPoint(0 To 2) As Double
- Dim BlockName As String
- Dim BlockScale As ScaleFactor
- Dim RotationAngle As Double
- Dim tag As String
- Dim value As String
- Dim prompt As String
- Dim varAttributes As Variant
- Dim varBlockProperties As Variant
- Dim Index As Variant
- Dim prop As Variant
- Dim propatr As Variant
-
-
- 'Activate the coordinates sheet and find the last row.
- With Sheets("Coordinates")
- .Activate
- LastRow = .Cells(.Rows.Count, "A").End(xlUp).Row
- End With
-
- 'Check if there are coordinates for at least one circle.
- If LastRow < 2 Then
- MsgBox "There are no coordinates for the insertion point!", vbCritical, "Insertion Point Error"
- Exit Sub
- End If
-
- 'Check if AutoCAD application is open. If is not opened create a new instance and make it visible.
- On Error Resume Next
- Set acadApp = GetObject(, "AutoCAD.Application")
- If acadApp Is Nothing Then
- Set acadApp = CreateObject("AutoCAD.Application")
- acadApp.Visible = True
- End If
-
- 'Check (again) if there is an AutoCAD object.
- If acadApp Is Nothing Then
- MsgBox "Sorry, it was impossible to start AutoCAD!", vbCritical, "AutoCAD Error"
- Exit Sub
- End If
- On Error GoTo 0
-
- 'If there is no active drawing create a new one.
- On Error Resume Next
- Set acadDoc = acadApp.ActiveDocument
- If acadDoc Is Nothing Then
- Set acadDoc = acadApp.Documents.Add
- End If
- On Error GoTo 0
- 'Check if the active space is paper space and change it to model space.
- If acadDoc.ActiveSpace = 0 Then '0 = acPaperSpace in early binding
- acadDoc.ActiveSpace = 1 '1 = acModelSpace in early binding
- End If
-
- On Error Resume Next
- 'Loop through all the rows and add the corresponding blocks in AutoCAD.
- With Sheets("Coordinates")
- For i = 2 To LastRow
-
-
- 'Set the block name.
- BlockName = .Range("D" & i).value
- 'If the block name is not empty, insert the block.
- If BlockName <> vbNullString Then
- 'Set the insertion point.
- InsertionPoint(0) = .Range("A" & i).value
- InsertionPoint(1) = .Range("B" & i).value
- InsertionPoint(2) = .Range("C" & i).value
-
-
- 'Initialize the optional parameters.
- BlockScale.X = 1
- BlockScale.Y = 1
- BlockScale.Z = 1
- RotationAngle = 0
-
-
- 'Add the block using the sheet data (insertion point, block name, scale factors and rotation angle).
- 'The 0.0174532925 is to convert degrees into radians.
-
-
- Set attributeObj = acadBlock.AddAttribute(height, _
- prompt, InsertionPoint, tag, value)
-
|