Vba 什么';这是编写转换表算法的最有效方法

Vba 什么';这是编写转换表算法的最有效方法,vba,algorithm,logic,Vba,Algorithm,Logic,我想知道你对以下几点的看法: 我需要将1转换为3个值,并在使用转换表时将其转换为单个值: 以下是一个例子: 低+高+高=中等 中+中+高=高 你们认为编程这个算法最有效的方法是什么?我将使用的语言是VBA(Excel) 我已经考虑过制作很多嵌套的If语句,但我的编程意识告诉我有一种更简单的方法 提前谢谢 “最有效”是非常主观的。我会将所有值放入一个数组(不是那么多),并使用基于值的索引访问它 Sub heres_an_idea() Dim dicLow As New Scripting.Di

我想知道你对以下几点的看法:

我需要将1转换为3个值,并在使用转换表时将其转换为单个值:

以下是一个例子:

低+高+高=中等

中+中+高=高

你们认为编程这个算法最有效的方法是什么?我将使用的语言是VBA(Excel)

我已经考虑过制作很多嵌套的
If
语句,但我的编程意识告诉我有一种更简单的方法

提前谢谢

“最有效”是非常主观的。我会将所有值放入一个数组(不是那么多),并使用基于值的索引访问它

Sub heres_an_idea()

Dim dicLow As New Scripting.Dictionary
Dim dicMed As New Scripting.Dictionary
Dim dicHigh As New Scripting.Dictionary

dicLow.Add "LLL", ""
dicLow.Add "LLM", ""
dicLow.Add "LLH", ""

dicMed.Add "MMM", ""

dicHigh.Add "HHH", ""

If dicLow.Exists("MMM") Then
    'low
    Debug.Print "low"
ElseIf dicMed.Exists("MMM") Then
    'med
    Debug.Print "med"
ElseIf dicHigh.Exists("MMM") Then
    'high
    Debug.Print "high"
End If

End Sub
  • 考虑
    index=FirstValue+SecondValue*3+ThirdValue*9

    第一个值:0=L1,1=L2,2=L3

    第二个值,第三个值:0=L1,1=L2,2=L3,3=未使用

    (此设置不是最佳设置,因为您可以将未使用的第二个值与已使用的第三个值组合在一起,但您可以截断这些值!)

    这将导致3*(3*4+1)=39组合,一个小字符串

  • 将所有结果放在一个表中并组成一个字符串:

    myData=“00000101100101212201112212200012012”
    其中0=低,1=中等,2=高

  • 定义您的函数(如果愿意,请键入):

  • VBA代码:

    Enum myType
         L1 = 0
         L2 = 1
         L3 = 2
    End Enum
    
    Function getValue(ByVal V1 As myType, Optional ByVal V2 As myType = 3, Optional ByVal V3 As myType = 3)
            getValue = Array("Low", "Meddium", "High")(Mid("000001011001012122011122122001012122012", V1 + V2 * 3 + V3 * 9 + 1, 1))
    End Function
    
    这将是快速和简短的。只需要在使用前处理一下数据

    “最有效”是非常主观的。我会将所有值放入一个数组(不是那么多),并使用基于值的索引访问它

  • 考虑
    index=FirstValue+SecondValue*3+ThirdValue*9

    第一个值:0=L1,1=L2,2=L3

    第二个值,第三个值:0=L1,1=L2,2=L3,3=未使用

    (此设置不是最佳设置,因为您可以将未使用的第二个值与已使用的第三个值组合在一起,但您可以截断这些值!)

    这将导致3*(3*4+1)=39组合,一个小字符串

  • 将所有结果放在一个表中并组成一个字符串:

    myData=“00000101100101212201112212200012012”
    其中0=低,1=中等,2=高

  • 定义您的函数(如果愿意,请键入):

  • VBA代码:

    Enum myType
         L1 = 0
         L2 = 1
         L3 = 2
    End Enum
    
    Function getValue(ByVal V1 As myType, Optional ByVal V2 As myType = 3, Optional ByVal V3 As myType = 3)
            getValue = Array("Low", "Meddium", "High")(Mid("000001011001012122011122122001012122012", V1 + V2 * 3 + V3 * 9 + 1, 1))
    End Function
    

    这将是快速和简短的。只需要在使用前处理一下数据

    需要一张桌子吗

    如果取三个值之和,则得到以下对应关系:

    Low: 3, 4 or 5
    Medium: 6
    High: 7, 8, or 9.
    
    代码:

    (很难做得更紧凑,因为这三个变量必须以某种方式出现)


    实际上,由于分数是对称的,初始表可能已经压缩为

    111 => 1
    112 => 1
    113 => 1
    122 => 1
    123 => 2
    222 => 2
    223 => 3
    233 => 3
    333 => 3
    

    最后一个注释

    如果分数以
    (-1,0,+1)
    量表表示,则公式简化为

    Sgn(V1 + V2 + V3)
    

    需要一张桌子吗

    如果取三个值之和,则得到以下对应关系:

    Low: 3, 4 or 5
    Medium: 6
    High: 7, 8, or 9.
    
    代码:

    (很难做得更紧凑,因为这三个变量必须以某种方式出现)


    实际上,由于分数是对称的,初始表可能已经压缩为

    111 => 1
    112 => 1
    113 => 1
    122 => 1
    123 => 2
    222 => 2
    223 => 3
    233 => 3
    333 => 3
    

    最后一个注释

    如果分数以
    (-1,0,+1)
    量表表示,则公式简化为

    Sgn(V1 + V2 + V3)
    

    “最有效”是非常主观的。你假装什么?紧凑代码,快速代码,…你能使用上面的代码,找到其中的组合并向左移动吗?再看看分组逻辑,“所以如果1,2,3相等,它就是值,3或2个低点是中等的,没有低点我总是高的”@LS_ᴅᴇᴠ 契约确实是我建议的最理想的解决方案。编辑到我的下一条评论“因此,如果1,2,3相等,它就是值,3或2个低点低,没有低点总是高”将表格添加到excel或任何地方,并使用它的本地查找。“最有效”是非常主观的。你假装什么?紧凑代码,快速代码,…你能使用上面的代码,找到其中的组合并向左移动吗?再看看分组逻辑,“所以如果1,2,3相等,它就是值,3或2个低点是中等的,没有低点我总是高的”@LS_ᴅᴇᴠ 契约确实是我建议的最理想的解决方案。编辑到我的下一条评论“因此,如果1,2,3相等,它就是值,3或2个低点低,没有低点总是高”将表格添加到excel或任何地方,并使用它的本机查找。谢谢!这是我的作业,这是PowerPoint演示文稿的一部分。我还没有把它放在excel表格中,因为我不确定这是处理这个问题的最佳方式,但你的答案很有趣!谢谢这是我的作业,这是PowerPoint演示文稿的一部分。我还没有把它放在excel表格中,因为我不确定这是处理这个问题的最佳方式,但你的答案很有趣!美丽的!我没有考虑不使用这张桌子的可能性。谢谢@克拉普顿:还要注意,我对和7的观察是错误的,所以这个问题更容易解决。真漂亮!我没有考虑不使用这张桌子的可能性。谢谢@克拉普顿:还要注意,我对和7的观察是错误的,所以这个问题更容易解决。