首页 > 解决方案 > 使用 VBA 操作 Range.Adress 值

问题描述

场景:我正在使用一个代码(连同其他东西)让我获得 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:我知道如何在工作表中轻松执行此过程,也可以使用宏记录器来执行此操作,但我的目标是为此找到更好的解决方案。

标签: excelvba

解决方案


只需使用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!

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


推荐阅读