乐筑天下

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

VBA和数组

[复制链接]

154

主题

1274

帖子

8

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1936
发表于 2007-2-1 16:25:33 | 显示全部楼层 |阅读模式
好吧,现在我完全迷失了我正在做的这个数组搜索的东西。 我理解其中的逻辑,但没有任何效果。 实际上,它第一次工作,但之后不起作用。代码 1 是我试图使工作的版本。 代码2是一个简化的版本,我试图让它工作,所以我可以修复代码1。
  1. Option Explicit
  2. Dim FoundItems() As String, intType(0 To 1) As Integer, varData(0 To 1) As Variant
  3. Dim objSelCol As AcadSelectionSets, objSelSet As AcadSelectionSet, objBlkRef As AcadBlockReference
  4. Dim varArray1 As Variant, intCount As Integer
  5. Public Sub PMS_v2()
  6. Erase FoundItems
  7.     Set objSelCol = ThisDrawing.SelectionSets
  8.     For Each objSelSet In objSelCol
  9.         If objSelSet.Name = "PMS" Then
  10.             objSelSet.Delete
  11.             Exit For
  12.         End If
  13.     Next
  14.     Set objSelSet = objSelCol.Add("PMS")
  15.     intType(0) = 0: varData(0) = "INSERT"
  16.     intType(1) = 2: varData(1) = "*"
  17.     objSelSet.Select Mode:=acSelectionSetAll, filtertype:=intType, filterdata:=varData
  18.     For Each objBlkRef In objSelSet
  19.         If objBlkRef.HasAttributes Then
  20.             varArray1 = objBlkRef.GetAttributes
  21.             For intCount = LBound(varArray1) To UBound(varArray1)
  22.                 Select Case varArray1(intCount).TagString
  23.                     Case "STORESNUMBER"
  24.                         strStoresNumber = varArray1(intCount).TextString
  25.                         IncrimentCount strStoresNumber
  26.                 End Select
  27.             Next intCount
  28.         End If
  29.     Next
  30.     'Now Extract the Information
  31.     'Extract to Tab Delimited File
  32.     Dim fso, fl, fln, s
  33.     Dim j As Integer
  34.     fln = "M:\PARTS-LIST\PMS.txt"
  35.     Set fso = CreateObject("Scripting.FileSystemObject")
  36.     If fso.FileExists(fln) Then
  37.         fso.DeleteFile fln
  38.     End If
  39.     Set fl = fso.CreateTextFile(fln)
  40.     For j = 1 To UBound(FoundItems)
  41.         s = GetPartInformation(FoundItems(j, 0), FoundItems(j, 1))
  42.         fl.WriteLine s
  43.     Next
  44.     fl.Close
  45. End Sub
  46. Private Function GetPartInformation(StoresNumber As String, Quantity As String) As String
  47.     Dim objXML As New DOMDocument
  48.     Dim objRoot As IXMLDOMElement
  49.     Dim objLNode As IXMLDOMElement
  50.     Dim s As String
  51.     objXML.Load "M:\PARTS-LIST\partslist.xml"
  52.     Set objRoot = objXML.documentElement
  53.     For Each objLNode In objRoot.childNodes
  54.         If StoresNumber = objLNode.childNodes(0).Text Then
  55.             s = Quantity & vbTab & StoresNumber & vbTab & objLNode.childNodes(1).Text & vbTab & objLNode.childNodes(2).Text & vbTab & objLNode.childNodes(3).Text
  56.         End If
  57.     Next objLNode
  58.     Set objXML = Nothing
  59.     GetPartInformation = s
  60. End Function
  61. Private Sub IncrimentCount(StoresNumber As String)
  62. On Error Resume Next
  63. Dim i As Integer, m As Integer
  64. Dim found As Boolean
  65.     found = False
  66.     m = UBound(FoundItems, 1)
  67.     If Err.Number = 9 Then
  68.         m = 0
  69.     Else
  70.         For i = 1 To m
  71.             If FoundItems(i, 0) = StoresNumber Then
  72.                 found = True
  73.                 FoundItems(i, 1) = CInt(FoundItems(i, 1)) + 1
  74.             End If
  75.         Next
  76.     End If
  77.     If found = False Then
  78.         ReDim Preserve FoundItems(m + 1, m + 1)
  79.         FoundItems(m + 1, 0) = StoresNumber
  80.         FoundItems(m + 1, 1) = 1
  81.     End If
  82. End Sub

