2D阵列帮助
我一直在努力理解这个2D数组的东西。我希望能够将1)绘图名称和2)布局选项卡名称存储在数组中。我猜这将是一个2D数组。我遇到的最大问题是REDIM部分。数组的大小会有所不同,我不知道如何正确调整它的大小。我一直收到错误,_obviously_我做错了什么。这是我到目前为止得到的...
Public Sub SheetCount()
Dim oSheet As AcSmSheet
Dim nSheetCount As Integer
Dim oEnumDB As IAcSmEnumDatabase
Dim oItem As IAcSmPersist
Dim oSheetSetMgr As AcSmSheetSetMgr
Set oSheetSetMgr = New AcSmSheetSetMgr
Set oEnumDB = oSheetSetMgr.GetDatabaseEnumerator
Set oItem = oEnumDB.Next
Dim oSheetDb As AcSmDatabase
Dim strFileInfo() As String
ReDim strFileInfo(nSheetCount, 2)
Do While Not oItem Is Nothing
Set oSheetDb = oItem
Dim oEnum As IAcSmEnumPersist
Dim oItemSh As IAcSmPersist
Set oEnum = oSheetDb.GetEnumerator
Set oItemSh = oEnum.Next
Do While Not oItemSh Is Nothing
If oItemSh.GetTypeName = "AcSmSheet" Then
Set oSheet = oItemSh
nSheetCount = nSheetCount + 1
strFileInfo(nSheetCount, 1) = oSheet.GetLayout.ResolveFileName
strFileInfo(nSheetCount, 2) = oSheet.GetNumber
ReDim Preserve strFileInfo(1, UBound(strFileInfo) + 1)
End If
Set oItemSh = oEnum.Next
Loop
MsgBox nSheetCount
Set oItem = oEnumDB.Next
Loop
End Sub
...或者集合或字典更适合使用?
**** Hidden Message ***** 如果我假装理解你想做什么(或者你的代码在做什么),即重新设置并保留2D数组的两个维度(看起来你想减少第一个维度并增加第二个维度),恐怕你不能。使用保留时,您只能调整最后一个维度的大小;在您的情况下是第二个维度。
如果您无法在这些行中解决您的挑战,您可能不得不滚动自己的(集合)类。
我的...迈克尔 我想知道有多少程序员使用下面的方法(此任务的脏方法)
无论如何,它是有效的
Sub test()
' define the first dimension of array approximately
Dim ar(9999, 1)
Dim i As Long, j As Long
' here you'll populate an array at runtime,
' as many as you need (of course you don't know how much)
' just for example
For i = 0 To 333
ar(i, 0) = i + 1: ar(i, 1) = i + 3
Next
' declare the new hard bounded array instead
ReDim newar(i - 1, 1)
While Not IsEmpty(ar(j, 0))
newar(j, 0) = ar(j, 0): newar(j, 1) = ar(j, 1)
j = j + 1
Wend
' return new array
End Sub
顺便说一句,我也喜欢使用集合
~'J'~
如果你不能在这些行中解决你的挑战,你可能不得不推出你自己的(收集)类。
我的...迈克尔
我想它会增加的。
谢谢你的信息。昨晚晚些时候我发布了这个后发现了这个。我会看看我能做些什么。
我更喜欢使用集合,但我不确定如何存储绘图的名称和布局选项卡名称,并能够将两者“链接”在一起。 我在这个上面画了一个空白。 您可以发布摘要吗?
谢谢。 听起来像一个锯齿阵列…这是你需要托管的信息吗
|Drawing1|
Layout1|
Layout2|
Drawing2|
Layout2 |
layot2
拉yout2<td>布局1|<td>布局2|<td><tr><td>布局4|>布局1 |
Layout5|
如果是这样的话,您可以通过多种方式做到这一点,而无需滚动自己的类,尽管滚动自己的类会对客户端应用程序隐藏混乱的细节,只暴露出使其看起来优雅所需的东西。我说过要出现,不是吗
一种方法是使用集合作为主容器,使用动态数组作为项。需要明确的是:集合中的每个项目都是一个动态二维数组,第一个维度始终为1(托管图形名称),第二个维度根据需要增长以托管多个(和变化的)布局名称。从表面上看,我喜欢这种方式,因为您的数据仍然是键入的
上述方法的一个变体是将集合中的每个项作为动态一维字符串数组。第一个数组元素是图形名称,后续元素是布局名称。比前面的更简单,并且您的数据仍然是键入的
另一种方法是使用集合集合。每个子集合都会根据需要增长,每个子集合中的第一项是图形名称,后续项是布局。从几何角度讲,将主集合视为垂直集合,将每个子集合视为水平集合。我能做到,但我对此并不挑剔
另一个是集合的动态数组;给猫剥皮的方法很多。并不是所有人都很好|高效
当然,所有这些都是杂乱无章的,这就是为什么.net提供了锯齿状数组(在lisp中,这是一个不言自明的问题)
Ackkk。 还可以创建承载动态数组的 UDT,然后创建所述 UDT 的动态数组。
嗯…锯齿状??!?从没听说过这个,但听起来像是我想要的。你能用英语说更多吗??
锯齿阵列只是阵列的阵列,其中每个阵列的长度可以变化。
例如,具有5个子阵列的阵列,第2项和第6项分别为
|item1|
item2|
item3|
item1 |
项目3|
项目4|
.td>项目2|
项目3|
|项目1|
项目2 |
|
在.NET中受支持(我在C#中试用过),但在VBA中不受支持,如前所述。UDT数组方法是最有效的内存方式,也是全类型的。
交错数组只是数组的数组,其中每个数组的长度可以变化。
例如,一个包含 5 个子数组的数组,每个子数组的长度分别为 3、4、3、2 和 6 --
| item1 |
项目2 |
项目3 |
|项目1 |
项目2 |
项目3 |
项目4 |
|项目1 |
项目2 |
项目3 |
|项目1 |
项目2 |
|项目1 |
项目2 |
项目3 |
项目4 |
项目5 |
项目6 |
在.NET中受支持(我在C#中尝试过它们),但在VBA中不受支持,如前所述。UDT 数组方法是最有效的内存方法,也是完全类型化的。
你有没有关于锯齿状数组和UDT的好链接或片段 - 这两件事我没有经验! 谢谢。
页:
[1]
2