【问题标题】:Excel subset column to an array using formula使用公式将Excel子集列转换为数组
【发布时间】:2017-08-09 10:13:33
【问题描述】:

我需要将帐号放入一个数组中,该数组在列选择中显示为 1。预期结果是 - {FD_002_17,FD_004_17}。我打算在名称范围中使用它。 Table of interest to subset

我尝试过使用

=INDEX(B2:B6,MATCH(1,A2:A6),1)

但这失败了,因为Match 没有返回一个数组。

【问题讨论】:

    标签: arrays excel indexing match


    【解决方案1】:

    使用 Hugs 提到的 SO 问题中的帖子 (https://stackoverflow.com/a/6755513/4050510),我想出了以下公式以满足您的需要。

    这是您在第一个单元格中输入的数组公式,然后使用所选单元格角落的小手柄向下填充。

    =IFERROR(INDEX($B$2:$B$6;SMALL(IF($A$2:$A$6=1;ROW($B$2:$B$6)-MIN(ROW($B$2:$B$6))+1;"");ROW(A1)));"")

    【讨论】:

    • 啊!我认为这毕竟不是一个解决方案,因为它不会将答案返回作为数组。对不起。我会留下它,因为它可能会给某人带来灵感。
    • 感谢您的回答。是的,它没有返回一个数组。我想将其用作下拉列表的动态数组。感谢您能帮我解决这个问题。干杯!
    【解决方案2】:

    这是可以做到的。您可以将命名范围分配给公式,例如:

    =INDEX(Sheet1!$B:$B, N(IF({1}, MODE.MULT(IF(Sheet1!$A$2:$A$6=1, ROW(Sheet1!$A$2:$A$6)*{1,1})))))

    然后您可以引用您的命名范围,例如:=INDEX(MyNamedRange, 2)

    编辑:

    您可以设置一个隐藏的工作表来过滤一系列单元格中的值,或者使用 VBA:

    VBA:

    把这个放在相关工作表的工作表代码模块中:

    Option Explicit
    
    Private Sub Worksheet_Change(ByVal Target As Range)
      If Intersect(Target, Me.Range("A:A")) Is Nothing Then Exit Sub
    
      Dim ARange As Range, BRange As Range
      Dim i As Long, lastRow As Long, strCount As Long
      lastRow = Me.Range("A" & Me.Rows.Count).End(xlUp).Row
      Set ARange = Me.Range("A1:A" & lastRow)
      Set BRange = Me.Range("B1:B" & lastRow)
    
      Dim stringArr() As String
      For i = 1 To lastRow
            If ARange.Cells(i, 1).Value = 1 Then
                  ReDim Preserve stringArr(0 To strCount)
                  stringArr(strCount) = BRange.Cells(i, 1).Value
                  strCount = strCount + 1
            End If
      Next i
    
      Dim str As String
      str = Join(stringArr, ",")
    
      Dim dv As Validation
      Set dv = Me.Range("DVCell").Validation
      If Not dv Is Nothing Then
            dv.Modify _
                  Type:=xlValidateList, _
                  AlertStyle:=xlValidAlertStop, _
                  Operator:=xlBetween, _
                  Formula1:=str
      Else
            dv.Add _
                  Type:=xlValidateList, _
                  AlertStyle:=xlValidAlertStop, _
                  Operator:=xlBetween, _
                  Formula1:=str
    
      End If
     End Sub  
    

    要使用公式和隐藏工作表,请使用这些技术填充一系列单元格,然后将该动态范围分配给数据验证......

    【讨论】:

    • 感谢您的回复。问题仍然存在,因为此公式仅返回一个值,而不是示例中具有两个值的数组。
    • 我保证这个公式确实返回一个数组。这就是它的具体作用。如果您按照您所说的那样使用命名范围,并在命名范围上调用 Index 您可以获得任何条目。如果您尝试直接在单元格中输入此内容,则必须使用 Ctrl-Shift-Enter。我不确定你在做什么。如果你展示你在做什么,我们可以看到问题。
    • 嗨@MacroMarc 是的,你是对的。我正在尝试将MyNamedRange 用作下拉列表中的动态列表,但它不返回任何值。你能帮我吗?谢谢
    • 不幸的是,数据验证列表只能采用一系列单元格或逗号分隔的列表(在数据验证对话框中键入)。它们不适用于由诸如我的公式构造产生的数组。您可以使用公式来设置单元格范围,但在您的情况下,您正在尝试将范围过滤到数组中。它行不通。查看我编辑的答案
    • 感谢@MacroMarc,这解释了为什么我在尝试将数组分配给 Excel 中的下拉菜单时失败了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-29
    相关资源
    最近更新 更多