如何将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范围内所有单元格地址的一维数组。。。我可以得到带有值的行或列编号的排序数组(但不能将它们组合成地址
)…是的,我也会进一步研究它。我很想把我自己的赏金扔到这里。。。一定有办法的。