乐筑天下

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

ReDim阵列???

[复制链接]

154

主题

1274

帖子

8

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1936
发表于 2006-11-16 13:17:46 | 显示全部楼层 |阅读模式
当我有Preserve关键字时,我会不断出错,当我去掉它时,我不会'我需要保留数组中的数据,那么,如何同时保留并使数组变大呢
帮助中的注释说,使用Preserve时只能更改最后一个维度,但我不理解这意味着什么…
我的数组设置如下:Public roughPart()作为字符串
Public raughpartqy()作为整数
Public topoutPart()为字符串
0 Then
                    If PlumbingREC.EOF And PlumbingREC.BOF Then
                        Exit Sub
                    Else:
                        PlumbingREC.MoveFirst
                        Y = 0
                        Do While Not PlumbingREC.EOF
                        
                            ReDim roughPart(Y, cntAssembly) As String
                            ReDim roughPartQty(Y, cntAssembly) As Integer
                           
                            If PlumbingREC.Fields("AssemblyType").value = "Rough" Then
                                roughPart(Y, cntAssembly) = PlumbingREC.Fields("PartName").value
                                roughPartQty(Y, cntAssembly) = PlumbingREC.Fields("Quantity").value
                                Y = Y + 1
                            End If
                           
                            PlumbingREC.MoveNext
                        Loop
                        
                        PlumbingREC.MoveFirst
                        Y = 0
                        Do While Not PlumbingREC.EOF
                        
                            ReDim topoutPart(Y, cntAssembly) As String
                            ReDim topoutPartQty(Y, cntAssembly) As Integer
                           
                            If PlumbingREC.Fields("AssemblyType").value = "TopOut" Then
                                topoutPart(Y, cntAssembly) = PlumbingREC.Fields("PartName").value
                                topoutPartQty(Y, cntAssembly) = PlumbingREC.Fields("Quantity").value
                                Y = Y + 1
                            End If
                           
                            PlumbingREC.MoveNext
                        Loop
                    End If
                End If
               
                PlumbingREC.Close
                Set PlumbingREC = Nothing
[/code]我正在尝试做的总结:
我有一个块,“;组件“;具有1个属性;组件 该属性的值是存储在*中的AssemblyName。mdb文件 因此,我的部件存储在数据库中,而不是块中的多个属性中&nbsp
一个装配块的AssemblyName可能只引用一个或两个零件,而另一个可能有20到30个零件 所以当我创建(redim)我的数组…roughPart(X,Y)时,第一列中可能只有2行数据,然后当查询下一个装配块时,它有30个零件,该列中将有30行 这是个问题吗
提前谢谢你的帮助…我希望这足够清楚,我'如果您需要,我会发布更多详细信息…谢谢
回复

使用道具 举报

0

主题

7

帖子

6

银币

初来乍到

Rank: 1

铜币
9
发表于 2006-11-16 13:27:22 | 显示全部楼层
出于某种原因,我'我认为你只能重定一个一维数组。
回复

使用道具 举报

0

主题

7

帖子

5

银币

初来乍到

Rank: 1

铜币
11
发表于 2006-11-16 13:39:10 | 显示全部楼层

这意味着,一旦您将数组尺寸标注到其初始大小,例如:在循环中将roughPart(Y,cntsassembly)重新定义为字符串,则每个后续迭代只能替换cntsassociation的一个新值 价值;Y无法更改
实现目标的一种方法是预先计算记录计数,以便在开始循环之前确定每个数组的第一维度。
回复

使用道具 举报

0

主题

6

帖子

5

银币

初来乍到

Rank: 1

铜币
7
发表于 2006-11-16 13:49:37 | 显示全部楼层
此时I#039;我正在考虑调用一个过程,该过程将获取找到的数据并立即将其导出到Excel工作簿 而不是查询所有数据并编译成数百个变量,然后将这些变量发送到电子表格 我认为这将消除对我的阵列的需要…
您同意吗 或者我错过了什么
顺便说一句,当我再次阅读ReDim的帮助时。它更有意义。你只能更改最后一个维度的大小,而你根本不能更改维度的数量
因此,如果从单个阵列开始,则无法更改为2维阵列 然而,如果你有一个dim,你可以随时更改该dim的大小,如果你拥有一个多dim阵列,你只能更改最后一个DIMs的大小(第二个用于双精度,第三个用于三层,等等)。这意味着如果我想使用这种方法,我必须将我的第一个dim(行)预设为足够大的#以容纳所有可能的部分,然后,每当发现新程序集时,我可以更改第二个dim(列)的#
我认为立即将数据导出到excel要比先将数据编译到数组容易得多 除非你们中有人有理由不让我这么做,否则我会这么做
再次感谢你的帮助。。。
回复

使用道具 举报

0

主题

4

帖子

4

银币

初来乍到

Rank: 1

铜币
5
发表于 2006-11-16 13:54:40 | 显示全部楼层
谢谢Chuck
我的预设问题有两个方面:
1;当我使用SQLstring查询数据库时,PlumbingREC的recordcount始终为1;那是因为我在做内部连接吗&nbsp
2;另一个问题是,查询的第一个块可能需要数组的第一个Dim为5个条目,而下一个块则可能需要30个条目;所以在我看来,我必须对我的所有程序集进行记录计数,然后重新遍历这些程序集,以将这些部分应用于阵列
我这样想对吗
回复

使用道具 举报

0

主题

6

