excel 在VBA中向“允许编辑区域”添加大量单元格?

s4n0splo  于 2023-02-05  发布在  其他
关注(0)|答案(1)|浏览(219)

因此,我尝试使用VBA将表单中的可填充字段设置为“允许的编辑范围”x1c 0d1x
表单上的大多数字段都是合并的,这样我就可以循环执行get a selection,然后选择/取消选择单元格,直到达到所需的精确集合。

但是,范围定义如下所示$E$24:$G$24,$E$25:$G$25,$E$26:$G$26,$E$27:$G$27,$J$24:$L$24,$J$25:$L$25,$J$26:$L$26,$J$27:$L$27,$O$24:$Q$24,$O$25:$Q$25,$O$26:$Q$26,$O$27:$Q$27
由于我在这个表单上有更多的字段,这成为一个问题,因为“允许的编辑范围”最多只能达到254个字符。
我想要的是这样一个较短范围的定义

E24:G27,J24:L27,O24:Q27

然后我可以将其添加到“允许编辑范围”中
目前,我正在遍历表单中的每个单元格,并联合任何合并的单元格

Sub SelectMergedCells()
Dim scan_range As Range
Dim cell As Range
Dim merge_range As Range
    
Set scan_range = ActiveSheet.Range("B11:AM69")

For Each cell In scan_range
    If cell.MergeCells Then
        If merge_range Is Nothing Then
            Set merge_range = cell
        Else
            Set merge_range = Union(merge_range, cell)
        End If
    End If
Next cell

merge_range.Select

End Sub

是否有更好的方法来选择单元格?是否有方法将选择定义缩短?或者是否必须将定义分解为多个254个字符块并添加多个范围?
短暂性脑缺血发作

omvjsjqw

omvjsjqw1#

如果我理解正确,如果您不介意使用选择......这是对这句话的回答:
我想要的是这样一个较短范围的定义
因此,也许您想看看下面的代码来帮助您入门....
工作表中的合并单元格是这样的(请忽略填充颜色,因为它们用于更容易地查看合并范围)。

预期结果:
F3:H3,H5:J6,F7:G7,A7:C8,I8:J11,E9:G11,A2:C4,F2:G2
所以在我宏记录了我的手动过程之后,我对它做了一些修改,
代码是这样的:

Sub test()
Dim rg As Range: Dim c As Range: Dim rgU As Range
Application.ScreenUpdating = False

Set rg = Range("A1:J12"): rg(1, 1).Activate
'Set rg = Range("A1:N6"): rg(1, 1).Activate

    With Application.FindFormat
        .WrapText = False
        .ShrinkToFit = False
        .MergeCells = True
    End With
    
    Set c = rg.Find(What:="", After:=ActiveCell, LookIn:=xlFormulas, LookAt:= _
        xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False _
        , SearchFormat:=True)
        
    If Not c Is Nothing Then
        fa = c.Address
        Do
            c.Select
            If rgU Is Nothing Then _
                Set rgU = Selection _
                    Else Set rgU = Union(rgU, Selection)
                Set c = rg.Find(What:="", After:=ActiveCell, LookIn:=xlFormulas, LookAt:= _
                xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False _
                    , SearchFormat:=True)
        Loop While c.Address <> fa
    End If

    Debug.Print Replace(rgU.Address, "$", "")
    Application.FindFormat.Clear
    
End Sub

调试打印结果与预期结果相同:
F3:H3,H5:J6,F7:G7,A7:C8,I8:J11,E9:G11,A2:C4,F2:G2
基本上,sub是循环到一个合并为c变量的单元格。

    • 选择c**,并创建rgU变量作为rgU和选择(不是c)的并集。

使用与本例类似的合并单元格进行测试:

调试打印结果如下:
A2:C5,F2:H5,K2:M5
由于我在这个表单上有更多的字段,这成为一个问题,因为"允许的编辑范围"最多只能达到254个字符。
刚才我测试了rg为A1:AQ75的代码(乘以已有的合并单元格),虽然rgU.select显示了正确的结果,但是很抱歉,debug.print rgU.address只到了单元格R17。
因此,即使这个$E$24:$G$24,$E$25:$G$25,$E$26:$G$26,$E$27:$G$27字符串已经像E24:G27这样缩短,我的代码仍然是无用的,因为我认为如果合并单元格的范围太大(在我的情况下是单元格AQ75,在您的情况下是单元格AM69),它仍然无法显示地址,直到合并单元格的最后一列和最后一行。
因此,需要在rgU内循环以获取所有合并单元地址:
for each cell in rgU.areas:debug.print cell.address:next
最后一个循环结果为$AO$97:$AQ$75
顺便说一句,关于允许的编辑范围,你不能只使用你的merge_range变量作为引用而不需要它的地址吗?

相关问题