【问题标题】:need to limit checkboxes to one per row using VBA需要使用 VBA 将复选框限制为每行一个
【发布时间】:2016-07-10 22:57:25
【问题描述】:

我正在使用以下代码在我拥有的每一行旁边创建复选框。可以有 500-2500 行,因此行数需要是动态的。

我正在尝试:

  1. 将工作表从一个工作簿复制到另一个工作簿
  2. 复制工作表后,在每行旁边添加复选框
  3. 我正在使用条件格式来删除 如果 K 为 TRUE,则行,复选框在 J 中。
  4. 我遇到的问题是,如果一行的格式在 高度,该行中出现两个复选框,它会影响 后续行。

这就是我使用的代码的样子。 请帮忙。

Sub create_new_wb_CHECKLIST()
    Sheets("Jobs by Day").Copy
    Dim ToRow As Long
    Dim LastRow As Long
    Dim MyLeft As Double
    Dim MyTop As Double
    Dim MyHeight As Double
    Dim MyWidth As Double
    LastRow = Range("I20000").End(xlUp).Row
    For ToRow = 2 To LastRow
    If Not IsEmpty(Cells(ToRow, "I")) Then            
        MyLeft = Cells(ToRow, "J").Left
        MyTop = Cells(ToRow, "J").Top
        MyHeight = Cells(ToRow, "J").Height
        MyWidth = MyHeight = Cells(ToRow, "J").Width        
        ActiveSheet.CheckBoxes.Add(MyLeft, MyTop, MyWidth, MyHeight).Select
         With Selection
            .Caption = ""
            .Value = xlOff
            .LinkedCell = "K" & ToRow
            .Display3DShading = False
         End With
      End If
  Next

List item

End Sub

【问题讨论】:

  • 您可以使用 'Rows(ToRow).RowHeight = X' 设置每行单元格的高度,其中 X 是您想要的值,以使每行的高度一致。否则,我建议您累积变量。例如:MyTop = MyTop + Rows(ToRow).RowHeight。您可能必须使用此累加器值的“幻数”偏移量来获得所需的内容。
  • 克里斯/斯科特,感谢您的及时回复!!!我会立即尝试并更新。再次感谢。

标签: vba excel checkbox


【解决方案1】:

在当前代码中间距是一个问题的原因是因为您从未设置复选框的Height,所以它设置为默认高度。 Add 方法中的参数只是告诉 VBA 在工作表上放置复选框的位置,它似乎并没有实际设置复选框的Height,因此框重叠基于行高。

我发现在With Selection 块内放置一个.Height = MyHeight 解决了它:

    With Selection
        .Caption = ""
        .Value = xlOff
        .LinkedCell = "K" & ToRow
        .Display3DShading = False
        .Height = myHeight
     End With

【讨论】:

  • Scott,.Height 效果很好,但仍然存在一些单元格获得多个框的问题。我认为这可能是我的数据的格式问题,并且某些单元格可能包含换行符/回车
  • 嘿,我想我明白了,为了摆脱回车,我为 ActiveSheet.UsedRange 中的每个 MyRange 添加了这个循环 If 0
【解决方案2】:

添加了以下内容,我认为我已排序。为格式错误的问题道歉,这是我第一次在堆栈上发帖。感谢大家的帮助!!!

为了去掉回车,我添加了这个循环

For Each MyRange In ActiveSheet.UsedRange
       If 0 < InStr(MyRange, Chr(10)) Then
        MyRange = Replace(MyRange, Chr(10), "")
    End If
Next

【讨论】:

    猜你喜欢
    • 2013-04-28
    • 2012-04-04
    • 2013-07-17
    • 1970-01-01
    • 2016-05-29
    • 1970-01-01
    • 2012-05-31
    • 2016-02-03
    • 2021-11-23
    相关资源
    最近更新 更多