乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 87|回复: 9

[编程交流] VBA新手帮助。。。

[复制链接]

1

主题

4

帖子

3

银币

初来乍到

Rank: 1

铜币
5
发表于 2022-7-6 22:28:14 | 显示全部楼层 |阅读模式
大家好。
 
我是VBA新手,我正在尝试在Autocad中做一件看似简单的事情。
 
我正在尝试制作一个包含2个按钮和2个列表框的简单表单,具有以下功能:
 
按钮1:查找图形中所有唯一的块名,并将其放置在列表框1中
查找图形中每个唯一块名的总数,并将其添加到ListBox2。
 
 
按钮2:根据listbox1中的块名,在现成excel工作簿的某些excel单元格中传输listbox2的值。
 
按钮3:退出表单/应用程序
 
我遇到的最糟糕的问题是计算图形中的块数。我的意思是,我阅读了数百个论坛,甚至找到了现成的vba代码,但似乎没有什么能像我预期的那样工作。所以我试着从一开始就做所有的事情,但(由于我对数组或多维数组缺乏知识)我坚持要计算图形中每个唯一块名的数量,并将其添加到我的列表框中。
 
以下是我目前掌握的代码:
 
  1. Public excelApp As Object
  2. Public wkbkObj As Object
  3. Public sheetObj As Object
  4. Private Sub CommandButton1_Click()
  5. Dim i, j, BlocksTotal As Integer
  6. Dim Block As AcadBlockReference
  7. Dim BlockName, UniqueBlockName As String
  8. Dim Blk As AcadEntity
  9. 'Number of unique blocks
  10. btot = ThisDrawing.Blocks.Count
  11. ' Every unique block name goes in Listbox1
  12. For i = 0 To btot - 1
  13.    UniqueBlockName = ThisDrawing.Blocks.Item(i).Name
  14.    If Not Mid$(UniqueBlockName, 1, 1) = "*" And Not UniqueBlockName = "NAME" Then ListBox1.AddItem UniqueBlockName ' Getting rid of *ModelSpace and *PaperSpace and a wrong name of block I have in all drawings
  15. Next i
  16. For j = 0 To ListBox1.ListCount - 1 ' The problem is in this Loop...I cannot find a fast and easy way to count the number of every block name
  17.     UniqueBlockName = ListBox1.List(j) 'picking up block names from listbox1
  18.     BlocksTotal = 0
  19.        For Each Blk In ThisDrawing.ModelSpace ' Here I want to check the name of every block in modelspace (not unique) and if it is the same as the listbox name i have to find its total number and add it to listbox 2
  20.            If Blk.Name = UniqueBlockName Then BlocksTotal = BlocksTotal + 1
  21.        Next
  22.     ListBox2.AddItem BlocksTotal
  23. Next j
  24. End Sub
  25. Private Sub CommandButton2_Click()
  26. Dim i As Integer
  27. On Error Resume Next
  28.    Set excelApp = GetObject(, "Excel.Application")
  29.    If Err <> 0 Then
  30.        Err.Clear
  31.        Set excelApp = CreateObject("Excel.Application")
  32.                If Err <> 0 Then
  33.            MsgBox "ÓöÜëìá êáôÜ ôçí åêêßíçóç ôïõ Excel!", vbExclamation
  34.            End
  35.        End If
  36.    End If
  37.    excelApp.Visible = True
  38.    Set wkbkObj = excelApp.Workbooks.Open(FileName:="c:\dipola.xls")
  39.    Set sheetObj = wkbkObj.Worksheet(2)
  40. For i = 0 To ListBox1.ListCount - 1
  41.    If ListBox1.List(i) = "C13" Then sheetObj.Range("A1").Value = ListBox2.List(i)
  42.    If ListBox1.List(i) = "C1" Then sheetObj.Range("C9").Value = ListBox2.List(i)
  43. Next i
  44. End Sub
  45. Private Sub CommandButton3_Click()
  46. End
  47. End Sub

 
有人能帮我吗,因为我花了两天时间试图找到真正有效的东西。。。我希望我有时间多读点书,尝试其他方法,但我需要它尽快,我完全困惑了
 
提前感谢。。。
 
仅供参考:我正在使用Autocad 2011 LT。
回复

使用道具 举报

35

主题

2471

帖子

2447

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
174
发表于 2022-7-6 22:39:58 | 显示全部楼层
不确定您所说的版本(在个人资料和帖子中)-LT中没有可用的定制解决方案?!?
 
我不想让您气馁,但希望您知道,自4个版本以来,VBA已从AutoCAD中停止使用。总有一天会不再被支持。
因为你才刚刚开始,所以最好找一找。Net方法。
回复

使用道具 举报

1

主题

4

帖子

3

银币

初来乍到

Rank: 1

铜币
5
发表于 2022-7-6 22:47:50 | 显示全部楼层
问题是,我们需要这一次(为了从485个图纸生成报告)。
那么它将不再使用。
 
