如何将Excel表中所有标记行的地址、列名和行名作为新工作表中的行获取

如何将Excel表中所有标记行的地址、列名和行名作为新工作表中的行获取,excel,Excel,我需要表中标有“X”的行/列组合在另一张表中作为三列提供 第一列将包含单元地址 第二列将具有行名称,并且 第三列将具有标记单元格的列名 VLookUp和Index/Match没有帮助 预期结果: 您可能会得到一些懒惰的东西,例如,您可以根据需要更改工作表和目标范围srcSht.range(“A1:C5”): Option Explicit Sub test() Dim wb As Workbook Dim srcSht As Worksheet Dim destSht As Work

我需要表中标有“
X
”的行/列组合在另一张表中作为三列提供

  • 第一列将包含单元地址
  • 第二列将具有行名称,并且
  • 第三列将具有标记单元格的列名
VLookUp
Index
/
Match
没有帮助

预期结果:


您可能会得到一些懒惰的东西,例如,您可以根据需要更改工作表和目标范围srcSht.range(“A1:C5”):

Option Explicit

Sub test()

Dim wb As Workbook

Dim srcSht As Worksheet
Dim destSht As Worksheet

Set wb = ThisWorkbook
Set srcSht = wb.Sheets("Sheet1")
Set destSht = wb.Sheets("Sheet2")

Dim targetRange As Range

Set targetRange = srcSht.Range("A1:C5")

Dim loopArray()
loopArray = targetRange.Value2

Dim currRow As Long
Dim currCol As Long
Dim counter As Long

For currRow = LBound(loopArray, 1) To UBound(loopArray, 1)

    For currCol = LBound(loopArray, 2) To UBound(loopArray, 2)

        If LCase$(loopArray(currRow, currCol) )= "x" Then
            counter = counter + 1
            destSht.Cells(counter, 1) = targetRange.Cells(currRow, currCol).Address
            destSht.Cells(counter, 2) = "Column " & targetRange.Cells(currRow, currCol).Column
             destSht.Cells(counter, 3) = "Row " & targetRange.Cells(currRow, currCol).Row

        End If

   Next currCol

Next currRow


End Sub

以下是获得类似结果的类似方法:

Sub listCells()
    Dim rIn As Range, c As Range, rOut As Range
    Set rIn = Sheets("Sheet1").Range("B2:D7")  'input range
    Set rOut = Sheets("Sheet1").Range("F1") 'first cell for output

    For Each c In rIn
        If c <> "" Then 'not blank so populate output
            Range(rOut, rOut.Offset(, 2)) = Array(c.Address, c.Column - 1, c.Row - 1)
            Set rOut = rOut.Offset(1, 0) 'next row
        End If
    Next c
End Sub
子列表单元格()
变暗rIn为范围,c为范围,路由为范围
设置rIn=板材(“板材1”).范围(“B2:D7”)输入范围
设置rOut=Sheets(“Sheet1”)。范围(“F1”)为输出的第一个单元格
对于rIn中的每个c
如果c“”则“”不为空,则填充输出
范围(路由,路由偏移量(,2))=数组(c地址,c列-1,c行-1)
设置路由=路由偏移量(1,0)'下一行
如果结束
下一个c
端接头

这个数组公式似乎适合我

=IFERROR(ADDRESS(SMALL(IF($A$1:$C$6="X",ROW($A$1:$C$6)*100+COLUMN($A$1:$C$6)),ROW())/100,MOD(SMALL(IF($A$1:$C$6="X",ROW($A$1:$C$6)*100+COLUMN($A$1:$C$6)),ROW()),100)),"")
但我认为用聚合可以做得更整齐

另外,乘以100也没有特别的原因,乘以数组中的确切列数加1会更好

这是加了骨料的

=IFERROR(ADDRESS(AGGREGATE(15,6,(ROW($A$1:$C$6)*100+COLUMN($A$1:$C$6))/($A$1:$C$6="X"),ROW())/100,MOD(AGGREGATE(15,6,(ROW($A$1:$C$6)*100+COLUMN($A$1:$C$6))/($A$1:$C$6="X"),ROW()),100)),"")

编辑

对于图纸上任何位置的任何尺寸的二维范围,这里有一个更通用的解决方案

对于行:

=IFERROR(INDEX($A$2:$A$7,AGGREGATE(15,6,((ROW($B$2:$D$7)-ROW($B$2))*COLUMNS($B$2:$D$7)+COLUMN($B$2:$D$7)-COLUMN($B$2))/($B$2:$D$7="X"),ROW())/COLUMNS($B$2:$D$7)+1),"")
对于列:

=IFERROR(INDEX($B$1:$D$1,MOD(AGGREGATE(15,6,((ROW($B$2:$D$7)-ROW($B$2))*COLUMNS($B$2:$D$7)+COLUMN($B$2:$D$7)-COLUMN($B$2))/($B$2:$D$7="X"),ROW()),COLUMNS($B$2:$D$7))+1),"")
对于单元地址:

=IFERROR(ADDRESS(AGGREGATE(15,6,((ROW($B$2:$D$7)-ROW($B$2))*COLUMNS($B$2:$D$7)+COLUMN($B$2:$D$7)-COLUMN($B$2))/($B$2:$D$7="X"),ROW())/COLUMNS($B$2:$D$7)+ROW($B$2),
MOD(AGGREGATE(15,6,((ROW($B$2:$D$7)-ROW($B$2))*COLUMNS($B$2:$D$7)+COLUMN($B$2:$D$7)-COLUMN($B$2))/($B$2:$D$7="X"),ROW()),COLUMNS($B$2:$D$7))+COLUMN($B$2)),"")

行名称是什么意思?是否有左边有值的行列要检索?您能显示给定输入的预期输出吗?我提供了我提供的表的预期输出示例。我试图得到三列,第一列是单元格地址,第二列是列的标题(顶值),第三列是行的标题(行中最左边的值)。@Ushamasarkar总是只有6行3列吗?heyy Qharr-我在头脑风暴中寻找一个基于工作表的解决方案。。。我可以创建一个
1
到{
COUNTIF($B$2:$D$7,“X”)
}的列表没问题,但是你知道有一个内置函数返回@ashleedawg的单元格吗?这不是很像我之前在协调练习时失败的数组子集吗?@qharr-你的评论引发了一个想法,所以我在过去的一个小时里(又一次)一直在搞乱数组公式,我已经很接近了(但到目前为止)。。。令人沮丧的是,我(再次)放弃了!我不确定OP是否需要一个工作表公式(我知道他还没有回来)。。。我可以得到一个1D的细胞阵列和X的。。。我可以得到2D范围内所有单元格
地址
的一维数组。。。我可以得到带有值的行或列编号的排序数组(但不能将它们组合成
地址
)…是的,我也会进一步研究它。我很想把我自己的赏金扔到这里。。。一定有办法的。