【发布时间】: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。预期结果是 - {FD_002_17,FD_004_17}。我打算在名称范围中使用它。 Table of interest to subset
我尝试过使用
=INDEX(B2:B6,MATCH(1,A2:A6),1)
但这失败了,因为Match 没有返回一个数组。
【问题讨论】:
标签: arrays excel indexing match
使用 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)));"")
【讨论】:
这是可以做到的。您可以将命名范围分配给公式,例如:
=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
要使用公式和隐藏工作表,请使用这些技术填充一系列单元格,然后将该动态范围分配给数据验证......
【讨论】:
MyNamedRange 用作下拉列表中的动态列表,但它不返回任何值。你能帮我吗?谢谢