获取一个列数的最小减法

时间:2019-02-24 09:37:50

标签: excel vba

在“ A”列中有5个数字,在“ B”列中有20个数字。 “ C”列是绝对值的最小值,请从“ B”列中减去“ A”列的每个数字。使用以下代码可获得哪个?

Sub Macro2()
For n = 2 To 6
Range(Cells(n, 3), Cells(n, 3)).FormulaArray = "=MIN(ABS(RC[-2]-R2C2:R21C2))"
Next
End
End Sub

现在如何计算“ D”列中“ B”列的值。

enter image description here

2 个答案:

答案 0 :(得分:1)

请注意,b可能不仅只有一种解决方案。在数学上,b有两种解决方案,它们都导致相同的x

  • =RC[-3]-RC[-1]
  • =RC[-3]+RC[-1]
  • (或它们两个!)

为了说明这一点,我更改了b列表中的2个值,请参见橙色的值:

enter image description here

对于最后一个a = 15x的结果为x = 1,这是b的2种可能的解决方案:1416 。那意味着……

  • x = abs(15 - 14) = 1
  • x = abs(15 - 16) = 1

因此,对于结果x = 1,有2个bb = 14可能。这意味着您必须有一个计划,如果b = 16不仅只有一个结果,该怎么办。

我使用的公式是

  • 对于bb1
  • 对于=IFNA(VLOOKUP(RC[-3]-RC[-1],R2C2:R21C2,1,FALSE),RC[1])b2
  • 对于=IFNA(VLOOKUP(RC[-4]+RC[-2],R2C2:R21C2,1,FALSE),RC[-1])b

答案 1 :(得分:0)

enter image description here

更新:

您在C中的公式使用与min()组合的数组公式。因此,很难或什至不可能直接获得b值,从而导致结果显示在c列中。下面的宏是“快速而肮脏的”记录,这些记录是获取详细信息以回答您的问题所必需的公式。

在G2至K21列中找到数组公式

  

{= ABS(Ax- $ B $ 2:$ B $ 21)}

结果值(也在C列中)在第一行(G1至K1)中着色,并在其出现的位置处另外着色。

D列中的值是B列中的值的索引,该值导致C中的结果。
在E列中,您会在B列中找到该值,该值会导致C列中的结果。


vba代码

这是用于创建数据和公式的vba代码,您可以在所附的屏幕快照中看到这些代码。 (这是来自宏记录器的代码,已对其进行了一些清理和改进,并添加了一些注释。)

Option Explicit
Sub Write_Formulas_with_vba()

    'create Array Formulas
    Range("F2:F21").FormulaArray = "=ABS(RC[-5]-R2C2:R21C2)"
    Range("G2:G21").FormulaArray = "=ABS(R[1]C[-6]-R2C2:R21C2)"
    Range("H2:H21").FormulaArray = "=ABS(R[2]C[-7]-R2C2:R21C2)"
    Range("I2:I21").FormulaArray = "=ABS(R[3]C[-8]-R2C2:R21C2)"
    Range("J2:J21").FormulaArray = "=ABS(R[4]C[-9]-R2C2:R21C2)"

    'create MIN formulas
    Range("F1").FormulaR1C1 = "=MIN(R[1]C:R[20]C)"
    Range("G1").FormulaR1C1 = "=MIN(R[1]C:R[20]C)"
    Range("H1").FormulaR1C1 = "=MIN(R[1]C:R[20]C)"
    Range("I1").FormulaR1C1 = "=MIN(R[1]C:R[20]C)"
    Range("J1").FormulaR1C1 = "=MIN(R[1]C:R[20]C)"

    'color relevant cells for this example
    With Union(Range("F1"), Range("F6"), Range("F11")).Interior
        .Pattern = xlSolid
        .PatternColorIndex = xlAutomatic
        .ThemeColor = xlThemeColorAccent2
        .TintAndShade = 0.799981688894314
        .PatternTintAndShade = 0
    End With
    With Union(Range("G1"), Range("G18"), Range("G20")).Interior
        .Pattern = xlSolid
        .PatternColorIndex = xlAutomatic
        .ThemeColor = xlThemeColorAccent3
        .TintAndShade = 0.799981688894314
        .PatternTintAndShade = 0
    End With
    With Union(Range("H1"), Range("H19")).Interior
        .Pattern = xlSolid
        .PatternColorIndex = xlAutomatic
        .ThemeColor = xlThemeColorAccent4
        .TintAndShade = 0.799981688894314
        .PatternTintAndShade = 0
    End With
    With Union(Range("I1"), Range("I21")).Interior
        .Pattern = xlSolid
        .PatternColorIndex = xlAutomatic
        .ThemeColor = xlThemeColorAccent5
        .TintAndShade = 0.799981688894314
        .PatternTintAndShade = 0
    End With
    With Union(Range("J1"), Range("J21")).Interior
        .Pattern = xlSolid
        .PatternColorIndex = xlAutomatic
        .ThemeColor = xlThemeColorAccent6
        .TintAndShade = 0.799981688894314
        .PatternTintAndShade = 0
    End With

    'add one column
    Columns("F:F").Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove

    'formulas for 'idx of b' and 'value of b'
    Columns("D:E").ColumnWidth = 16
    Columns("D:K").HorizontalAlignment = xlCenter
    Range("D10").Select
    Range("D2").FormulaR1C1 = "=MATCH(R1C[3],R2C[3]:R21C[3],0)"
    Range("D2").Copy Range("E2")
    Range("E2").Cut Range("D3")
    Range("D3").Copy Range("E3")
    Range("E3").Cut Range("D4")
    Range("D4").Copy Range("E4")
    Range("E4").Cut Range("D5")
    Range("D5").Copy Range("E5")
    Range("E5").Cut Range("D6")

    Range("E2:E6").FormulaR1C1 = "=INDEX(R2C2:R21C2,RC[-1])"

    Range("D1").FormulaR1C1 = "idx_of_b"
    Range("E1").FormulaR1C1 = "value_of_b"

End Sub

'Add sample data of OP in column a, b and c
Sub SampleData()
Dim a_data As Variant
Dim b_data As Variant

    a_data = Array(1, 6, 8, 14, 15)
    b_data = Array(2, 3, 4, 5, 1, 2, 3, 5, 4, 1, 2, 3, 5, 4, 2, 3, 6, 9, 6, 12)

    Range("A:K").HorizontalAlignment = xlCenter
    Range("D1").Select
    Range("A1").Value = "a"
    Range("A2:A6").Value = WorksheetFunction.Transpose(a_data)
    Range("B1").Value = "b"
    Range("B2:B21").Value = WorksheetFunction.Transpose(b_data)
    Range("C1").Value = "c"
End Sub

'macro of the OP
Sub Macro2()
Dim n As Integer
For n = 2 To 6
Range(Cells(n, 3), Cells(n, 3)).FormulaArray = "=MIN(ABS(RC[-2]-R2C2:R21C2))"
Next
End
End Sub

'create array description of sample data column B
Sub read_b_data_to_immediate_window()
Dim xCt As Integer
    Debug.Print "b_data = Array("; Range("B1").Offset(1, 0).Value; ", ";
    For xCt = 2 To 19
        Debug.Print Range("B1").Offset(xCt, 0).Value; ", ";
    Next xCt
    Debug.Print Range("B1").Offset(20, 0).Value; ")"
End Sub