无法读取CheckBox的值

时间:2011-08-22 18:28:44

标签: excel vba excel-vba

我遇到了一个奇怪的问题。 我有一个看起来像图像中的表单 enter image description here

这些复选框是用这样的代码生成的(有一个循环增加了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它可以正常工作

3 个答案:

答案 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