You are on page 1of 5

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()

' 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

' tag = "STT"


' value = Range("E3")

height = 150

'Activate the coordinates sheet and find the last row.

With Sheets("AC-SDNL")

.Activate

LastRow = .Cells(.Rows.Count, "F").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("AC-SDNL")

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)

Set acadBlock = acadDoc.ModelSpace.InsertBlock(InsertionPoint, BlockName, BlockScale.X,


BlockScale.Y, BlockScale.Z, RotationAngle * 0.0174532925)

If acadBlock.HasAttributes Then

Dim j As Integer

Dim AttList As Variant

' Build a list of attributes for the current block.

AttList = acadBlock.GetAttributes

' Cycle throught the list of attributes.

For j = LBound(AttList) To UBound(AttList)

AttList(j).TextString = Cells(i, j + 5).Value

Next

End If

End If

Next i

End With

'Zoom in to the drawing area.


acadApp.ZoomExtents

'Release the objects.

Set acadBlock = Nothing

Set acadDoc = Nothing

Set acadApp = Nothing

End Sub

You might also like