在任何行

时间:2016-05-23 14:37:45

标签: excel vba excel-vba

我试图允许用户以百分比或小时数的形式输入值 - 未使用的选项使用已输入的内容自动填充宏。

如果用户在25小时内按键,则使用以下示例,macro然后将公式添加到B2(在B3中显示以供参考)以计算25%(在C2中显示的总数),如果用户将百分比添加到单元格B2,它也将起作用,然后它将使用小时数填充A2(再次使用C2中显示的总数)。

enter image description here

我已经让宏工作了:

Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)
Dim Cell As Range

   For Each Cell In Target
        If Cell.Address = "$A$2" Then
            Application.EnableEvents = False
                Range("B2").Formula = "=(A2/C2)*100"
            Application.EnableEvents = True
        End If
    Next Cell
        For Each Cell In Target
        If Cell.Address = "$B$2" Then
            Application.EnableEvents = False
                Range("A2").Formula = "=(B2*C2)/100"
            Application.EnableEvents = True
        End If
    Next Cell

End Sub
  

我现在想要建立的是一种更有效的方法   在不同的行上重复使用它?

列将保持不变,但理想情况下它可以在第2行到第100行。在运动中,我能想到的唯一选择是多次复制宏并引用单独使用的单元格。

非常感谢任何指针或建议。

2 个答案:

答案 0 :(得分:2)

要执行2到100之间的所有行,请使用此:

  1. 使用“相交”来确定在特定范围内更改的单元格。

  2. 在公式上使用R1C1表示法以确保评估同一行。

  3. 代码:

    Private Sub Worksheet_Change(ByVal Target As Range)
    
    If Not Intersect(Target, Range("A2:A100")) Is Nothing Then
        Application.EnableEvents = False
            Target.Offset(, 1).FormulaR1C1 = "=(RC[-1]/RC[1])*100"
        Application.EnableEvents = True
    End If
    
    If Not Intersect(Target, Range("B2:B100")) Is Nothing Then
        Application.EnableEvents = False
            Target.Offset(, -1).FormulaR1C1 = "=(RC[1]*RC[2])/100"
        Application.EnableEvents = True
    End If
    
    
    End Sub
    

答案 1 :(得分:1)

只需更改测试以查看列属性,并使用相对引用 - 如下所示:

Private Sub Worksheet_Change(ByVal Target As Range)
Dim Cell As Range

   For Each Cell In Target
        If Cell.Column = 1 And (Cell.Row >= 2 And Cell.Row <= 100) Then
            Application.EnableEvents = False
                Cell.Offset(0, 1).FormulaR1C1 = "=(RC[-1]/RC[1])*100"
            Application.EnableEvents = True
        End If
    Next Cell
        For Each Cell In Target
        If Cell.Column = 2 (Cell.Row >= 2 And Cell.Row <= 100) Then
            Application.EnableEvents = False
                Cell.Offset(0, -1).FormulaR1C1 = "=(RC[1]*RC[2])/100"
            Application.EnableEvents = True
        End If
    Next Cell

End Sub