明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 7108|回复: 9

我写的EXCEL与CAD互相转换表格的程序。

[复制链接]
发表于 2003-12-1 13:07 | 显示全部楼层 |阅读模式
Dim xcelapp As New Excel.Application

'由EXCEL文件生成CAD表格
Sub excelread()
xcelapp.Workbooks.Open "d:\book3.xls", , ReadOnly
Dim i As Integer
Dim j As Integer
i = 2
j = 65
With xcelapp.ActiveWorkbook.Worksheets("报价")
'获得行数
Do
    If .Range("a" & i) = "" Then
       Exit Do
    End If
    i = i + 1
Loop
'获得列数
Do
    If .Range(Chr(j) & "1") = "" Then
       Exit Do
     End If
    j = j + 1
Loop
End With
Call drawtable(i, j)
xcelapp.Workbooks.Close
xcelapp.Quit
End Sub

Private Sub drawtable(ByVal x As Integer, ByVal y As Integer)
Dim newl As AcadLine  '绘制直线
Dim startp(2) As Double '定义直线起点
Dim endp(2) As Double '定义直线终点

Dim i As Integer '循环变量
Dim newtext1 As AcadMText
'定义直线起点
startp(0) = 0
startp(1) = 0
startp(2) = 0
'定义直线终点
endp(0) = 60 * (y - 65)
endp(1) = 0
endp(2) = 0
'画横线
Do While i < x + 2
   Set newl = ThisDrawing.ModelSpace.AddLine(startp, endp)
   startp(1) = startp(1) + 10
   endp(1) = endp(1) + 10
   i = i + 1
Loop
'画竖线,定义起始点
endp(0) = 0
endp(1) = 10 * (x + 1)
startp(1) = 0
startp(0) = 0
For i = 1 To y - 64
  '画第一条竖线,并写入第一列文本
  Set newl = ThisDrawing.ModelSpace.AddLine(startp, endp)
  Call addtext(endp(0), x, i)
  startp(0) = startp(0) + 60
  endp(0) = endp(0) + 60
Next
ThisDrawing.Application.Update
End Sub

Private Sub addtext(ByVal x As Double, ByVal rs As Integer, ByVal cs As Integer)
   Dim newtext As AcadMText '写入文本
   Dim insertp(2) As Double '定义文本的插入点
    Dim i As Integer
    Dim j As Integer
    j = 64 + cs
    '获得文本的插入点
    insertp(0) = x + 2
    insertp(1) = (rs + 2) * 10 - 12.5
    insertp(2) = 0
            i = 1
            Do While i < rs
             Set newtext = ThisDrawing.ModelSpace.AddMText(insertp, 50, xcelapp.ActiveWorkbook.Worksheets("报价").Range(Chr(j) & i))
               newtext.Height = 5
               i = i + 1
               insertp(1) = insertp(1) - 10
            Loop
End Sub

'由CAD表格转为EXCEL表格

Sub getdata()
Dim sel As AcadSelectionSet
  Dim i As Integer
  Dim j As Integer
  Dim start1 As Variant
  Dim end1 As Variant
  Dim str(300, 300) As String
  Dim newline As AcadLine
  Dim newmtext As AcadMText
  Dim rows As Integer
  Dim cols As Integer
  Dim rowlen As Double
  Dim collen As Double
  On Error Resume Next
  '选择对象
  Set sel = ThisDrawing.SelectionSets.Add("ssel")
  If Err Then
      Err.Clear
      Set sel = ThisDrawing.SelectionSets.Item("ssel")
  End If
  On Error GoTo 0
  sel.SelectOnScreen
  Dim Ent As AcadEntity
  '计算行数及列数
  For Each Ent In sel
       If LCase(Ent.ObjectName) = "acdbline" Then
                  Set newline = Ent
                      start1 = newline.StartPoint
                      end1 = newline.EndPoint
                      If start1(0) = end1(0) Then
                         j = j + 1
                         collen = newline.Length
                      ElseIf start1(1) = end1(1) Then
                         i = i + 1
                         rowlen = newline.Length
                      End If
        End If
Next
For Each Ent In sel
   '将文本写入数组
     If LCase(Ent.ObjectName) = "acdbmtext" Then
       Set newmtext = Ent
           start1 = newmtext.InsertionPoint
           cols = start1(0) \ rowlen / (j - 1)
           rows = i - start1(1) \ collen / (i - 1) - 2
           str(rows, cols) = newmtext.TextString
     End If
Next
Call writeexcel(str, i, j)
sel.Delete
End Sub

