【发布时间】:2016-02-10 09:23:56
【问题描述】:
我正在尝试创建一个用户表单,人们可以根据需要提出任意数量的请求,并且能够删除他们不再需要的请求以及其他功能。在按顺序使用函数 add-remove-add 后删除动态创建的对象时遇到问题。
我下面的代码有一个添加到用户表单的对象的 sn-p,以及用户表单的尺寸更改和已经嵌入用户表单的对象。其他定义的部分不包括在下面。
Dim RemoveButtonArray() As New Class_RemoveRequest
For i = Last To Last
Set AddRemoveButton = GenPurchaseRequest.Controls.Add("Forms.Image.1", "btnRemove" & ObjID)
With AddRemoveButton
'properties
End With
Set AddRemoveLabel = GenPurchaseRequest.Controls.Add("Forms.Label.1", "lblRemove" & ObjID)
With AddRemoveLabel
'properties
End With
Set AddRequest = GenPurchaseRequest.Controls.Add("Forms.Frame.1", "Frame" & ObjID)
With AddRequest
'properties
.Caption = "Purchase Request - " & ObjID
End With
With AddRequestButton
.Top = 168 + (126 * i)
.Left = 18
End With
With SubmitButton
.Top = 168 + (126 * i)
.Left = 200
End With
With CancelButton
.Top = 168 + (126 * i)
.Left = 381
End With
With GenPurchaseRequest
.ScrollHeight = 200 + (126 * i)
.ScrollTop = 200 + (126 * i)
End With
ReDim Preserve RemoveButtonArray(0 To i)
Set RemoveButtonArray(i).RemoveButton = AddRemoveButton
Next i
ObjID = ObjID + 1
Last = Last + 1
这很好用,并且表单中的所有内容都正确填充。当用户删除请求时,以下代码也可以正常工作:
Public WithEvents RemoveButton As MSForms.Image
Private Sub RemoveButton_click()
Dim ConfirmRemoval As Integer
Dim rbRefNo As String
Dim rbRefNoConvert As Integer
ConfirmRemoval = MsgBox("Are you sure you would like to remove this request?", vbYesNo)
If ConfirmRemoval = vbYes Then
rbRefNo = Mid(Me.RemoveButton.Name, 10)
rbRefNoConvert = CInt(rbRefNo)
With GenPurchaseRequest
If Last > 1 Then
.Controls.Remove ("Frame" & rbRefNo)
.Controls.Remove ("btnRemove" & rbRefNo)
.Controls.Remove ("lblRemove" & rbRefNo)
For i = rbRefNoConvert + 1 To Last - 1
.Controls("Frame" & i).Top = .Controls("Frame" & i).Top - 126
.Controls("btnRemove" & i).Top = .Controls("btnRemove" & i).Top - 126
.Controls("lblRemove" & i).Top = .Controls("lblRemove" & i).Top - 126
Next i
.AddRequestButton.Top = .AddRequestButton.Top - 126
.SubmitButton.Top = .SubmitButton.Top - 126
.CancelButton.Top = .CancelButton.Top - 126
.ScrollTop = .ScrollTop - 126
.ScrollHeight = .ScrollHeight - 126
Last = Last - 1
Else
MsgBox "There is only one active Purchase Request."
End If
End With
Else
'do nothing
End If
End Sub
然后用户可以返回添加其他请求以及删除他们不再需要的更多请求。当他们添加更多请求然后尝试删除在删除后直接添加的最后一个请求时,就会出现问题。例如:我添加了 4 个请求,然后删除了第 2 个。然后我添加了另一个请求,但想删除第 4 个请求,但是删除按钮不再起作用。
我认为问题是我需要在调用删除按钮功能后重新定义用于存储删除按钮的数组,但是我不知道该怎么做。我目前的尝试是:
For j = 0 To Last
If j = rbRefNoConvert Then
j = j + 1
Else
ReDim RemoveButtonArray(0 To j)
Set RemoveButtonArray(j).RemoveButton = AddRemoveButton
End If
Next j
但是那个对象引用不正确,我不知道如何正确引用它。我尝试引用控件本身,但这不起作用。
我对类模块、数组和动态用户表单的使用非常陌生,很抱歉这个冗长的问题!
任何帮助将不胜感激!
【问题讨论】:
-
那里有很多代码,所以很难弄清楚到底发生了什么。仅使用一组按钮的更简单示例可能更容易理解。无需在删除订单时重新组织数组,您只需将数组中的该成员设置为 Nothing,然后将任何新订单添加到数组末尾(根据需要扩展)。要重新排列表单布局,只需遍历数组,忽略“空”成员。
-
This answer 说明如何从数组中删除元素可能会有所帮助。
-
@TimWilliams - 我与数组一起使用的唯一控件是需要事件处理程序的控件。使用您的示例,我是否需要将所有控件放入单独的数组中?
-
我认为这里的代码太多,缺少的部分太多:这会让其他人的测试变得困难。除非您可以共享工作簿,否则您可能不会在这方面获得太多帮助...
-
@TimWilliams - 最好使用具有相同问题的简化代码而不是真实代码发布问题?此外,我能够解决这个问题。感谢您的帮助!
标签: vba excel dynamic-arrays userform