首页 > 解决方案 > 将 VBA 宏应用于多行

问题描述

我对 VBA 和一般编码相对较新,所以如果我的语言不准确,请多多包涵。

我正在尝试创建一个双向单位转换器,它可以双向工作,就像你可以在谷歌上找到的那样。(example: https://www.google.com/search?safe=off&rlz=1C1CHBF_enUS902US902&sxsrf=ALeKk01haz9HbWVojCtcIMszToBVE-cDfg%3A1597171511150&ei=N-cyX97eCLivytMP17usiA8&q=google+unit+converter&oq=google+converter&gs_lcp=CgZwc3ktYWIQARgAMgQIABBHMgQIABBHMgQIABBHMgQIABBHMgQIABBHMgQIABBHMgQIABBHMgQIABBHUABYAGDSFmgAcAJ4AIABAIgBAJIBAJgBAKoBB2d3cy13aXrAAQE&sclient=psy-ab )

我能够使用以下代码创建一个将英寸转换为英尺的方法,反之亦然:

Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Range("B7,D7"), Target) Is Nothing Then
    Application.EnableEvents = False
    If IsNumeric(Target) Then
        Select Case Target.Address(0, 0)
            Case "B7": Range("D7").Value = [Convert(B7, "in", "ft")]
            Case "B8": Range("D8").Value = [Convert(B8, "in", "ft")]
        End Select
    Else
        Range("B7,D7").ClearContents
   End If
    Application.EnableEvents = True
End If
 
End Sub

因此,如果我在单元格 B7 中输入英寸的“12”,它会将单元格 D7 更改为英尺的“1”。同样,在 D7 中键入“2”英尺会在 B7 中得到“24”英寸

我想将此宏应用于多行(在我的情况下,三个行对长度、宽度和高度执行相同的操作);经过足够的摆弄,我想出了以下内容

Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Range("B7:B9,D7:D9"), Target) Is Nothing Then
    Application.EnableEvents = False
    If IsNumeric(Target) Then
        Select Case Target.Address(0, 0)
            Case "B7": Range("D7").Value = [Convert(B7, "in", "ft")]
            Case "B8": Range("D8").Value = [Convert(B8, "in", "ft")]
            Case "B9": Range("D9").Value = [Convert(B9, "in", "ft")]
            Case "D7": Range("B7").Value = [Convert(D7, "ft", "in")]
            Case "D8": Range("B8").Value = [Convert(D8, "ft", "in")]
            Case "D9": Range("B9").Value = [Convert(D9, "ft", "in")]
        End Select
    Else
        Range("B7:B9,D7:D9").ClearContents
    End If
    Application.EnableEvents = True
   End If
End Sub

但是,我确信有一种更有效的方法可以应用这个公式。如果我想要 100 行不同的参数来应用它,我必须手动编辑脚本的“案例”部分两倍的次数。我将如何概括该编辑问题?我将不胜感激对此事的任何见解!

标签: excelvbarowscol

解决方案


目标包含一个行号,因此您可以更新另一列中的匹配行。您可以使用基本的 If 语句来检查是否正在更新哪一列。此外,您可以使用 WorksheetFunction 对象来访问内置的工作表函数。

这是更新的代码。它将检查第 7 - 999 行中的更改。

Private Sub Worksheet_Change(ByVal Target As Range)
  If Not Intersect(Range("B7:B999,D7:D999"), Target) Is Nothing Then
    Application.EnableEvents = False
    If IsNumeric(Target) Then
        If Target.Column = Range("B1").Column Then
            Cells(Target.Row, Range("D1").Column) = Application.WorksheetFunction.Convert(Target, "in", "ft")
        Else
            Cells(Target.Row, Range("B1").Column) = Application.WorksheetFunction.Convert(Target, "ft", "in")
        End If
    End If
    Application.EnableEvents = True
  End If
End Sub

推荐阅读