Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/15.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从工作表中检索特定形状的名称和位置_Excel_Vba - Fatal编程技术网

Excel 使用VBA从工作表中检索特定形状的名称和位置

Excel 使用VBA从工作表中检索特定形状的名称和位置,excel,vba,Excel,Vba,这是我上一个问题() 场景:我正在尝试从工作表中检索数据。数据可能是普通字符串或数字,也可能包含在复选框中(无论是否选中) 数据示例: +---------+-------+------------------+------+------------------+ | item1 | 2004 | | | | +---------+-------+------------------+------+-------

这是我上一个问题()

场景:我正在尝试从工作表中检索数据。数据可能是普通字符串或数字,也可能包含在复选框中(无论是否选中)

数据示例:

+---------+-------+------------------+------+------------------+
| item1   | 2004  |                  |      |                  |
+---------+-------+------------------+------+------------------+
| value x | rfd   | checkbox for rfd |  nfd | checkbox for nfd |
+---------+-------+------------------+------+------------------+
| ident   | test7 | call3            |      |                  |
+---------+-------+------------------+------+------------------+
+---------+-------+------------------+
| item1   | 2004  |       |      |   |
+---------+-------+------------------+
| value x | rfd   | 0     |  nfd | 1 |
+---------+-------+------------------+
| ident   | test7 | call3 |      |   |
+---------+-------+------------------+
Obs:在本例中,“rfd/nfd复选框”是一个普通复选框(表单或activex),根据该表中的项目,可以选择其中一个

目标:我试图通过两个步骤阅读工作表:首先读取直接调用的所有数据,因此我使用以下代码:

Sub Test_retrieve()

' this will get all non object values from the sheet

Dim array_test As Variant
Dim i As Long, j As Long

array_test = ThisWorkbook.Sheets(1).UsedRange

For i = 1 To ThisWorkbook.Sheets(1).Cells(Rows.Count, 1).End(xlUp).Row
    For j = 1 To ThisWorkbook.Sheets(1).Cells(1, Columns.Count).End(xlToLeft).Column
        ThisWorkbook.Sheets(2).Cells(i, j) = array_test(i, j)
    Next j
Next i

End Sub
要获得:

+---------+-------+------------------+------+------------------+
| item1   | 2004  |                  |      |                  |
+---------+-------+------------------+------+------------------+
| value x | rfd   |                  |  nfd |                  |
+---------+-------+------------------+------+------------------+
| ident   | test7 | call3            |      |                  |
+---------+-------+------------------+------+------------------+
接下来,我将尝试实现工作表中的所有目标/形状。我使用以下代码获取所有activex对象的名称、值(未选中)和位置:

Sub getavticeboxvalue()

    ' this will get the names and values (as binary) of all the activex controlbox objects in the sheet

    Dim objx As Object
    Dim i As Long

    i = 1

    For Each objx In ThisWorkbook.Sheets(1).OLEObjects

        If objx.Object.Value = True Then
            ThisWorkbook.Sheets(3).Cells(i, 1).Value = 1
            ThisWorkbook.Sheets(3).Cells(i, 2).Value = objx.Name
            ThisWorkbook.Sheets(3).Cells(i, 3).Value = objx.BottomRightCell.Address

        ElseIf objx.Object.Value = False Then
            ThisWorkbook.Sheets(3).Cells(i, 1).Value = 0
            ThisWorkbook.Sheets(3).Cells(i, 2).Value = objx.Name
            ThisWorkbook.Sheets(3).Cells(i, 3).Value = objx.BottomRightCell.Address
        End If
        i = i + 1

    Next objx

End Sub
这会产生如下结果:

+-------+-----------+----------+
| value | name      | location |
+-------+-----------+----------+
| 0     | checkbox1 | $C$2     |
+-------+-----------+----------+
| 1     | checkbox2 | $E$2     |
+-------+-----------+----------+
然后,我将继续将值(1和0)输入到第一个表中,即复选框最初所在的位置(位置)

问题:当我尝试对表单控件(而不是activex)执行相同的过程时,我的选项较少,尽管我可以查找它们(ThisWorkbook.Sheets(1).Shapes.Type=8),但我找不到它们的名称或位置

问题:有没有办法找到他们的名字和位置?有没有更有效的方法来达到这个结果

目标:

+---------+-------+------------------+------+------------------+
| item1   | 2004  |                  |      |                  |
+---------+-------+------------------+------+------------------+
| value x | rfd   | checkbox for rfd |  nfd | checkbox for nfd |
+---------+-------+------------------+------+------------------+
| ident   | test7 | call3            |      |                  |
+---------+-------+------------------+------+------------------+
+---------+-------+------------------+
| item1   | 2004  |       |      |   |
+---------+-------+------------------+
| value x | rfd   | 0     |  nfd | 1 |
+---------+-------+------------------+
| ident   | test7 | call3 |      |   |
+---------+-------+------------------+

快速提示:
Sub-Test\u retrieve()
您可以使用
.Value=.Value
甚至
粘贴特殊值来完成它,而不是将其存储在数组中并重写?
问题:有办法找到它们的名称和位置吗?是否有更有效的方法来达到结果?
是的,有
.Object
方法。。。我曾在某处回复过类似的帖子。让我搜索一下,通过表单工具栏添加的控件被认为是形状。因此,
将s设置为Shape
并像
一样在ActiveSheet中的每个s中循环。Shape
应该可以工作
s.Name
s.TopLeftCell.Address
s.BottomRightCell.Address
为您提供相同的元数据。