ducdudl2018 发表于 2022-7-6 20:29:57

你能分享你的代码吗??谢谢你

edmondsforum 发表于 2022-7-6 20:30:44

试试这个
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)
                        
                Set acadBlock = acadDoc.ModelSpace.InsertBlock(InsertionPoint, BlockName, _
                              BlockScale.X, BlockScale.Y, BlockScale.Z, RotationAngle * 0.0174532925)
                              
                varAttributes = acadBlock.GetAttributes
                varAttributes(0).TextString = .Range("E" & i).value
                varAttributes(1).TextString = .Range("F" & i).value
                varAttributes(2).TextString = .Range("G" & i).value
                varAttributes(3).TextString = .Range("H" & i).value
                varAttributes(4).TextString = .Range("I" & i).value


                              
            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



页: 1 [2]
查看完整版本: Excel到Autocad插入属性