我在autocad中单独安装了VBA(我看到它不再受支持)。
说实话,除了我说的名字问题外,一切似乎都很好。
为了完成这一次的工作,我可以尝试在其他autocad版本以及(我有2009年和2007年安装在其他PC的太)。
 
我只需要找到正确的方法。
回复

使用道具 举报

35

主题

2471

帖子

2447

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
174
发表于 2022-7-6 22:53:48 | 显示全部楼层
你想用这些代码实现什么?计算图形中块的实例并将其导出到Excel?有内置的BCOUNT命令可用-尽管我不确定是否在LT中可用。
回复

使用道具 举报

35

主题

2471

帖子

2447

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
174
发表于 2022-7-6 22:58:32 | 显示全部楼层
同样,您的意思是,在AutoCAD 2011 LT上安装了VBA扩展(enabler)?
回复

使用道具 举报

1

主题

4

帖子

3

银币

初来乍到

Rank: 1

铜币
5
发表于 2022-7-6 23:03:40 | 显示全部楼层
 
我想将它们导出到excel报表的某些单元格中。
它没有express工具,而且为所有这些图形复制粘贴数千个值也很耗时。这就是为什么我们试图用代码来实现它。
回复

使用道具 举报

29

主题

519

帖子

477

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
163
发表于 2022-7-6 23:10:48 | 显示全部楼层
尝试从“块”集合中获取图形中所有块的名称,并过滤每个块名称以获取块参照的实例数。然后,您可以将它们插入列表框中。
 
MSasu正确指出的一点是,您将无法在LT中运行此VBA代码。这是无法避免的。
回复

使用道具 举报

106

主题

1万

帖子

101

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1299
发表于 2022-7-6 23:20:26 | 显示全部楼层
它是否有Dataextract,可以在1次输出到excel中时实现您想要的功能。
回复

使用道具 举报

1

主题

4

帖子

3

银币

初来乍到

Rank: 1

铜币
5
发表于 2022-7-6 23:25:40 | 显示全部楼层
我通过使用多维数组找到了一个完美的解决方案。
 
代码为:
 
  1. Dim excelApp As Excel.Application
  2. Dim wbk As Workbook
  3. Dim sht As Worksheet
  4. Private Sub cmdListBlocks_Click()
  5.    
  6.    Dim Block As AcadBlock
  7.    Dim i As Integer
  8.    Dim MyBlockArray() As Variant
  9.    
  10.    i = 0
  11.    
  12.    For Each Block In ThisDrawing.Blocks
  13.    i = i + 1
  14.    
  15.    ReDim Preserve MyBlockArray(2, i)
  16.        MyBlockArray(0, i) = Block.Name
  17.        MyBlockArray(1, i) = Block.Count
  18.    Next Block
  19.    Me.ListBoxBlocks.ColumnCount = 2
  20.    Me.ListBoxBlocks.ColumnWidths = "36;36"
  21.    Me.ListBoxBlocks.Column() = MyBlockArray
  22. End Sub
  23. Private Sub CommandButton1_Click()
  24. Dim i As Integer
  25. ListCount = Me.ListBoxBlocks.ListCount
  26. On Error Resume Next
  27.    Set excelApp = GetObject(, "Excel.Application")
  28.    If Err <> 0 Then
  29.        Err.Clear
  30.        Set excelApp = CreateObject("Excel.Application")
  31.                If Err <> 0 Then
  32.            MsgBox "Εrror Opening Excel!", vbExclamation
  33.            End
  34.        End If
  35.    End If
  36.    excelApp.Visible = True
  37.    Set wkbkObj = excelApp.Workbooks.Open(FileName:="c:\dipola.xls") [b]' here i just open a certain excel Workbook[/b]
  38.    Set sheetObj = wkbkObj.Worksheet(1) [b]' I put the values in the 2nd sheet[/b]
  39. For i = 0 To ListCount - 1
  40.    If ListBoxBlocks.List(i, 0) = "C1" Then Range("B1").Cells.Value = ListBoxBlocks.List(i, 1)
  41.    If ListBoxBlocks.List(i, 0) = "C2" Then Range("B2").Cells.Value = ListBoxBlocks.List(i, 1)  [b]' Here I make a lot of checks so i just wrote two to show the way I send values to certain cells in excel[/b]
  42. Next
  43. wkbkObj.Sheets("DIPOLA").Select [b] ' I focus on the 1st sheet that is the actual report page for the user to print[/b]
  44. End Sub
  45. Private Sub CommandButton2_Click()
  46. End
  47. End Sub

 
我刚刚创建了一个带有3个按钮和一个列表框的用户表单(只是为了从中读取值并将其发送到excel)。
 
我不确定它是否会在2011年起作用,但在2009年和2007年起作用。
回复

使用道具 举报

29

主题

519

帖子

477

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
163
发表于 2022-7-6 23:30:43 | 显示全部楼层
 
它肯定不会在AutoCAD 2011 LT中工作,仅在AutoCAD的完整版本中工作。
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-3-4 11:26 , Processed in 0.326509 second(s), 72 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表