代码2
  1. Option Explicit
  2. Dim intType(0 To 1) As Integer, varData(0 To 1) As Variant, FoundItems() As String
  3. Dim objSelCol As AcadSelectionSets, objSelSet As AcadSelectionSet, objBlkRef As AcadBlockReference
  4. Dim varArray1 As Variant, intCount As Integer
  5. Public Sub PMS_v3()
  6. Erase FoundItems
  7.                         IncrimentCount_v2 "1234"
  8.                         IncrimentCount_v2 "1234"
  9.                         IncrimentCount_v2 "5678"
  10.                         IncrimentCount_v2 "5678"
  11.                         IncrimentCount_v2 "1234"
  12.                         IncrimentCount_v2 "1234"
  13.                         IncrimentCount_v2 "5678"
  14.                         IncrimentCount_v2 "1234"
  15.                         IncrimentCount_v2 "1234"
  16.                            
  17. End Sub
  18. Private Sub IncrimentCount_v2(StoresNumber As String)
  19.       Dim i As Integer, m As Integer, cnt As Integer
  20.       Dim found As Boolean
  21.       On Error GoTo Err_Control
  22.       found = False
  23.       i = UBound(FoundItems, 1)
  24.       m = UBound(FoundItems, 2)
  25.       For i = 1 To m
  26.             If FoundItems(i, 1) = StoresNumber Then
  27.                   found = True
  28.                   FoundItems(i, 2) = CInt(FoundItems(i, 2)) + 1
  29.             End If
  30.       Next i
  31.       Exit Sub
  32. Err_Control:
  33.       If Err.Number = 9 Then m = 1
  34.       Resume Next
  35. End Sub

本帖以下内容被隐藏保护;需要你回复后,才能看到!

游客,如果您要查看本帖隐藏内容请回复
回复

使用道具 举报

154

主题

1274

帖子

8

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1936
发表于 2007-2-1 18:00:23 | 显示全部楼层
当您运行例程时,我会将您的FoundItems重置为零......即代替擦除......只有我......但是您可以使用擦除......我只是发现它不可靠......此外...你试图重拨数组的两个维度,你只能重拨最后一个维度...因此而不是
ReDim保留FoundItems(m+1, m+1)'这实际上是不正确的,因为你只有2个维度的第二个值(0&1),但是它必须被转过来,并且ReDim只有第二个维度...
ReDim保留FoundItems(1, m+1)因此您有无限的dims与2个值即FoundItems(0, x)和FoundItems(1, x)...
我已经编辑了下面的代码,因为我看到了它,但我还没有测试它,因为我这里没有任何方便测试它的东西.
  1. Option Explicit
  2. Dim FoundItems() As String, intType(0 To 1) As Integer, varData(0 To 1) As Variant
  3. Dim objSelCol As AcadSelectionSets, objSelSet As AcadSelectionSet, objBlkRef As AcadBlockReference
  4. Dim varArray1 As Variant, intCount As Integer
  5. Public Sub PMS_v2()
  6.     Redim FoundItems(1,0) As String
  7.     Set objSelCol = ThisDrawing.SelectionSets
  8.     For Each objSelSet In objSelCol
  9.         If objSelSet.Name = "PMS" Then
  10.             objSelSet.Delete
  11.             Exit For
  12.         End If
  13.     Next
  14.     Set objSelSet = objSelCol.Add("PMS")
  15.     intType(0) = 0: varData(0) = "INSERT"
  16.     intType(1) = 2: varData(1) = "*"
  17.     objSelSet.Select Mode:=acSelectionSetAll, filtertype:=intType, filterdata:=varData
  18.     For Each objBlkRef In objSelSet
  19.         If objBlkRef.HasAttributes Then
  20.             varArray1 = objBlkRef.GetAttributes
  21.             For intCount = LBound(varArray1) To UBound(varArray1)
  22.                 Select Case varArray1(intCount).TagString
  23.                     Case "STORESNUMBER"
  24.                         strStoresNumber = varArray1(intCount).TextString
  25.                         IncrimentCount strStoresNumber
  26.                 End Select
  27.             Next intCount
  28.         End If
  29.     Next
  30.     'Now Extract the Information
  31.     'Extract to Tab Delimited File
  32.     Dim fso, fl, fln, s
  33.     Dim j As Integer
  34.     fln = "M:\PARTS-LIST\PMS.txt"
  35.     Set fso = CreateObject("Scripting.FileSystemObject")
  36.     If fso.FileExists(fln) Then
  37.         fso.DeleteFile fln
  38.     End If
  39.     Set fl = fso.CreateTextFile(fln)
  40.     For j = 1 To UBound(FoundItems, 2)
  41.         s = GetPartInformation(FoundItems(0 , j), FoundItems(1, j))
  42.         fl.WriteLine s
  43.     Next
  44.     fl.Close
  45. End Sub
  46. Private Function GetPartInformation(StoresNumber As String, Quantity As String) As String
  47.     Dim objXML As New DOMDocument
  48.     Dim objRoot As IXMLDOMElement
  49.     Dim objLNode As IXMLDOMElement
  50.     Dim s As String
  51.     objXML.Load "M:\PARTS-LIST\partslist.xml"
  52.     Set objRoot = objXML.documentElement
  53.     For Each objLNode In objRoot.childNodes
  54.         If StoresNumber = objLNode.childNodes(0).Text Then
  55.             s = Quantity & vbTab & StoresNumber & vbTab & objLNode.childNodes(1).Text & vbTab & objLNode.childNodes(2).Text & vbTab & objLNode.childNodes(3).Text
  56.         End If
  57.     Next objLNode
  58.     Set objXML = Nothing
  59.     GetPartInformation = s
  60. End Function
  61. Private Sub IncrimentCount(StoresNumber As String)
  62. On Error Resume Next
  63. Dim i As Integer, m As Integer
  64. Dim found As Boolean
  65.     found = False
  66.     m = UBound(FoundItems, 2)
  67.     If Err.Number = 9 Then
  68.         m = 0
  69.     Else
  70.         For i = 1 To m
  71.             If FoundItems(0, i) = StoresNumber Then
  72.                 found = True
  73.                 FoundItems(1, i) = CInt(FoundItems(1, i)) + 1
  74.             End If
  75.         Next
  76.     End If
  77.     If found = False Then
  78.         ReDim Preserve FoundItems(1, m + 1)
  79.         FoundItems(0, m + 1) = StoresNumber
  80.         FoundItems(1, m + 1) = 1
  81.     End If
  82. End Sub

