我遇到了一个奇怪的问题。 我有一个看起来像图像中的表单
这些复选框是用这样的代码生成的(有一个循环增加了i和l ......一切都很好,因为其他组件是通过同一段代码生成的,我没有得到他们的价值的问题):
Public Sub AddCboxs(form, masina, nrmasini, replicare, nrcboxs)
Dim i, k, l As Integer
i = 0
l = 1
Do While i < nrmasini
Do While l < nrcboxs + 1
Set cControl = form.Controls("iooly" & i).Add("Forms.CheckBox.1", "sc" & l & "oly" & i, True)
With cControl
.Width = 15
.Height = 16
.Top = 200 + k
.Left = 205
End With
k = k + 35
l = l + 1
Loop
l = 1
k = 0
i = i + 1
Loop
End Sub
现在......我想做以下事情。如果选中了SC复选框,我想做一些你会在下面的代码中看到的东西...没有检查复选框的值,代码工作得很好,做了我想做的事......但是问题是我需要在选中复选框时才这样做。
Public Sub CalcOly()
Dim i, j, k As Integer
Dim Rand, ContorVal, ContorTotal As Long
Dim ws As Worksheet
Set ws = Worksheets("Config")
Dim cControl As Control
i = 0
j = 1
ContorVal = 0
Do While i < 5
Do While j < 3
Rand = 30
If raport.Controls("sc" & j & "oly" & i).Value = True Then
Do While ws.Cells(Rand, 1).Value <> "" And Rand < 65536
If ws.Cells(Rand, 1).Value = raport.Controls("combo" & j & "oly" & i).Value Then
Set cControl = raport.Controls("iooly" & i).Add("Forms.Label.1", "valoare" & j & "oly" & i, True)
With cControl
.Caption = Int(ws.Cells(Rand, 2).Value * raport.Controls("q" & j & "oly" & i).Value) & " RON"
.Width = 55
.Height = 14
.Top = 42 + k
.Left = 225
End With
ContorVal = ContorVal + Int(ws.Cells(Rand, 2).Value * raport.Controls("q" & j & "oly" & i).Value)
End If
Rand = Rand + 1
Loop
End If
j = j + 1
k = k + 35
Loop
Set cControl = raport.Controls("iooly" & i).Add("Forms.Label.1", "totalval" & "oly" & i, True)
With cControl
.Caption = ContorVal & " RON"
.Width = 55
.Height = 14
.Top = 350
.Left = 225
End With
k = 0
j = 1
i = i + 1
ContorVal = 0
Loop
End Sub
现在这是奇怪的事情......如果我点击CALCUL VALOARE(调用CalcOly程序)它会执行代码,但无论是否选中了SC复选框,或者没有显示任何值。如果我继续登录奥林匹亚4或奥林匹亚5,它会做它需要做的事情,但是再次......如果选中了SC复选框,则忽略它。 我试图在单独的标题中获取复选框的值,我发现它没有得到它......我真的不知道为什么! 非常感谢你的帮助!
稍后:http://www.youtube.com/watch?v=mPb617JxgtI我上传了一段视频,了解该应用有多奇怪。我没有得到它...如果我删除如果检查复选框是True还是False它可以正常工作
答案 0 :(得分:0)
您应该向我们展示生成第一个复选框的代码段,特别是如果您的其他复选框正常工作。
那说了几件事:
在VBA中,您不能以这种方式声明变量:
Dim i, j, k As Integer
Dim Rand, ContorVal, ContorTotal As Long
你必须这样做:
Dim i As Integer, j As Integer, k As Integer
Dim Rand As Long, ContorVal As Long, ContorTotal As Long
请参阅here
<强>调试强>
在调试用户表单时看到了什么? raport.Controls("sc" & j & "oly" & i)
存在吗?
以同样的方式,您应该查看raport.Controls()
集合以查看元素及其属性。
这会告诉你控件是否真的按照你想要的方式创建。
答案 1 :(得分:0)
这似乎有点模糊,但是来自Add
属性的Controls
方法的帮助:
如果在运行时添加控件,则必须使用感叹号语法 引用该控件的属性。例如,要返回 在运行时添加的控件的Text属性,使用以下内容 语法:
userform1!thebox.text
您可以尝试更改:
If raport.Controls("sc" & j & "oly" & i).Value = True Then
为:
If raport!("sc" & j & "oly" & i).Value = True Then
编辑:我最初使用一个单独的变量来构建字符串,但这不起作用,因为程序会查找与变量同名的控件而不是变量的值
edit2:如果这不起作用,你可以尝试:
If raport!"sc" & j & "oly" & i.Value = True Then
但这取决于!
和.
相对于&
答案 2 :(得分:0)
只需使用这些按钮点击
即可if checkboxname.value = true then
invoke your function
end if