场景::我正在使用一个代码(除其他功能外)以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 :我知道如何轻松地在工作表中执行此过程,也可以使用宏记录器来执行此操作,但是我的目标是为此找到更好的解决方案。
答案 0 :(得分:1)
仅使用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!
(源自“您是否不使用它的原因?”评论完整答案,以便将该问题标记为已回答-显然原因是“糟糕”)