黄玉宏 发表于 2006-6-1 15:49:00

[求助]遍历选择集时循环为什么从0到SSetObj.Count – 1

<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-line-height-alt: 0pt" align=left>各位高手:请问遍历选择集时循环为什么从0到SSetObj.Count – 1,而不是从1到SSetObj.Count?当然如用For……Each循环不存在这个问题。请参阅以下程序,先谢谢各位!<B style="mso-bidi-font-weight: normal"><?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /><o:p></o:p></B></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; mso-line-height-alt: 0pt"><B style="mso-bidi-font-weight: normal">用VBA清理空文本</B><o:p></o:p></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; mso-line-height-alt: 0pt">Public Sub TextPurge()<o:p></o:p></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; mso-line-height-alt: 0pt">Dim SSetObj As AcadSelectionSet&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <FONT face="Times New Roman">'</FONT>创建名为TextPurge选择集<o:p></o:p></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; mso-line-height-alt: 0pt">Set SSetObj = ThisDrawing.SelectionSets.Add("TextPurge")<o:p></o:p></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; mso-line-height-alt: 0pt"><FONT face="Times New Roman">'</FONT>创建过滤器,仅选择Attdef(属性定义)、Text(单行文本)、Mtext(多行文本)<o:p></o:p></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; mso-line-height-alt: 0pt"><FONT face="Times New Roman">'</FONT>关于过滤器的使用,请参考有关书籍<o:p></o:p></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; mso-line-height-alt: 0pt">Dim fType(0) As Integer&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;<FONT face="Times New Roman">'</FONT>本句还可写成:Dim fType(0 To 0) As Integer<o:p></o:p></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; mso-line-height-alt: 0pt">Dim fData(0) As String&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;<FONT face="Times New Roman">'</FONT>本句还可写成:Dim fData(0 To 0) As Variant<o:p></o:p></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; mso-line-height-alt: 0pt">fType(0) = 0<o:p></o:p></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; mso-line-height-alt: 0pt">fData(0) = "Attdef,Text,Mtext"<o:p></o:p></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; mso-line-height-alt: 0pt"><FONT face="Times New Roman">'</FONT>选择全部的Attdef、Text、Mtext<o:p></o:p></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; mso-line-height-alt: 0pt">SSetObj.Select acSelectionSetAll, , , fType, fData<o:p></o:p></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; mso-line-height-alt: 0pt">If SSetObj.Count &lt;&gt; 0 Then<o:p></o:p></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; mso-line-height-alt: 0pt">Dim i As Integer<o:p></o:p></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; mso-line-height-alt: 0pt">For i = 0 To SSetObj.Count – 1<B style="mso-bidi-font-weight: normal">&nbsp;&nbsp; </B><FONT face="Times New Roman">'</FONT>计数循环遍历选择集范例代码(一般提倡用For……Each循环)<B style="mso-bidi-font-weight: normal"><o:p></o:p></B></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; mso-line-height-alt: 0pt"><FONT face="Times New Roman">'</FONT>在Attdef中显示的是TagString,在Text和Mtext中显示的是TextString<o:p></o:p></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; mso-line-height-alt: 0pt">If TypeOf SSetObj(i) Is AcadAttribute Then<o:p></o:p></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; mso-line-height-alt: 0pt">If SSetObj(i).TagString = "" Then SSetObj(i).Delete&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '条件判断<o:p></o:p></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; mso-line-height-alt: 0pt">Else<o:p></o:p></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; mso-line-height-alt: 0pt">If SSetObj(i).TextString = "" Then SSetObj(i).Delete<o:p></o:p></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; mso-line-height-alt: 0pt">End If<o:p></o:p></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; mso-line-height-alt: 0pt">Next<o:p></o:p></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; mso-line-height-alt: 0pt">End If<o:p></o:p></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; mso-line-height-alt: 0pt">SSetObj.Delete<o:p></o:p></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; mso-line-height-alt: 0pt">Set SSetObj = Nothing<o:p></o:p></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; mso-line-height-alt: 0pt">End Sub<o:p></o:p></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center" align=center>黄玉宏  <FONT face="Times New Roman">2006.6.1</FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center" align=center><o:p><FONT face="Times New Roman">&nbsp;</FONT></o:p></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><o:p><FONT face="Times New Roman">&nbsp;</FONT></o:p></P>

fjfhgdwfn 发表于 2006-6-1 20:29:00

<P>这就是一种规定,如VB中数组默认是从0开始,FROTRAN就是从1开始</P>

peicong 发表于 2006-6-10 15:24:00

[注意]好像有点问题

楼主,程序里只判断文本
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; mso-line-height-alt: 0pt">If SSetObj(i).TextString = "" Then SSetObj(i).Delete<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /><o:p></o:p></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; mso-line-height-alt: 0pt">End If</P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; mso-line-height-alt: 0pt">如果有文本有多个空格的话,在图形中也是看不到,这样的文本应该没有办法删除吧???</P>

login1986 发表于 2006-6-10 17:31:00

<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; mso-line-height-alt: 0pt">If Trim(SSetObj(i).TextString) = "" Then SSetObj(i).Delete<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /><o:p></o:p></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; mso-line-height-alt: 0pt">End If</P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; mso-line-height-alt: 0pt">这不就行了...</P>
页: [1]
查看完整版本: [求助]遍历选择集时循环为什么从0到SSetObj.Count – 1