Получение имени и местоположения определенных фигур из рабочего листа с помощью VBA

Это продолжение моего предыдущего вопроса (Получение информации об объектах 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 |      |   |
+---------+-------+------------------+

Краткое примечание: Sub Test_retrieve() вместо того, чтобы хранить его в массиве и перезаписывать, вы могли бы сделать это с помощью .Value = .Value или даже pastespecial values?

Siddharth Rout 18.12.2018 14:41
Question: Is there a way to find their name and location? Is there a more efficient way to reach the result? Да, есть метод .Object ... Я где-то отвечал на подобный пост. Позволь мне поискать это
Siddharth Rout 18.12.2018 14:44
Один пример
Siddharth Rout 18.12.2018 14:46
Еще один
Siddharth Rout 18.12.2018 14:48

Элементы управления, добавленные через панель инструментов форм, считаются фигурами. Так что Dim s as Shape и прокрутка их как For Each s in ActiveSheet.Shapes должны работать. s.Name, s.TopLeftCell.Address и s.BottomRightCell.Address предоставляют одинаковые метаданные.

JvdV 18.12.2018 14:48

@SiddharthRout Я пройдусь по примерам, большое спасибо.

DGMS89 18.12.2018 14:51

@JvdV Name отлично работает, я постараюсь найти одно для местоположения.

DGMS89 18.12.2018 14:51
Преобразование HTML-таблицы в профессиональный документ Excel
Преобразование HTML-таблицы в профессиональный документ Excel
Это самый простой способ создания Excel из HTML-таблицы.
Импорт excel в laravel в базу данных
Импорт excel в laravel в базу данных
Здравствуйте, дорогой читатель, в этой статье я расскажу практическим и быстрым способом, как импортировать файл Excel в вашу базу данных с помощью...
2
7
523
0

Другие вопросы по теме