我在Excel中使用VBA设计UI。我创建了两个类:bag和map。 它们的属性略有不同。我的地图如下所示:
如您所见,它由不同的矩形组成。我写了以下代码:
endNum = 87
For I = 3 To endNum
Top = Workbooks("Reference").Worksheets("Directory").Cells(I, 3)
Left = Workbooks("Reference").Worksheets("Directory").Cells(I, 4)
Width = Workbooks("Reference").Worksheets("Directory").Cells(I, 5)
Height = Workbooks("Reference").Worksheets("Directory").Cells(I, 6)
ID = Workbooks("Reference").Worksheets("Directory").Cells(I, 7)
Rotation = Workbooks("Reference").Worksheets("Directory").Cells(I, 10)
Name = Workbooks("Reference").Worksheets("Directory").Cells(I, 8)
TypeObj = Workbooks("Reference").Worksheets("Directory").Cells(I, 12)
Set sh = w.Shapes.AddShape(msoShapeRectangle, Left, Top, Width, Height)
sh.Select
Selection.ShapeRange.Fill.Visible = msoFalse
Selection.ShapeRange.Rotation = Rotation
Selection.ShapeRange.Title = Title
Next I
遍历每一行并创建形状并修改其属性。这很好,但形状类不允许我向其类添加自定义属性。每个框在实际应用中具有坐标x,y,z值。在对OO编程进行一些研究之后,我决定创建map类,然后使用这些对象在屏幕上构建我的形状(而不是引用excel表引用表)。这是我创建地图对象的代码:
Public Sub MapObjects()
Dim R As Variant
Dim C As Variant
Dim X As Long
With Workbooks("Reference").Worksheets("Directory").UsedRange
R = .Rows.Count
C = .Columns.Count
End With
Dim ObjArray(1 To 100) As Map
For X = 1 To UBound(ObjArray)
Set ObjArray(X) = New Map
Next
For X = 1 To UBound(ObjArray)
ObjArray(X).MID = Workbooks("Reference").Worksheets("Directory").Cells(X + 1, 1)
ObjArray(X).MTop = Workbooks("Reference").Worksheets("Directory").Cells(X + 1, 2)
ObjArray(X).MLeft = Workbooks("Reference").Worksheets("Directory").Cells(X + 1, 3)
ObjArray(X).MWidth = Workbooks("Reference").Worksheets("Directory").Cells(X + 1, 4)
ObjArray(X).MHeight = Workbooks("Reference").Worksheets("Directory").Cells(X + 1, 5)
ObjArray(X).MName = Workbooks("Reference").Worksheets("Directory").Cells(X + 1, 7)
ObjArray(X).MParent = Workbooks("Reference").Worksheets("Directory").Cells(X + 1, 8)
ObjArray(X).MRotation = Workbooks("Reference").Worksheets("Directory").Cells(X + 1, 9)
ObjArray(X).MTitle = Workbooks("Reference").Worksheets("Directory").Cells(X + 1, 10)
Next
此代码工作正常,但对象仅在Sub编译时持续。最后,他们全都消失了。我做了一些谷歌搜索,并发现一些文章建议我应该在Sub之外创建我的对象,所以我修改了我的代码:
Option Explicit
Dim ObjArray(1 To 100) As New Map
Public Sub MapObjects()
Dim R As Variant
Dim C As Variant
Dim X As Long
With Workbooks("Reference").Worksheets("Directory").UsedRange
R = .Rows.Count
C = .Columns.Count
End With
For X = 1 To UBound(ObjArray)
ObjArray(X).MID = Workbooks("Reference").Worksheets("Directory").Cells(X + 1, 1)
ObjArray(X).MTop = Workbooks("Reference").Worksheets("Directory").Cells(X + 1, 2)
ObjArray(X).MLeft = Workbooks("Reference").Worksheets("Directory").Cells(X + 1, 3)
ObjArray(X).MWidth = Workbooks("Reference").Worksheets("Directory").Cells(X + 1, 4)
ObjArray(X).MHeight = Workbooks("Reference").Worksheets("Directory").Cells(X + 1, 5)
ObjArray(X).MName = Workbooks("Reference").Worksheets("Directory").Cells(X + 1, 7)
ObjArray(X).MParent = Workbooks("Reference").Worksheets("Directory").Cells(X + 1, 8)
ObjArray(X).MRotation = Workbooks("Reference").Worksheets("Directory").Cells(X + 1, 9)
ObjArray(X).MTitle = Workbooks("Reference").Worksheets("Directory").Cells(X + 1, 10)
Next
不幸的是,代码已编译,但没有任何改变。好的。 以下是我的问题:
在第一个代码中,有没有办法可以创建一个模块化大小的Map类数组。我不希望它是0到100,这就是为什么我有R变量来告诉我最初在我的目录中有多少个对象。但是,当我将100更改为R或(R-1)时,它会给出一个错误,说它必须是常量。
有没有办法可以拥有永久类对象?我保存工作簿后保存到内存中,或者至少保存到WB打开之前,我希望它们保存在内存中。
地图对象不会移动很多,但用户可能会重新安排它们。对于bag对象,应用程序将自动分发它们,并在它们的类型匹配时将它们放置在地图对象上(例如,相同的维度)。但是,这不是游戏的结束。用户将重新安排它们并可能创建新的形状(我想我可以找到解决方案来应对这一挑战)。假设我可以解决#2,我希望每次用户移动它们时都能更新形状的位置(顶部和左侧)属性。如果不可能,请创建一个按钮以立即更新每个地图对象的属性(通过直通.a for循环...)。虽然这种方式对我很好,有没有更好的方法呢?
很抱歉让这么复杂,我真的非常感谢你的时间和耐心。如果已经问过这个问题,请原谅我。我是编程的文盲。这是我的第二个VBA编程任务。