帖子

4

银币

初来乍到

Rank: 1

铜币
7
发表于 2006-11-16 14:06:09 | 显示全部楼层
我完全同意以中间方式导出到Excell,只要不需要对数据进行返工(组合排序和过滤);为了创建交错数组,在这样的数组中使用集合类型:
  1. Sub test()
  2. Dim Cl() As New Collection
  3. ReDim Preserve Cl(2)
  4. Cl(0).Add ("YourStuff0.1")
  5. Cl(0).Add ("YourStuff0.2")
  6. Cl(0).Add ("YourStuff0.3")
  7. Cl(0).Add ("YourStuff0.4")
  8. Cl(1).Add ("YourStuff1.1")
  9. Cl(1).Add ("YourStuff1.2")
  10. Cl(1).Add ("YourStuff1.3")
  11. Cl(1).Add ("YourStuff1.4")
  12. Cl(2).Add ("YourStuff2.1")
  13. ReDim Preserve Cl(3)
  14. Cl(3).Add ("YourStuff3.1")
  15. Cl(3).Add ("YourStuff3.2")
  16. Cl(3).Add ("YourStuff3.3")
  17. Cl(3).Add ("YourStuff3.4")
  18. End Sub
你可以用这种方式添加两个维度。缺点:与真实数组相比,集合对象速度较慢
如果你不'不需要将数据保存在内存中…don#039;不要这样做
回复

使用道具 举报

0

主题

7

帖子

5

银币

初来乍到

Rank: 1

铜币
8
发表于 2006-11-16 14:12:25 | 显示全部楼层

您是否移动到最后一条记录(.movelast),因为在所有记录真正加载到记录集中之前,计数不会显示实际大小;我误解了你想要什么,但是如果你知道记录的数量和字段的数量(Recordset.fields.Count),你可以重新定义一个数组
另一方面,如果您已经在记录集中存储了数据,我认为没有任何特殊原因,就没有必要在数组中传输它。
回复

使用道具 举报

0

主题

7

帖子

4

银币

初来乍到

Rank: 1

铜币
8
发表于 2006-11-16 15:08:42 | 显示全部楼层
Kevin,尝试使用GetRows方法:
这是我的程序代码剪报:
  1. Private Sub UserForm_Initialize()
  2.     On Error GoTo ErrorHandler
  3.     Dim Cnxn As ADODB.Connection
  4.     Dim rstNew As ADODB.Recordset
  5.     Dim strCnxn As String
  6.     Dim strSQL As String
  7.     Dim retArr As Variant
  8.     Dim i As Long, j As Long
  9.    
  10.     ' Open connection
  11.    
  12.     strCnxn = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
  13.                "Data Source=D:\AUTOLISP\LISPS\VBA\ACCESS\data.mdb;"
  14.     Set Cnxn = New ADODB.Connection
  15.     Cnxn.Open strCnxn
  16.    
  17.     ' Open table
  18.    
  19.     Set rstNew = New ADODB.Recordset
  20.     strSQL = "prot_Viabilita" ' table name
  21.     rstNew.Open strSQL, Cnxn, adOpenKeyset, adLockOptimistic, adCmdTable
  22.     [b]retArr = rstNew.GetRows[/b]
  23.     Me.Caption = "Data from table " & Chr(34) & strSQL & Chr(34)
  24.     '
  25.     ' Transpose record data and populate list box
  26.     '
  27.     ReDim dataArr(UBound(retArr, 2), UBound(retArr, 1)) As String
  28.     For i = 0 To UBound(retArr, 1)
  29.     For j = 0 To UBound(retArr, 2)
  30.     dataArr(j, i) = CStr(retArr(i, j))
  31.     Next
  32.     Next
  33.     ListBox1.List() = dataArr
  34.     ' clean up
  35.     rstNew.Close
  36.     Cnxn.Close
  37.     Set rstNew = Nothing
  38.     Set Cnxn = Nothing
  39.     Exit Sub
  40.    
  41. ErrorHandler:
  42.     ' clean up
  43.     If Not rstNew Is Nothing Then
  44.         If rstNew.State = adStateOpen Then rstNew.Close
  45.     End If
  46.     Set rstNew = Nothing
  47.    
  48.     If Not Cnxn Is Nothing Then
  49.         If Cnxn.State = adStateOpen Then Cnxn.Close
  50.     End If
  51.     Set Cnxn = Nothing
  52.    
  53.     If Err  0 Then
  54.         MsgBox Err.Source & "-->" & Err.Description, , "Error"
  55.     End If
  56. End Sub
&gt'J#039&书信电报;
回复

使用道具 举报

0

主题

11

帖子

5

银币

初来乍到

Rank: 1

铜币
12
发表于 2006-11-17 07:34:10 | 显示全部楼层
您可以切换y和cntsassembly变量,使y是最后一个吗?
回复

使用道具 举报

0

主题

5

帖子

3

银币

初来乍到

Rank: 1

铜币
7
发表于 2006-11-17 11:18:09 | 显示全部楼层
Quicksilver,
实际上,这会起作用 有趣的是,它'例如简单的答案 虽然我喜欢立即使用导出到Excel的方法,但它的效果比我想象的要好10000%,所以无论如何我都不会使用数组场景
我感谢大家的投入和帮助
希望大家周末愉快。
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-7-7 01:09 , Processed in 1.587581 second(s), 72 queries .

© 2020-2025 乐筑天下

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