在“ 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”列的值。
答案 0 :(得分:1)
请注意,b
可能不仅只有一种解决方案。在数学上,b
有两种解决方案,它们都导致相同的x
:
=RC[-3]-RC[-1]
=RC[-3]+RC[-1]
为了说明这一点,我更改了b
列表中的2个值,请参见橙色的值:
对于最后一个a = 15
,x
的结果为x = 1
,这是b
的2种可能的解决方案:14
和16
。那意味着……
x = abs(15 - 14) = 1
x = abs(15 - 16) = 1
因此,对于结果x = 1
,有2个b
和b = 14
可能。这意味着您必须有一个计划,如果b = 16
不仅只有一个结果,该怎么办。
我使用的公式是
b
:b1
=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)
您在C中的公式使用与min()组合的数组公式。因此,很难或什至不可能直接获得b值,从而导致结果显示在c列中。下面的宏是“快速而肮脏的”记录,这些记录是获取详细信息以回答您的问题所必需的公式。
在G2至K21列中找到数组公式
{= ABS(Ax- $ B $ 2:$ B $ 21)}
结果值(也在C列中)在第一行(G1至K1)中着色,并在其出现的位置处另外着色。
D列中的值是B列中的值的索引,该值导致C中的结果。
在E列中,您会在B列中找到该值,该值会导致C列中的结果。
这是用于创建数据和公式的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