感谢您阅读我的问题。
我正在尝试查找各种尺寸的产品包装的价格点。我在 Sheet1 上有一个数据范围,A1:Z102,其中顶行是包装质量(B1:Z1),第一列(A2:A102)是销售价格。在数组中,我计算了利润率(B2:Z102)
我正在尝试在工作表上自动设置“假设”,以便我输入各种重量“Sheet2!B1:B10” - 这将从“Sheet1!A2:Z2”中选择相应的包装重量列,然后让函数将该列中最接近我的“假设”利润率“Sheet2!A1”的行匹配,最后在 Sheet2、C1:C10 上返回最接近该利润率的销售价格。
SHEET1
1lbs 2lbs 3lbs 4lbs
$1 $0.10 -$0.80 -$1.80% -$2.80
$2 $1.74 $0.74 -$0.26 -$1.26
$3 $2.61 $1.61 $0.61 -$0.39
$4 ... ... ... $0.47
...
SHEET2
$0.20 2lbs X
4lbs X
[Edit1] 因此该函数将在三个迭代步骤中返回 C1=$2 和 C2=$4(我认为)。
- Cell.Sheet2!B1.Value 与 Sheet1 Row1 中的相同列匹配:返回 Y 列
- 对于 Sheet1 中的 Y 列,找到最接近单元格的正值。Sheet2A1:返回 Y 列、Z 行
- 对于 Sheet1 的 Y 列、Z 行,返回 Sheet1 的第 1 列 Z 行中的值。在 Sheet2 的 C1 中重复该值
- 对 B2...Bn 重复 1-3
我很难解决每个步骤:
- MATCH 可以识别正确的列
- 无法弄清楚如何在“OFFSET”中嵌套 MATCH 以仅搜索 Y 列。我尝试过 INDEX MATCH、INDEX MATCH MATCH、LOOKUPs(V&H)。
- 返回 RowZ 中的 Column1 值。
我意识到这可能是一个宏解决方案,但我只是不知道如何使用 VBA 来实现它:
Dim profit, lbs, cost, reflbs, refprofit As Range
Set cost = Worksheets("Sheet1").Range("$A$2", "$A$5")
Set profit = Worksheets("Sheet1").Range("$B$2", "$E$5")
Set lbs = Worksheets("Sheet1").Range("$B$1", "$E$1")
Set reflbs = Worksheets("Sheet2").Range("$B1")
Set refprofit = Worksheets("zTest").Range("$H$39")
For Each profitCell In profit
For Each costCell In cost
For Each lbsCell In lbs
If lbsCell.Value = reflbsCell.Value Then
然后我不确定如何在标题 lbs 与“reflbs”匹配的列中直接进行搜索,然后我输入:
If profitCell.Value = refprofitCell.Value Then
然后返回匹配的行 Z,然后最终返回 Sheet2!C1 中的行 Z、列 A Sheet1!。
非常感谢!
答案1
假设您的源数据布局与您的示例类似,如下所示:
然后在 sheet2 上,如果您的数据布局如下:
然后您可以使用以下公式来获取红色的数字:
=INDEX(Sheet1!$B$2:$E$5,IFERROR(MATCH(Sheet2!$A$1,Sheet1!$A$2:$A$5,1),1),MATCH(Sheet2!$B1,Sheet1!$B$1:$E$1,0))
当您要查找的美元值小于列中的第一个值时,您可能会收到错误。vlookup 和 match 的工作方式是它们不查找最接近的数字值。它们查找小于所查找值的最后一个数字。这就是为什么您的列需要按升序排序的原因。为了处理小于列表中第一个值的合法值,将引发错误的 match 函数包装在 iferror 函数中,该函数返回 1 以表示第一行。请注意,如果在 sheet2!A1 中输入了无效的价格条目,它仍将为第一行返回 1。
对于您的体重,它们实际上很可能是字符串值而不是数字。将您的单位列在单独的单元格中,然后将值列在自己的单元格中,这样就更容易处理这些值了。在这种情况下,我假设您的体重始终与您的某个列标题完全匹配。2.5 磅的体重会引发错误,因为在您的标题列表中找不到它。