excel - 将 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 行不同的参数来应用它,我必须手动编辑脚本的“案例”部分两倍的次数。我将如何概括该编辑问题?我将不胜感激对此事的任何见解!
解决方案
目标包含一个行号,因此您可以更新另一列中的匹配行。您可以使用基本的 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
推荐阅读
- ios - 获取嵌入在 CollectionView 中的 TableView 中的 IndexPath 项
- weka - Weka 文本挖掘朴素贝叶斯
- scala - 如何在本地模式下更改执行者的数量?
- angular - Angular 中的延迟加载
- java - System.identityHashCode 在 String 实例上相等
- laravel - 下载到主机后,布局的某些部分停止工作
- java - 使用身份验证在 java 中发送 Soap 请求
- python - Python Selenium 转换为 Powershell
- r - 正则表达式从感兴趣的单词中提取由字符串分隔的数字及其度量单位
- android - 关闭 AlertDialog.Builder