【问题标题】:Excel VBA Increment Range by 1 across SubsExcel VBA 跨 Subs 的增量范围为 1
【发布时间】:2018-07-25 15:07:47
【问题描述】:

由于我对最后一个问题不太清楚。我是新手,在如何实施任何答案方面需要一些指导。

我目前有以下代码分布在不同的按钮上,因此分布在不同的 Subs 上。为了清楚起见,我将需要从代码中递增 1 的范围分开,并将每次按下按钮时我需要递增 1 的值加粗。我很欣赏这打破了格式,我道歉。

点击“InsertNewBill”按钮后数量会增加:

Private Sub InsertNewBill_Click()
    'I AM USING i TO STORE THE CELL INCREMENT, IT CURRENTLY DOES NOTHING**
    Dim i As Integer

范围("A30:AC30").选择

range("AC30").Activate

    Selection.Copy
    Selection.Insert Shift:=xlDown
End Sub

Private Sub DeleteTickBoxes_Click()
    'Variables
    Dim c As CheckBox
    Dim CellRange As Range
    Dim cel As Range

设置 CellRange = ActiveSheet.Range("E7:F30")

    'Delete Checkboxes within the specified range above on the ActiveSheet Only
    For Each c In ActiveSheet.CheckBoxes
        If Not Intersect(c.TopLeftCell, CellRange) Is Nothing Then
            c.Delete
        End If
    Next    
    'Insert New Checkboxes and Assign to a specified link cell using the offset
    For Each cel In CellRange
        'you can adjust left, top, height, width to your needs
        Set c = ActiveSheet.CheckBoxes.Add(cel.Left, cel.Top, 30, 6)
        With c   'Clears the textbox so it has no text
            .Caption = ""
            'Offset works by offsetting (Row offset, Column Offset) and accepts
            'positive for down/right and negative for left/up,
            'keep in not that the linked cells will automatically populate with true/false
            .LinkedCell = cel.Offset(0, -4).Address
        End With
    Next
    Call CentreCheckbox_Click
End Sub

我需要所有加粗的值都加一。即从 F30 到 F31 和 A30:AC30 到 A31:AC31。 这个值也需要从 InsertNewBill_Click 子传递到 DeleteTickBoxes_Click 子。

我假设我需要删除 Private 子并且可能有一个公共整数变量? 我只是不确定如何在每次单击按钮后仅将数字增加 1。

感谢您的所有帮助

【问题讨论】:

  • 假设你所有的代码都在同一个模块中?在模块顶部声明一个公共变量(即Public iRowNum as Long)。您可以将此变量设置为行号并在您的代码中使用它(即Range("A" & iRowNum & ":AC" & iRowNum).Copy
  • @Zac 谢谢!我会看看我能实现什么。所有代码都在同一个模块中。

标签: vba excel


【解决方案1】:

您应该尝试停止使用SelectActivate - 在这种情况下您可以只使用Copy 范围:

Range(cells(30,"A"),cells(30,"AC")).Copy

要添加 i 作为偏移量,您可以使用:

Range(cells(30+i,"A"),cells(30+i,"AC")).Copy

或者你可以使用:

Range(cells(30,"A"),cells(30,"AC")).Offset(i,0).Copy

要让 i 在工作簿中的其他 Subs 中工作,请将其声明为 Public

除非您确定该值将保持在较低水平,否则我建议将其声明为 Long,而不是 Integer

对于Set CellRange = ActiveSheet.Range("E7:F30") 设置,您可以使用:

Set CellRange = ActiveSheet.Range("E7:F" & 30 + i)

【讨论】:

  • 感谢您输入CLR。为什么使用 select 和 Activate 是一个不好的选择?不幸的是,这一切都是使用宏输入记录的,所以这可能是它不理想的原因。道歉。我将尝试实施您的建议,看看效果如何:)
  • 我会的,感谢您在这方面的所有帮助。谢谢大家的支持:)
  • 您不想使用SelectActivate.. 的原因很简单,因为它们对于VBA 毫无意义。因为您已经有了对象,所以您可以直接引用单元格\范围\工作表并让 VBA 为您整理其余部分(使用对象的力量)。也因为他们无缘无故地花费时间和资源。 VBA 中最无意义的功能之一
【解决方案2】:

使用公共变量并将其连接到您的地址中。在工作簿打开事件中将值初始化为 30。

本工作簿:

Option Explicit
Public i As Long
Private Sub Workbook_Open()
    i = 30
End Sub

标准模块:

Option Explicit
Private Sub button2_Click()
    ThisWorkbook.i = ThisWorkbook.i + 1
    Debug.Print ActiveSheet.Range("E" & ThisWorkbook.i & ":F" & ThisWorkbook.i).Address
End Sub

【讨论】:

  • 这太棒了!我现在要看看是否可以将其压缩到我的工作表中。我会回来报告的
  • 我将如何在其中实现i 值? range("A30:AC30").Select。我看这个的方式需要range("A & ThisWorkbook.i : AC & ThisWorkbook.i ").Address 但是你不能将它嵌套在“”标记内
  • 感谢您的更新。好像就这样破解了。我将实施您的建议和@CLRs 来帮助整理它。不感兴趣。每当打开工作簿时,我假设的 i 值将其自身设置为 30 对吗?还是永久存储?
  • 尝试运行“InsertNewBill”按钮时出现以下错误。任何建议:ThisWorkbook.i + 1的“方法或数据成员未找到”
  • 你有没有把ThisWorkbook代码放在ThisWorkbook而不是标准模块里?
【解决方案3】:

对于那些感兴趣的人。这是我最终使用的 VBA,因为它符合我的目的。

Sub InsertNewBill_Click()
Dim rngCopy As range
Dim rngPaste As range
Dim clearCell As range

i = Cells(30, 1) + 1
    Cells(30, 1) = i

ActiveSheet.range("A" & i & ":AD" & i).Insert

Set rngPaste = range("A" & i & ":AD" & i)
Set rngCopy = ActiveSheet.range("A" & i - 1 & ":AD" & i - 1)

rngCopy.Copy
rngPaste.PasteSpecial Paste:=xlPasteAll

With ActiveWorkSheet
    Cells(i, 1).ClearContents
End With

Call DeleteTickBoxes_Click

End Sub

*

Private Sub DeleteTickBoxes_Click()

'Variables
Dim c As CheckBox
Dim CellRange As range
Dim cel As range

i = Cells(30, 1)

Set CellRange = ActiveSheet.range("F" & i & ":G" & i)

'Delete Checkboxes within the specified range above on the ActiveSheet Only
For Each c In ActiveSheet.CheckBoxes
If Not Intersect(c.TopLeftCell, CellRange) Is Nothing Then
c.Delete
End If

Next

'Insert New Checkboxes and Assign to a specified link cell using the offset
For Each cel In CellRange
    Set c = ActiveSheet.CheckBoxes.Add(cel.Left, cel.Top, 30, 6) 'you can adjust left, top, height, width to your needs
    With c
        'Clears the textbox so it has no text
        .Caption = ""

        'Offset works by offsetting (Row offset, Column Offset) and accepts positive for down/right and negative for left/up,
        'keep in not that the linked cells will automatically populate with true/false
        .LinkedCell = cel.Offset(0, -4).Address

    End With

Next
Call CentreCheckbox_Click

End Sub

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-31
    • 2017-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-31
    相关资源
    最近更新 更多