用VBA操纵Range.Adress值

时间:2018-12-19 12:40:13

标签: excel vba excel-vba

场景::我正在使用一个代码(除其他功能外)以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 :(得分:1)

仅使用Range.RowRange.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!

(源自“您是否不使用它的原因?”评论完整答案,以便将该问题标记为已回答-显然原因是“糟糕”)