将VBA宏应用于多行

问题描述

我对VBA和编码尚不熟悉,所以如果我的语言不准确,请多多包涵。

我正在尝试创建一个双向单位转换器,该转换器的两种工作方式都非常类似于您在Google上可以找到的一种。 (例如: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,"ft")]
        End Select
    Else
        Range("B7,D7").ClearContents
   End If
    Application.EnableEvents = True
End If
 
End Sub

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

我想将此宏应用于多行(在我的情况下,三个在长度,宽​​度和高度上做同样的事情);经过足够的摆弄,我想到了以下内容

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

但是,我敢肯定,有一种应用此公式的更有效方法。如果我想将100行不同的参数应用到此参数,则必须手动编辑脚本的“ case”部分两次。我将如何概括该编辑问题?我将不胜感激对此事的见识!

解决方法

目标包括行号,因此您可以更新另一列中的匹配行。您可以使用基本的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