Манипулировать Range.Adress значение с VBA - PullRequest
0 голосов
/ 19 декабря 2018

Сценарий: Я работаю с кодом, который (наряду с другими вещами) возвращает мне расположение флажков на листе в формате xlR1C1.

Цель: Поскольку мне приходится манипулировать этим значением для выполнения других операций, я пытаюсь преобразовать этот адрес в пригодную для использования пару значений (строку и столбец), которые я могу использовать.

То, что я уже пробовал: Несколько запутанно, я смог прочитать адреса в виде строки и выполнить несколько операций для извлечения обоих чисел (с разделением, слева и так далее).

Вопрос: Есть ли лучший / более эффективный способ выполнения этой операции?

Код: Получает расположение флажка и получает первыйзначение (номер строки) с адреса:

Sub getControlValues() 

    Dim cb As Shape
    Dim i As Long

    i = 1

    'Loop through Form Checkboxes
    For Each cb In ThisWorkbook.Sheets(1).Shapes
        If cb.Type = msoFormControl Then
            If cb.FormControlType = xlCheckBox Then
                If cb.ControlFormat.Value = xlOn Then
                    ThisWorkbook.Sheets(3).Cells(i, 1).Value = "X"
                    ThisWorkbook.Sheets(3).Cells(i, 2).Value = cb.Name
                    ThisWorkbook.Sheets(3).Cells(i, 3).Value = cb.BottomRightCell.Address(, , xlR1C1)
                    ThisWorkbook.Sheets(3).Cells(i, 4).Value = Split(ThisWorkbook.Sheets(3).Cells(i, 3), "C")
                    'ThisWorkbook.Sheets(3).Cells(i, 4).Value = cb.Type
                ElseIf cb.ControlFormat.Value = xlOff Then
                    ThisWorkbook.Sheets(3).Cells(i, 1).Value = ""
                    ThisWorkbook.Sheets(3).Cells(i, 2).Value = cb.Name
                    ThisWorkbook.Sheets(3).Cells(i, 3).Value = cb.BottomRightCell.Address(, , xlR1C1)
                    ThisWorkbook.Sheets(3).Cells(i, 4).Value = Split(ThisWorkbook.Sheets(3).Cells(i, 3), "C")
                End If
            i = i + 1
            End If
        End If
    Next cb

End Sub

Obs: Я знаю, как легко выполнить эту процедуру на листе, и я также могу использовать это для записи макросов, но мойЦель состоит в том, чтобы найти лучшее решение для этого.

1 Ответ

0 голосов
/ 19 декабря 2018

Просто используйте Range.Row и Range.Column?(например, cb.BottomRightCell.Row)

If cb.ControlFormat.Value = xlOn Then
    ThisWorkbook.Sheets(3).Cells(i, 1).Value = "X"
    ThisWorkbook.Sheets(3).Cells(i, 2).Value = cb.Name
    ThisWorkbook.Sheets(3).Cells(i, 3).Value = cb.BottomRightCell.Address(, , xlR1C1)
    'ThisWorkbook.Sheets(3).Cells(i, 4).Value = Split(ThisWorkbook.Sheets(3).Cells(i, 3), "C") 'Nope!
    ThisWorkbook.Sheets(3).Cells(i, 4).Value = cb.BottomRightCell.Row ' Tada!

(Повышен из "Есть ли причина, по которой вы не используете это?") Комментарий к полному ответу, так что вопрос можно пометить как ответивший- видимо, причина была "Ой")

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...