efan2000 发表于 2004-2-11 19:31:00

Excel表格到CAD的示例程序

增加了一小部分注释,希望对大家有所帮助。Sub Test()
       On Error Resume Next      ' 连接Excel应用程序       Dim xlApp As Excel.Application
       Set xlApp = GetObject(, "Excel.Application")
       If Err Then
               MsgBox " Excel 应用程序没有运行。请启动 Excel 并重新运行程序。"
               Exit Sub
       End If
       Dim xlSheet As Worksheet
       Set xlSheet = xlApp.ActiveSheet       ' 当初考虑将表格做成块的方式,可以根据需要取舍。
       'Dim iPt(0 To 2) As Double
       'iPt(0) = 0: iPt(1) = 0: iPt(2) = 0
       Dim BlockObj As AcadBlock
       Set BlockObj = ThisDrawing.Blocks("*Model_Space")
       Dim iPt As Variant
       iPt = ThisDrawing.Utility.GetPoint(, "指定表格的插入点: ")
       If IsEmpty(iPt) Then Exit Sub
       Dim xlRange As Range
       Debug.Print xlSheet.UsedRange.Address
       For Each xlRange In xlSheet.UsedRange
               AddLine BlockObj, iPt, xlRange
               AddText BlockObj, iPt, xlRange
       Next
       Set xlRange = Nothing
       Set xlSheet = Nothing
       Set xlApp = Nothing
End Sub

'边框线条粗细
Function LineWidth(ByVal xlBorder As Border) As Double
       Select Case xlBorder.Weight
               Case xlThin
                     LineWidth = 0
               Case xlMedium
                     LineWidth = 0.35
               Case xlThick
                     LineWidth = 0.7
               Case Else
                     LineWidth = 0
       End Select
End Function

'边框线条颜色,处理的颜色不全,请自己添加
Function LineColor(ByVal xlBorder As Border) As Integer
       Select Case xlBorder.ColorIndex
               Case xlAutomatic
                     LineColor = acByLayer
               Case 3
                     LineColor = acRed
               Case 4
                     LineColor = acGreen
               Case 5
                     LineColor = acBlue
               Case 6
                     LineColor = acYellow
               Case 8
                     LineColor = acCyan
               Case 9
                     LineColor = acMagenta
               Case Else
                     LineColor = acByLayer
       End Select
End Function

'给制边框
Sub AddLine(ByRef BlockObj As AcadBlock, ByVal iPt As Variant, ByVal xlRange As Range)
       If xlRange.Borders(xlEdgeLeft).LineStyle = xlNone _
               And xlRange.Borders(xlEdgeBottom).LineStyle = xlNone _
               And xlRange.Borders(xlEdgeRight).LineStyle = xlNone _
               And xlRange.Borders(xlEdgeTop).LineStyle = xlNone Then Exit Sub
       Dim rl As Double
       Dim rt As Double
       Dim rw As Double
       Dim rh As Double
       rl = PToM(xlRange.Left)
       rt = PToM(xlRange.top)
       rw = PToM(xlRange.Width)
       rh = PToM(xlRange.Height)
       Dim pPt(0 To 3) As Double
       Dim pLineObj As AcadLWPolyline       ' 左边框的处理,仅第一列才做处理。
       If xlRange.Borders(xlEdgeLeft).LineStyle <> xlNone And xlRange.Column = 1 Then
               pPt(0) = iPt(0) + rl: pPt(1) = iPt(1) - rt
               pPt(2) = iPt(0) + rl: pPt(3) = iPt(1) - (rt + rh)
               Set pLineObj = BlockObj.AddLightWeightPolyline(pPt)
               pLineObj.ConstantWidth = LineWidth(xlRange.Borders(xlEdgeLeft))
               pLineObj.Color = LineColor(xlRange.Borders(xlEdgeLeft))
       End If       ' 下边框的处理,对于合并单元格,只处理最后一行。
       If xlRange.Borders(xlEdgeBottom).LineStyle <> xlNone And (xlRange.Row = xlRange.MergeArea.Row + xlRange.MergeArea.Rows.Count - 1) Then
               pPt(0) = iPt(0) + rl: pPt(1) = iPt(1) - (rt + rh)
               pPt(2) = iPt(0) + rl + rw: pPt(3) = iPt(1) - (rt + rh)
               Set pLineObj = BlockObj.AddLightWeightPolyline(pPt)
               pLineObj.ConstantWidth = LineWidth(xlRange.Borders(xlEdgeBottom))
               pLineObj.Color = LineColor(xlRange.Borders(xlEdgeBottom))
       End If       ' 右边框的处理,对于合并单元格,只处理最后一列。
       If xlRange.Borders(xlEdgeRight).LineStyle <> xlNone And (xlRange.Column >= xlRange.MergeArea.Column + xlRange.MergeArea.Columns.Count - 1) Then
               pPt(0) = iPt(0) + rl + rw: pPt(1) = iPt(1) - (rt + rh)
               pPt(2) = iPt(0) + rl + rw: pPt(3) = iPt(1) - rt
               Set pLineObj = BlockObj.AddLightWeightPolyline(pPt)
               pLineObj.ConstantWidth = LineWidth(xlRange.Borders(xlEdgeRight))
               pLineObj.Color = LineColor(xlRange.Borders(xlEdgeRight))
       End If       ' 上边框的处理,仅第一行才做处理。
       If xlRange.Borders(xlEdgeTop).LineStyle <> xlNone And xlRange.Row = 1 Then
               pPt(0) = iPt(0) + rl + rw: pPt(1) = iPt(1) - rt
               pPt(2) = iPt(0) + rl: pPt(3) = iPt(1) - rt
               Set pLineObj = BlockObj.AddLightWeightPolyline(pPt)
               pLineObj.ConstantWidth = LineWidth(xlRange.Borders(xlEdgeTop))
               pLineObj.Color = LineColor(xlRange.Borders(xlEdgeTop))
       End If
       Set pLineObj = Nothing
