Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel VBA:从表单控件获取值_Vba_User Controls_Excel - Fatal编程技术网

Excel VBA:从表单控件获取值

Excel VBA:从表单控件获取值,vba,user-controls,excel,Vba,User Controls,Excel,在工作表sheet1中嵌入了一个名为combobox\u test的表单控件组合框,它选择了值x 除此之外,我还添加了一个按钮,当我按下它时,我希望它获取combobox\u test的值,并将其放置在something.Rows(y)中。但是我不能让它工作,我有点沮丧。也许你能给我指出正确的方向 Sub ButtonPressed_sample() Dim value As String Set putItRng = Range("theCells")

在工作表
sheet1
中嵌入了一个名为
combobox\u test
的表单控件组合框,它选择了值
x

除此之外,我还添加了一个按钮,当我按下它时,我希望它获取
combobox\u test
的值,并将其放置在
something.Rows(y)
中。但是我不能让它工作,我有点沮丧。也许你能给我指出正确的方向

Sub ButtonPressed_sample()
    Dim value As String

    Set putItRng = Range("theCells")        
    putItRng.Rows(1) = ActiveSheet.Shapes("combobox_test").Value        
End Sub
有什么建议吗?我是VBA的绝对初学者,所以请尽可能详细。谢谢

putItRng.Rows(1)= ActiveSheet.combobox_test.value
尝试:


如果它不起作用,那么您的组合框就不会被命名为“combobox\u test”

我不确定这是您想要的,但这是一个开始。形状对象没有值属性,这是错误的来源。有一个已弃用但仍然可用的下拉对象

Sub ButtonPressed_sample()

    Set putitrng = Range("theCells")
    putitrng.Rows(1) = ActiveSheet.DropDowns("combobox_test").value

End Sub

如前所述,形状组合框没有值属性

我使用Shape对象的DrawingObject属性来获取一个复选框FormControl对象。然后,可以像使用任何其他FormControl一样使用此复选框对象

您还应该能够使用DrawinObject从Shape对象中获取ComboBox对象集

如果要获取选定的文本,可以尝试剪切以下代码:

Dim sh as Shape
Dim cB as ComboBox
For Each sh In ws.Shapes
    If sh.Type = msoFormControl Then
        If TypeOf sh.DrawingObject Is ComboBox Then
            Set cB = sh.DrawingObject
            ... 
            your code for getting the Data from ComboBox
            ...
        End If
    End If
Next

谢谢你一直在争论这个话题,但这个话题给了我一个答案。我不知道method1和method2引用类型有什么区别,可以使用
.value |.List
属性读取值。如果有一个完全类型化的obj变量就好了

Dim obj As Object
Set obj = ws.DropDowns("combo1")  ' method 1
Set obj = ws.Shapes("combo1").ControlFormat  ' method 2
Debug.Print obj.value & "|" & obj.List(obj.value)  ' 1...n|Text1,Text2,..n
    

运行时错误
438
。对象不支持此属性或方法。。。它显示了行
putItRng.Rows(1)=ActiveSheet.Shapes(“组合框测试”)。值
您必须通过ActiveWorkbook.ActiveSheet引用('因为多个工作簿每个都有一个ActiveSheet')。行(1)提供了行1中所有列的整个范围。。。一步一步来。尝试使用两个Msgbox查找问题的真正根源,一个用于上述建议作业的左侧,另一个用于右侧。这将更好地查明问题所在。我猜您的对象命名是错误的。请注意,不推荐使用下拉列表(以及组合框、按钮等),因为如果您选择将多个形状分组在一起,则分组中的控件不会出现在这些集合对象中。因此,我想这条评论只是一个警告,不要将控件放入任何分组形状中,只要您使用此方法(我自己也使用此方法):)虽然这可以回答问题,但最好解释为什么它是正确的解决方案。投票率最高的答案引用下拉列表,但是Alain提到这是不推荐的,因为“如果您选择将多个形状分组在一起,则分组中的控件不会出现在这些集合对象中”。shapes集合是引用combobox表单控件的另一种方法,但是Carlos post对我不起作用。我只是尝试了
ActiveSheet.shapes(“combobox\u test”).ControlFormat.Value
,发现它得到了相同的结果。一些场景可能会发现这是一种更合适的编码风格。谢谢。完美的
ActiveSheet.Shapes("combobox_test").ControlFormat.ListIndex
Dim sh as Shape
Dim cB as ComboBox
For Each sh In ws.Shapes
    If sh.Type = msoFormControl Then
        If TypeOf sh.DrawingObject Is ComboBox Then
            Set cB = sh.DrawingObject
            ... 
            your code for getting the Data from ComboBox
            ...
        End If
    End If
Next
Dim obj As Object
Set obj = ws.DropDowns("combo1")  ' method 1
Set obj = ws.Shapes("combo1").ControlFormat  ' method 2
Debug.Print obj.value & "|" & obj.List(obj.value)  ' 1...n|Text1,Text2,..n