公式中的列引用

时间:2013-11-14 00:05:41

标签: excel vba excel-vba

此刻我有点卡住了。我正在研究一组数据,需要找到一种方法将列号输入到公式中。

- 我使用了匹配函数来查找值的相应列号。
     恩。 “XYZ”与Column 3匹配,相当于C1:Cxxxxxx

- 如果要将C1:Cxxxxxx输入到公式中以获取该特定列的数据,我希望能够直接引用Column 3部分,因为我打算在此使用此工作簿未来和运行计算所需的列可能会或可能不是下次我使用它时的第3列 - 有没有办法告诉excel使用公式告诉excel哪个列用于等式?

所以更详细一点,我有等式

=AND(Sheet3!$C$1:$C$250000=$A$4,Sheet3!$B$1:$B$250000=$B$4)

而不是指定使用C列,有没有办法使用公式告诉它使用C?

编辑:更多信息; “我基本上运行相当于一个SQL where语句,其中foo和bar为true,我希望excel吐出所有baz值的连接列表,其中foo和bar为true。理想情况下我希望它只返回baz值是真的,然后我会将它们分别连接在一起。我现在得到它的方式,表达式将分别测试每一行以查看是否为真;如果有18K行,则将有18K单独测试..它可以工作,但它不是太干净了。目标是尽可能多地自动化。* 我不想每次添加新数据时都要进入并更改列引用 * y“

由于

2 个答案:

答案 0 :(得分:1)

您可以使用INDEX,例如如果从A到Z有26个可能的列,则此公式将为您提供C列范围(可以在另一个公式中使用)

=INDEX(Sheet3!$A$1:$Z$250000,0,3)

0表示您想要整列,3表示哪一列。如果你想3可以由另一个公式生成,如MATCH函数

注意:请注意

中的AND

=AND(Sheet3!$C$1:$C$250000=$A$4,Sheet3!$B$1:$B$250000=$B$4)

AND只返回一个结果而不是数组,如果你想要一个你可能需要使用的数组*就像这样

=(Sheet3!$C$1:$C$250000=$A$4)*(Sheet3!$B$1:$B$250000=$B$4)

答案 1 :(得分:1)

您可以使用ADDRESS生成文本,然后在将字符串而不是范围传递给公式时需要使用INDIRECT

=AND(INDIRECT(ADDRESS(1,3,,,"Sheet3") & ":" & ADDRESS(250000,3))=$A$4 ,INDIRECT(ADDRESS(1,2,,,"Sheet3") & ":" & ADDRESS(250000,2))=$B$4)

显然,使用您用于获取列号的ADDRESS函数替换MATCH公式中的3和2。上面假设$ B $ 1的列:$ B $ 25000也可以使用`MATCH'找到,否则只是:

=AND(INDIRECT(ADDRESS(1,3,,,"Sheet3") & ":" & ADDRESS(250000,3))=$A$4 ,Sheet3!$B$1:$B$25000=$B$4)

请注意以下几点:

  1. 您只需要在INDRECT
  2. 的第一部分使用“Sheet3”
  3. ADDRESS公式中的条件3和4保留为默认值 意味着它们返回绝对($ C $ 1)引用并且是A1样式 反对R1C1
  4. 修改

    如果有额外的信息,可能使用高级过滤器可以让你接近你想要的。好教程here。根据教程进行设置以熟悉它,然后您可以使用一些基本代码在您放入新数据集时自动设置它:

    粘贴到数据集中,然后使用VBA获取数据集使用的范围,然后将过滤器应用于:

    Range("A6:F480").AdvancedFilter Action:=xlFilterInPlace, CriteriaRange:= _ Sheets("Sheet1").Range("A1:B3"), Unique:=False

    您也可以将结果复制到新表中,但这必须与原始数据位于同一工作表中。我的建议是将数据粘贴到左侧的隐藏列中,并在可见列的行1:5中为您的条件添加空格,然后使用一个按钮获取数据的使用范围,应用过滤器并复制下面的数据标准:

    Range("A6:F480").AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=Sheets _ Range("H1:M3"), CopyToRange:=Range("H6"), Unique:=False

    按钮需要先清除目标单元格等,确保你有足够的隐藏列等,但这一切都是可能的。希望这会有所帮助。