vba - 在 VBA 中执行此功能是否有更聪明的方法?
问题描述
Public Function Test(x As String) As String
Dim Convert As Integer
Dim Search01 As Integer
Dim Search02 As Integer
Dim Search03 As Integer
Dim Search04 As Integer
Dim Search05 As Integer
Dim Search06 As Integer
Dim Search07 As Integer
Dim Search08 As Integer
Dim Search09 As Integer
Dim Search10 As Integer
Dim Search11 As Integer
Dim Search12 As Integer
Dim Search13 As Integer
Dim Search14 As Integer
Dim Search15 As Integer
Dim Search16 As Integer
Dim Search17 As Integer
Dim Search18 As Integer
Dim Search19 As Integer
Dim Search20 As Integer
Search01 = InStr(1, x, "OBCI¥¯ENIE Podatek")
Search02 = InStr(1, x, "Op³ata miesiêczna za kartê od")
Search03 = InStr(1, x, "Op³ata za prowadzenie rachunku od")
Search04 = InStr(1, x, "Op³ata za transakcje od") 'YES
Search05 = InStr(1, x, "PROWIZJA ZA PRZEWALUTOW") 'YES
Search06 = InStr(1, x, "UZNANIE Odsetki od salda dodatniego")
Search07 = InStr(1, x, "Za wyp³atê gotówki z bankomatu")
Search08 = InStr(1, x, "V. SOL")
Search09 = InStr(1, x, "DOP. VISA")
Search10 = InStr(1, x, "za wyp³atê z bankomatu")
Search11 = InStr(1, x, "Prowizja za przewalutow")
Search12 = InStr(1, x, "Sprawdzenie dostêpnych")
Search13 = InStr(1, x, "Za wyp³atê z bankomatu kraj")
Search14 = InStr(1, x, "Op³ata za wznowienie karty")
Search15 = InStr(1, x, "Op³ata za przelew BlueCash")
Search16 = InStr(1, x, "Op³ata miesiêczna za kartê")
Search17 = InStr(1, x, "WYP")
Search18 = InStr(1, x, "Op³. za przelew ELIXIR")
Search19 = InStr(1, x, "Op³. za przelew na rach. banku - BZWBK24")
Search20 = InStr(1, x, "Pobrane odsetki od salda ujemn")
If Search01 = 1 Then Convert = 1
If Search02 = 1 Then Convert = 2
If Search03 = 1 Then Convert = 3
If Search04 = 1 Then Convert = 4
If Search05 = 1 Then Convert = 5
If Search06 = 1 Then Convert = 6
If Search07 = 1 Then Convert = 7
If Search08 = 1 Then Convert = 8
If Search09 = 1 Then Convert = 8
If Search10 = 1 Then Convert = 7
If Search11 = 1 Then Convert = 5
If Search12 = 1 Then Convert = 9
If Search13 = 1 Then Convert = 7
If Search14 = 1 Then Convert = 10
If Search15 = 1 Then Convert = 11
If Search16 = 1 Then Convert = 12
If Search17 = 1 Then Convert = 13
If Search18 = 1 Then Convert = 14
If Search19 = 1 Then Convert = 14
If Search20 = 1 Then Convert = 15
Select Case Convert
Case 1
Test = "Bank-Charge Tax collected."
Case 2
Test = "Bank-Monthly fee for Debit card."
Case 3
Test = "Bank-Monthly Account maintenance fee."
Case 4
Test = "Bank-Monthly Fee for transactions."
Case 5
Test = "Bank-Commission for currencies conversion."
Case 6
Test = "Bank-Interest on the credit balance."
Case 7
Test = "Bank-Charge for withdrawing cash from ATM."
Case 8
Test = "Transactions Debit Card"
Case 9
Test = "Bank-Account Balance request"
Case 10
Test = "Bank-Debit Card Replacement fee"
Case 11
Test = "Bank-BlueCash electronic Tranfer"
Case 12
Test = "Bank-Monthly Debit Card Fee"
Case 13
Test = "Bank-Lodgement"
Case 14
Test = "Bank-Transaction charge for bill payments."
Case 15
Test = "Bank-Interest charged on the negative balance."
Case Else
Test = "Transactions Debit or Credit"
End Select
End Function
有没有更聪明的方法来编写这个函数?
解决方案
此答案基于输入字符串“x”是 Instr 函数中使用的字符串之一。一个巧妙的解决方案是使用解耦字典。解耦字典使用两个字典。第一个将输入映射到代码,第二个使用代码返回一个值。解耦字典的优点是您没有重复的项目。下面的代码有点难看,因为它将两个字典保持在一个方法中,而不是将它们放在模块或全局级别。
Public Function Test(x As String) As String
Static myInputSD As scripting.dictionary
If myInputSD Is Nothing Then
Set myInputSD = New scripting.dictionary
With myInputSD
.Add "OBCI¥¯ENIE Podatek", 1
.Add "Op³ata miesiêczna za kartê od", 2
.Add "Op³ata za prowadzenie rachunku od", 3
.Add "Op³ata za transakcje od", 4
.Add "PROWIZJA ZA PRZEWALUTOW", 5
.Add "UZNANIE Odsetki od salda dodatniego", 6
.Add "Za wyp³atê gotówki z bankomatu", 7
.Add "V. SOL", 8
.Add "DOP. VISA", 8
.Add "za wyp³atê z bankomatu", 7
.Add "Prowizja za przewalutow", 5
.Add "Sprawdzenie dostêpnych", 9
.Add "Za wyp³atê z bankomatu kraj", 7
.Add "Op³ata za wznowienie karty", 10
.Add "Op³ata za przelew BlueCash", 11
.Add "Op³ata miesiêczna za kartê", 12
.Add "WYP", 13
.Add "Op³. za przelew ELIXIR", 14
.Add "Op³. za przelew na rach. banku - BZWBK24", 14
.Add "Pobrane odsetki od salda ujemn", 15
End With
End If
Static myLookupSD As scripting.dictionary
If myLookupSD Is Nothing Then
Set myLookupSD = New scripting.dictionary
With myLookupSD
.Add 1, "Bank-Charge Tax collected."
.Add 2, "Bank-Monthly fee for Debit card."
.Add 3, "Bank-Monthly Account maintenance fee."
.Add 4, "Bank-Monthly Fee for transactions."
.Add 5, "Bank-Commission for currencies conversion."
.Add 6, "Bank-Interest on the credit balance."
.Add 7, "Bank-Charge for withdrawing cash from ATM."
.Add 8, "Transactions Debit Card"
.Add 9, "Bank-Account Balance request"
.Add 10, "Bank-Debit Card Replacement fee"
.Add 11, "Bank-BlueCash electronic Tranfer"
.Add 12, "Bank-Monthly Debit Card Fee"
.Add 13, "Bank-Lodgement"
.Add 14, "Bank-Transaction charge for bill payments."
.Add 15, "Bank-Interest charged on the negative balance."
End With
End If
If myLookupSD.exists(myInputSD.Item(x)) Then
Test = myLookupSD.Item(myInputSD.Item(x))
Else
Test = "Transactions Debit or Credit"
End If
End Function
上面使用的脚本字典需要对 Microsoft 脚本运行时 (Tools.References) 的引用或将 'New Scripting.Dictionary' 替换为 'CreateObject("Scripting.Dictionary")'。
最后一个非常合理的替代方案是用集合或二维数组替换脚本字典。对于集合,您需要记住条目格式是 .add item,key 而不是 .key,item。对于数组,你必须处理所有那些丑陋的索引,所以如果你这样做的话,对你来说是正确的。
推荐阅读
- c# - 如何在正则表达式匹配中使用 \u 或 \x?(C#)
- regex - 正则表达式在具有静态位置但字符数量可变的字符串中查找值
- python - 为什么要使用 UniqueTogetherValidator 而不是 Django 的默认验证行为?
- sql - 在 Postgres 中:在多个值上使用“IS DISTINCT FROM”的最简洁方法是什么?
- python - 给定列表中的索引
- processing - 我看到很多人在他们的代码中使用 I,但我不确定如何以及何时使用它。如果有人可以请解释一下,那将不胜感激
- java - 有没有办法在不使用复制/粘贴方法的情况下在 Android Studio 中将代码从 Java 转换为 Kotlin?
- angular - 为什么我的事件变量在输入时未定义?
- android - API 请求通过 localhost 工作,但不能通过 Web 服务器工作
- python - 从未标记的 csv 导入时,在张量流数据集中标记列的正确方法是什么?