我希望能行
回复

使用道具 举报

86

主题

744

帖子

6

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1092
发表于 2007-2-2 10:07:48 | 显示全部楼层
我昨天回家前就知道了。回到绘图板。不过我有个主意。。。
回复

使用道具 举报

1

主题

1069

帖子

1050

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
69
发表于 2007-2-2 10:14:56 | 显示全部楼层

几年前我尝试过XML。据我回忆,这相当简单明了。您必须为XML添加一个引用—记不清具体是什么了— Microsoft XML(某个版本号?)
回复

使用道具 举报

1

主题

1069

帖子

1050

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
69
发表于 2008-10-27 17:52:39 | 显示全部楼层
我同意,写出XML应该很容易。这是我担心的阵列。我从来没有真正使用过它们。不过,这个概念看起来相当直截了当。我会随时通知你的
回复

使用道具 举报

154

主题

1274

帖子

8

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1936
发表于 2008-10-28 08:25:22 | 显示全部楼层
好吧,我卡住了。我不知道如何发送到XML。我知道我必须把它发送到子节点,但是我似乎不能让它们被识别。有人试过这个吗?
回复

使用道具 举报

154

主题

1274

帖子

8

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1936
发表于 2008-10-28 10:45:36 | 显示全部楼层
这是一个让你开始学习的例子
  1. Option Explicit
  2. Public Const strFilePath As String = "C:\TestXML.xml"
  3. Sub ExtractToXML()
  4.     Dim objDoc As MSXML2.DOMDocument
  5.     Dim objNode As MSXML2.IXMLDOMNode
  6.     Dim objRoot As MSXML2.IXMLDOMElement
  7.     Dim objElem As MSXML2.IXMLDOMElement
  8.     Dim oblkRef As AcadBlockReference
  9.     Dim ent As AcadEntity
  10.     Dim ar As Variant
  11.     Dim i As Integer
  12.     Set objDoc = New DOMDocument
  13.     objDoc.resolveExternals = True
  14.     Set objNode = objDoc.createProcessingInstruction( _
  15.                   "xml", "version='1.0' encoding='UTF-8'")
  16.     Set objNode = objDoc.insertBefore(objNode, _
  17.                                       objDoc.childNodes.Item(0))
  18.     Set objRoot = objDoc.createElement("blockdata")
  19.     Set objDoc.documentElement = objRoot
  20.     objRoot.setAttribute "xmlns:od", _
  21.                          "urn:schemas-microsoft-com:officedata"
  22.     For Each ent In ThisDrawing.ModelSpace
  23.         If TypeOf ent Is AcadBlockReference Then
  24.             Set oblkRef = ent
  25.             If oblkRef.HasAttributes Then
  26.                 Set objElem = objDoc.createElement(oblkRef.Name)
  27.                 objRoot.appendChild objElem
  28.                 ar = oblkRef.GetAttributes
  29.                 For i = LBound(ar) To UBound(ar)
  30.                     Set objNode = objDoc.createElement(ar(i).TagString)
  31.                     objNode.Text = ar(i).TextString
  32.                     objElem.appendChild objNode
  33.                 Next i
  34.             End If
  35.         End If
  36.     Next ent
  37.     objDoc.Save strFilePath
  38. End Sub

~'J'~
回复

使用道具 举报

1

主题

1069

帖子

1050

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
69
发表于 2008-10-28 15:49:06 | 显示全部楼层
只要稍加调整,它就能完美工作。
回复

使用道具 举报

154

主题

1274

帖子

8

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1936
发表于 2008-10-28 18:05:58 | 显示全部楼层
很高兴你解决了这个问题
干杯
~'J'~
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-7-3 17:17 , Processed in 0.587102 second(s), 70 queries .

© 2020-2025 乐筑天下

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