明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 5060|回复: 10

vb\块\选择集

[复制链接]
发表于 2003-3-10 13:14:00 | 显示全部楼层 |阅读模式
怎样用vba实现以下内容:
1、在屏幕上选择一个块,得到块名
2、将所有同名块加入选择集
另一的问题:在电子表格excel中怎样定义块
谢谢
发表于 2003-3-10 19:51:00 | 显示全部楼层

可以使用以下程序完成

Sub SelBlkSet()
    Dim Blk As AcadBlockReference
    Dim Ent As AcadEntity
    Dim Pnt As Variant
    Dim SelBlk As Boolean
    Dim BlkName As String
   
    On Error Resume Next
   
    '选择对象并判断所选对象是否为图块
    SelBlk = True
    While SelBlk
    ThisDrawing.Utility.GetEntity Ent, Pnt, "选择图块"
    If Ent.ObjectName = "AcDbBlockReference" Then
       Set Blk = Ent
        BlkName = Blk.Name
        SelBlk = False
    End If
    Wend
   
    '创建空白选择集
    Dim BlkSet As AcadSelectionSet
    Set BlkSet = CreateSelectionSet
   
    '建立选择集过滤器
    Dim TypeArray As Variant
    Dim DateArray As Variant
    BuildFilter TypeArray, DateArray, 100, "AcDbBlockReference", 2, BlkName
   
    '过滤出所要选择的图块
    BlkSet.Select acSelectionSetAll, , , TypeArray, DateArray
   
    '显示选定的图块名称及数量
    Debug.Print "选定的图块名称为“" & BlkName & "”,数量为" & BlkSet.Count
   
End Sub

'创建空间选择集的函数
Public Function CreateSelectionSet(Optional ssName As String = "ss") As AcadSelectionSet

    Dim ss As AcadSelectionSet
   
    On Error Resume Next
    Set ss = ThisDrawing.SelectionSets(ssName)
    If Err Then Set ss = ThisDrawing.SelectionSets.Add(ssName)
    ss.Clear
    Set CreateSelectionSet = ss

End Function

'创建过滤器的函数
Public Sub BuildFilter(TypeArray, dataArray, ParamArray gCodes())
    Dim fType() As Integer, fData()
    Dim index As Long, i As Long
   
    index = LBound(gCodes) - 1
        
    For i = LBound(gCodes) To UBound(gCodes) Step 2
        index = index + 1
        ReDim Preserve fType(0 To index)
        ReDim Preserve fData(0 To index)
        fType(index) = CInt(gCodes(i))
        fData(index) = gCodes(i + 1)
    Next
    TypeArray = fType: dataArray = fData
End Sub

而对于在电子表格中定义块,道理和在ACAD的VBA中一样
 楼主| 发表于 2003-3-11 18:53:00 | 显示全部楼层

怎样让EXCEL数据排序,我的代码没反应

本帖最后由 作者 于 2003-3-11 18:53:27 编辑

代码如下
    Selection.Sort Key1:=Range("A1"), Order1:=xlAscending, Header:=xlGuess, _
        OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom,   SortMethod _
        :=xlPinYin
发表于 2003-3-11 19:21:00 | 显示全部楼层

有没有先选定对象

如:
Columns("F:F").Select
 楼主| 发表于 2003-3-12 08:13:00 | 显示全部楼层

有选择

请帮忙测试一下(cad vba)
  '排序
  Range("A2").Sort _
      key1:=Columns("A"), _
      Header:=xlGuess
    Set currentcell = Range("a2")
   '汇总
    Do While Not IsEmpty(currentcell)
        Set nextCell = currentcell.Offset(1, 0)
        If nextCell.Value = currentcell.Value Then
            Set TCell = currentcell.Offset(1, 3)
            TCell.Value = TCell.Value + currentcell.Offset(0, 3).Value
            currentcell.EntireRow.Delete
            
        End If
        Set currentcell = nextCell
    Loop
发表于 2003-3-12 19:26:00 | 显示全部楼层

排序段CurrentCell没有定义为Range,而汇总段也是一样道理,但不知你要汇总些什么

Dim CurrentCell As Range
Dim NextCell As Range
Dim TCell As Range

从你程序的汇总情况来看,可能要将TCell.Value改为1就行
TCell.Value = 1 + CurrentCell.Offset(0, 3).Value
 楼主| 发表于 2003-3-12 20:10:00 | 显示全部楼层

将块的属性导出按序号分类汇总

在excel下通过,在cad下不行(vba)
发表于 2003-3-13 12:22:00 | 显示全部楼层

以下程序能运行并能得到你所要的结果

Sub ExcelSortAndGather()

On Error Resume Next
   
    ' 连接到Excel应用程序
    Dim ExcelApp As Excel.Application
    Set ExcelApp = GetObject _
                  (, "Excel.Application")
    If Err Then
        Err.Clear
        Set ExcelApp = CreateObject _
                  ("Excel.Application.")
        If Err Then
            MsgBox Err.Description
            Exit Sub
        End If
    End If
   
    ' 连接到Excel的活动工作表
    Dim ExcelBook As Workbook
    Set ExcelBook = ExcelApp.ActiveWorkbook
    Dim ExcelSheet As Worksheet
    Set ExcelSheet = ExcelApp.ActiveSheet

'排序
Dim CurrentCell As Range
Dim NextCell As Range
Dim TCell As Range

'你的Range,Columns都没有指定从属的对象,
'因为在ACAD中不能象Excel一样不指定
With ExcelSheet
    .Range("A2").Sort _
      key1:=.Columns("A"), _
      Header:=xlGuess
    Set CurrentCell = .Range("a2")
   '汇总
    Do While Not IsEmpty(CurrentCell)
        Set NextCell = CurrentCell.Offset(1, 0)
        If NextCell.Value = CurrentCell.Value Then
            Set TCell = CurrentCell.Offset(1, 3)
            TCell.Value = 1 + CurrentCell.Offset(0, 3).Value
            CurrentCell.EntireRow.Delete
            
        End If
        Set CurrentCell = NextCell
    Loop
End With
End Sub
 楼主| 发表于 2003-3-13 12:31:00 | 显示全部楼层

问题解决,多谢版主

发表于 2003-5-31 19:19:00 | 显示全部楼层

cad与excel

我看了很多关于Cad与Excel相互连接的问题,大部分都是讲在Cad中提取块属性到Excel中,或者是把Excel表格提取到Cad中。
  
  我现在想做的就是手动选择Cad中的材料表内容动态或是按一定路径输出到Excel中或者是文本文件中,而且输出的内容能按一定规则排序。
   希望斑竹或其它高手能给出一些示例代码,谢了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-25 09:38 , Processed in 0.179107 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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