Это продолжение моего предыдущего вопроса (Получение информации об объектах OLEObject из книги с помощью VBA)
Сценарий: Я пытаюсь получить данные с листа. Данные могут быть обычными строками или числами или могут быть заключены в рамку с флажком (отмечен или нет).
Пример данных:
+---------+-------+------------------+------+------------------+
| item1 | 2004 | | | |
+---------+-------+------------------+------+------------------+
| value x | rfd | checkbox for rfd | nfd | checkbox for nfd |
+---------+-------+------------------+------+------------------+
| ident | test7 | call3 | | |
+---------+-------+------------------+------+------------------+
Наблюдения: В этом примере «флажок для rfd / nfd» является обычным флажком (либо form, либо 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) в первую таблицу в том месте, где изначально были установлены флажки where (location).
Проблема: Когда я пробую ту же процедуру для Form Control (вместо activex), у меня меньше вариантов, и хотя я могу их искать (ThisWorkbook.Sheets (1) .Shapes.Type = 8), я не могу найти их имя или местоположение.
Вопрос: Есть способ узнать их имя и местонахождение? Есть ли более эффективный способ достичь результата?
Цель:
+---------+-------+------------------+
| item1 | 2004 | | | |
+---------+-------+------------------+
| value x | rfd | 0 | nfd | 1 |
+---------+-------+------------------+
| ident | test7 | call3 | | |
+---------+-------+------------------+
Question: Is there a way to find their name and location? Is there a more efficient way to reach the result?
Да, есть метод .Object
... Я где-то отвечал на подобный пост. Позволь мне поискать это
Элементы управления, добавленные через панель инструментов форм, считаются фигурами. Так что Dim s as Shape
и прокрутка их как For Each s in ActiveSheet.Shapes
должны работать. s.Name
, s.TopLeftCell.Address
и s.BottomRightCell.Address
предоставляют одинаковые метаданные.
@SiddharthRout Я пройдусь по примерам, большое спасибо.
@JvdV Name отлично работает, я постараюсь найти одно для местоположения.
Краткое примечание:
Sub Test_retrieve()
вместо того, чтобы хранить его в массиве и перезаписывать, вы могли бы сделать это с помощью.Value = .Value
или дажеpastespecial values
?