End Sub

'给制文本
Sub AddText(ByRef BlockObj As AcadBlock, ByVal InsertionPoint As Variant, ByVal xlRange As Range)
       If xlRange.Text = "" Then Exit Sub
       Dim rl As Double
       Dim rt As Double
       Dim rw As Double
       Dim rh As Double
       rl = PToM(xlRange.Left)
       rt = PToM(xlRange.top)
       rw = PToM(xlRange.MergeArea.Width)
       rh = PToM(xlRange.MergeArea.Height)
       Dim i As Integer
       Dim s As String
       For i = 1 To Len(xlRange.Text) '将EXCEL的换行符替换成\P,注如果是在R2002以上可使用Replace函数。
               If Asc(Mid(xlRange.Text, i, 1)) = 10 Then
                     s = s & "\P"
               Else
                     s = s & Mid(xlRange.Text, i, 1)
               End If
       Next
       Dim iPt(0 To 2) As Double
       iPt(0) = InsertionPoint(0) + rl: iPt(1) = InsertionPoint(1) - rt: iPt(2) = 0
       Dim mTextObj As AcadMText
       Set mTextObj = BlockObj.AddMText(iPt, rw, s)   '"{\f" & xlRange.Font.Name & ";" & s & "}")
       mTextObj.LineSpacingFactor = 0.75
       mTextObj.Height = PToM(xlRange.Font.Size)       ' 处理文字的对齐方式
       Dim tPt As Variant
       If xlRange.VerticalAlignment = xlTop And (xlRange.HorizontalAlignment = xlLeft Or xlRange.HorizontalAlignment = xlGeneral) Then
               mTextObj.AttachmentPoint = acAttachmentPointTopLeft
               tPt = iPt
       ElseIf xlRange.VerticalAlignment = xlTop And xlRange.HorizontalAlignment = xlCenter Then
               mTextObj.AttachmentPoint = acAttachmentPointTopCenter
               tPt = ThisDrawing.Utility.PolarPoint(iPt, 0, rw / 2)
       ElseIf xlRange.VerticalAlignment = xlTop And xlRange.HorizontalAlignment = xlRight Then
               mTextObj.AttachmentPoint = acAttachmentPointTopRight
               tPt = ThisDrawing.Utility.PolarPoint(iPt, 0, rw)
       ElseIf xlRange.VerticalAlignment = xlCenter And (xlRange.HorizontalAlignment = xlLeft _
                     Or xlRange.HorizontalAlignment = xlGeneral) Then
               mTextObj.AttachmentPoint = acAttachmentPointMiddleLeft
               tPt = ThisDrawing.Utility.PolarPoint(iPt, -1.5707963, rh / 2)
       ElseIf xlRange.VerticalAlignment = xlCenter And xlRange.HorizontalAlignment = xlCenter Then
               mTextObj.AttachmentPoint = acAttachmentPointMiddleCenter
               tPt = ThisDrawing.Utility.PolarPoint(iPt, -1.5707963, rh / 2)
               tPt = ThisDrawing.Utility.PolarPoint(tPt, 0, rw / 2)
       ElseIf xlRange.VerticalAlignment = xlCenter And xlRange.HorizontalAlignment = xlRight Then
               mTextObj.AttachmentPoint = acAttachmentPointMiddleRight
               tPt = ThisDrawing.Utility.PolarPoint(iPt, -1.5707963, rh / 2)
               tPt = ThisDrawing.Utility.PolarPoint(tPt, 0, rw / 2)
       ElseIf xlRange.VerticalAlignment = xlBottom And (xlRange.HorizontalAlignment = xlLeft _
                     Or xlRange.HorizontalAlignment = xlGeneral) Then
               mTextObj.AttachmentPoint = acAttachmentPointBottomLeft
               tPt = ThisDrawing.Utility.PolarPoint(iPt, -1.5707963, rh)
       ElseIf xlRange.VerticalAlignment = xlBottom And xlRange.HorizontalAlignment = xlCenter Then
               mTextObj.AttachmentPoint = acAttachmentPointBottomCenter
               tPt = ThisDrawing.Utility.PolarPoint(iPt, -1.5707963, rh)
               tPt = ThisDrawing.Utility.PolarPoint(tPt, 0, rw / 2)
       ElseIf xlRange.VerticalAlignment = xlBottom And xlRange.HorizontalAlignment = xlRight Then
               mTextObj.AttachmentPoint = acAttachmentPointBottomRight
               tPt = ThisDrawing.Utility.PolarPoint(iPt, -1.5707963, rh)
               tPt = ThisDrawing.Utility.PolarPoint(tPt, 0, rw)
       End If
       mTextObj.InsertionPoint = tPt
       Set mTextObj = Nothing
