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
为您提供相同的元数据。