【问题标题】:Is there an efficient way to combine numerous subtitutions and replacements?有没有一种有效的方法来结合大量的替换和替换?
【发布时间】:2021-10-16 14:17:56
【问题描述】:

我有很多用代码编写的数据,我需要使其更具可读性。为此,我在vba中使用了replace,特别是因为有很多可能的代码需要删除或替换为不同的符号,我仍然需要添加更多可能的文本。

以下 UDF 有效,但每当我发现代码中可能有新的部分需要替换时,我必须编写另一个完整的 'Let#' 来弥补。我觉得有更好的方法来编写这个函数,所以我想知道是否有人可以帮忙。

Function Unit(Req_Header As String) As String

Dim Func As String
Dim Amount As String

Func = AkeFind(Req_Header)     'AkeFind is a different UDF that looks up the correct string in a dataset (and returns as a string)

Dim LetA As String
Dim LetB As String
Dim LetC As String
Dim LetD As String
Dim LetE As String
Dim LetF As String

LetA = Replace(Func, "formaat_papier_", "")
LetB = Replace(LetA, "motief_", "")
LetC = Replace(LetB, "materiaal_", "")
LetD = Replace(LetC, "vorm_", "")
LetE = Replace(LetD, "_", " ")
LetF = Replace(LetE, "•", "-")

Amount = LetF

    Select Case Amount
    Case "CENTIMETER", "Centimeter", "centimeter"
        Unit = "cm"
    Case "MILLIMETER", "Millimeter", "millimeter"
        Unit = "mm"
    Case "METER", "Meter", "meter"
        Unit = "m"
    Case "CENTILITER", "Centiliter", "centiliter"
        Unit = "cl"
    Case "MILLILITER", "Milliliter", "milliliter"
        Unit = "ml"
    Case "LITER", "Liter", "liter"
        Unit = "l"
    Case "KILOGRAM", "Kilogram", "kilogram"
        Unit = "kg"
    Case "MILLIGRAM", "Milligram", "milligram"
        Unit = "mg"
    Case "GRAM", "Gram", "gram"
        Unit = "g"
    Case "PIECE", "Piece", "piece"
        Unit = "Stuks"
    Case "plastic", "kunstof"
        Unit = "Kunststof"
    Case "metaal", "staal"
        Unit = "Metaal"
    Case Else
        Unit = Amount
    End Select

End Function

【问题讨论】:

  • 我建议您使用工作表中的表格来替换和替换它们,然后循环遍历它。注意:您不需要使用Let,也不需要为每次替换的结果使用单独的变量。
  • 您的Select Case 也可以简化,这样您就不需要检查每个案例:Select Case LCase$(Amount) ... Case "centimeter" ... Case "millimeter"
  • @Rory 公平地说,OP 没有使用 Let... 变量名刚刚以 Let 开头。当我看到 Let 时,我总是会想起 Sinclair 和 BBC Basic。 :)
  • @DarrenBartrup-Cook 我需要测试一下我的眼睛! :)

标签: excel vba replace case user-defined-functions


【解决方案1】:

所以根据大家的建议,我做了以下几点:

Function Unit(Req_Header As String) As String

Dim Func As String

Func = LCase$(AkeFind(Req_Header))

Dim Rem_Range As Range
Dim Replc_Range As Range
Dim a_Nr As Integer

Set Rem_Range = Sheets("Variables").Range("Rem_Table[Rem_Code]")
Set Replc_Range = Sheets("Variables").Range("Rem_Table[Replc]")

For Each a In Rem_Range
    If Func = a Then
        Unit = a.Offset(0, 1).Value
        Exit For
    Else
        Unit = Func
    End If
Next a

End Function

Rem_Table 是一个表,第一列是每个可能的代码,第二列给出适当的术语。在上下文中,这实际上比替换部分代码更有意义。添加我以后可能会遇到的新变量也更容易。

感谢大家的意见!

【讨论】:

    【解决方案2】:

    您可以按照这些思路使用一些东西。需要对新单位进行维护,所以我也可能会采用表格方法。可能最好在从 aReplace 获取之前分离出函数的匹配部分并测试错误。

    Function GetReplacementUnits(strInputUnit As String)
    
    Dim aOrig() As Variant
    Dim aReplace() As Variant
    
    aOrig = Array("CENTIMETRE", "KILOGRAM", "METER")
    aReplace = Array("cm", "Kg", "m")
    
    GetReplacementUnits = Application.Index(aReplace, Application.Match(UCase(strInputUnit), aOrig, 0), 1)
    
    End Function
    

    这样使用

    GetReplacementUnits("CENTIMETRE") 返回厘米

    【讨论】:

    • 很好,投了赞成票。您可以使用 GetReplacementUnits = aReplace(Application.match(UCase(strInputUnit), aOrig, 0) - 1) 简化它...match 已经返回必要的索引(以 1 为底)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-19
    • 2011-11-08
    • 2017-05-20
    • 2016-01-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多