Private Sub writeexcel(ByVal p As Variant, ByVal x As Integer, ByVal y As Integer)
Dim i As Integer
Dim j As Integer
Dim excelapp As New Excel.Application
Dim excelwkbk As Excel.Workbook
Set excelwkbk = excelapp.Workbooks.Add
MsgBox excelwkbk.Name

With excelwkbk.Worksheets("sheet1")
For i = 1 To x
    For j = 65 To y + 65
        .Range(Chr(j) & i) = p(i - 1, j - 65)
    Next
Next
End With
excelapp.ActiveWorkbook.SaveAs "d:\hxj.xls"
excelapp.Workbooks.Close
excelapp.Quit
End Sub
 楼主| 发表于 2003-12-1 13:11 | 显示全部楼层
主要是针对联通设计院的模板生成表格,所以有点数据上面,主要是针对我的工作
还请LEE版主及各位多提意见

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
发表于 2003-12-2 11:37 | 显示全部楼层

一点点小建议

要对已经运行正确的程序说三道四不是件容易的事,也是件不容易受欢迎的事。既然楼点名,不说几句总是不对的。
以下说的都仅仅是程序的一点点小问题,只要在平时编程注意一下就可以了。
1、标志符命名时最好用大小写混写,例如:定义时用DrawTable,以后编程时倒是可以写成drawtable,这样当写完一行时,VBA IDE就会立即将其改成DrawTable,这样可以立即检查是否出现拼写错误。
2、在drawtable子程序中并没有使用那个AcadMText对象,从而不需要Dim它。当然,我知道你开始是准备使用它,程序定型后忘记删除这个Dim了。
3、实际上,Dim那个AcadLine也没有必要,绘图时直接用以下代码:
ThisDrawing.ModelSpace.AddLine startp, endp
就可以了。当然,如果在程序中要查询或者编辑它就另当别论了。
同样,在addtext子程序中的AcadMText也可以不要声明,这样可以稍稍提高代码效率。
4、在getdata子程序中,str变量声明为300*300的String数组,使用程序失去了灵活性,也降低了代码效率,可以这样修改:
先声明str为Variant变量:   Dim str As Variant
在获取行数和列数后重新声明:  ReDim str(0 To i, 0 To j) As String
5、将整个str数组作为参数传递给writeexcel子程序,若使用ByVal方法,你的目的是保证在子程序中该数组内容的修改不会影响到子程序以外,但运行时需要在内存中复制整个数组,当数组较大时,这样效率会大大降低,你楼主仔细斟酌是否有这个必要。由于程序在调用writeexcel以后并没有再使用str数组,因此,我建议这个参数不要用ByVal传递。
 楼主| 发表于 2003-12-3 08:59 | 显示全部楼层
感谢LEE版主,我没有什么经验。主要是在学习了您写的那个读写EXCEL文件后,
针对自己的需要写的小东东。
这次又得到您这么多帮助。就此贡献鲜花 一朵。呵呵:)THANKS
发表于 2004-3-3 09:52 | 显示全部楼层
请教 我在调试上面的代码时 For Each Ent In sel提示类型不匹配 应如何修改 谢谢
发表于 2004-3-3 11:32 | 显示全部楼层
To 5楼:


你是否忘记了Dim Ent As AcadEntity?


如果方便,请帖出你的部分代码。


楼主的代码和我写《VBA读写EXCEL数据的一般方法》中的代码都已经运行通过,不会出现你说的错误。
发表于 2004-3-4 08:52 | 显示全部楼层
你好


我就是把搂主的'由CAD表格转为EXCEL表格代码照搬过去的


是不是要在运行过程中要引用一些特殊的库文件什么的


我是个新手对VBA不了解


只是想实现把CAD里的材料表转到EXCEL里


谢谢
发表于 2004-3-4 09:01 | 显示全部楼层
ACAD VBA中:“工具”菜单-&gt;“引用”,选择“Microsoft Excel 9.0 Object Library”,当然,根据你机器中的EXCEL应用程序版本不同,可能不是9.0。
发表于 2004-4-1 14:44 | 显示全部楼层
我在读取excel表中的坐标到CAD中并连成线的程序,不知有没有人编写出来呢
发表于 2004-4-11 19:45 | 显示全部楼层
gamelemon发表于2004-4-1 14:44:00我在读取excel表中的坐标到CAD中并连成线的程序,不知有没有人编写出来呢

这个更简单了,都无需编程,以前有这方面的例子,你找找看
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-5-3 01:51 , Processed in 0.473200 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表