End Sub

' 磅换算成毫米' 注:意义不大,转换的尺寸有偏差,最好自己设定一个转换规则。
Function PToM(ByVal Points As Double) As Double
       PToM = Points * 0.3527778
End Function

hzyhzjjzh 发表于 2022-4-7 13:08:25

谢谢楼主分享!{:1_1:}

sdjnrc 发表于 2004-2-20 13:25:00

坚决支持,虽然看不太懂

efan2000 发表于 2004-2-25 21:56:00

表格处理模块详细设计作者:efan2000         
                                                   
模块设计说明模块概述
产生背景:AutoCAD表格绘制、工程计算的功能十分的薄弱,但实际应用中,这两项功能是不可缺少的,因而,需要一种简便的方法来弥补这种缺陷。Excel是表格处理软件,带有强大的计算功能,而且开发方便,正好可以利用。因此,就可以通过Excel计算、制表,然后转化到AutoCAD来实现AutoCAD表格的生成。
平台环境:Excel、AutoCAD、VBA。
技术介绍:使用VBA,采用OLE方式对Excel、AutoCAD进行二次开发,实现功能的扩充。
功能说明:1、表格的边框处理模块:如边框的线型、颜色、线重等。
                   2、表格的文字处理模块:如文字的字体、字号、颜色等。未完成...,欢迎大家来共同完善。

mingyu9608 发表于 2004-3-12 17:31:00

很好的例子,我用了不知道是什么原因,转换后有很多"?"号


还有能否给给详细点的说明,我真的学这个,有些地方还看不懂,


转换规则应该怎样指定

wyj_007 发表于 2004-3-13 10:48:00

我熟悉CAD,Excel,Vlisp,可惜唯独不懂VBA。我也急需这种好程序,不知哪位大侠肯告诉我把上面的程序放到哪里,文件名后缀为什么,如何加载,加载后命名为什么。最后请高手指点VBA书籍中高,中,低级最好为哪三本。在下万分感激。


----------------------------------------------<BR><A href="mailto:wyj_007@sina.com" target="_blank" >wyj_007@sina.com</A>


隔行如隔山,此话真不假!但愿有仙人,渡我披新袈。

ttthhh_hb 发表于 2004-3-19 22:23:00

好!请问VBA如何调用CAD里的color对话框?

mountains 发表于 2004-3-25 14:21:00

在调用EXCEL时,如果EXCEL没有打开可以通过错误处理程序执行代码,通过公用对话框让用户打开特定的文件,代码如下:


On Error Resume Next<BR>                       Set appexcel = GetObject(, "excel.Application")<BR>                       If Err Then<BR>                                                       Err.Clear<BR>                       Set appexcel = CreateObject("excel.Application")<BR>                       Set workbooks = appexcel.workbooks<BR>                       Set workbook = workbooks.Add<BR>                       Set worksheet = workbook.ActiveSheet<BR>                       Else<BR>                       Set workbook = appexcel.ActiveWorkbook<BR>                       Set worksheet = workbook.Sheets("sheet1")<BR>                       End If

yancr0101 发表于 2004-3-29 15:15:00

我经常使用这两个软件,数据、表格转换是常有的事,以前曾使用过维维软件的“报表转绘王”,但未注册用户一次只能转4行。


现在有了这段代码,真是太好了。

zhang007 发表于 2004-4-1 09:57:00

谢谢!尽管我不大懂。

lotusfly 发表于 2004-4-10 11:36:00

"rl = PToM(xlRange.Left)<BR>                       rt = PToM(xlRange.top)<BR>                       rw = PToM(xlRange.Width)<BR>                       rh = PToM(xlRange.Height)"<BR>


xlRange.Height得到的数据,有时并不会由行高变化而变化!
页: [1] 2 3 4 5 6 7
查看完整版本: Excel表格到CAD的示例程序