【问题标题】:How to get address, Column Name and Row Name of all marked rows in Excel table as rows in new worksheet如何获取 Excel 表中所有标记行的地址、列名和行名作为新工作表中的行
【发布时间】:2018-03-23 10:32:43
【问题描述】:

我需要在我的表格中标记为“X”的行/列组合在另一个工作表中作为三列提供。

  • 第一列将包含单元格地址
  • 第二列将有行名,并且
  • 第三列将具有标记单元格的列名

VLookUpIndex/Match 没有帮助。

预期结果:

【问题讨论】:

  • 行名是什么意思?是否存在要检索左侧值的行列?你能显示给定输入的预期输出吗?
  • 我提供了我提供的表格的示例预期输出。我正在尝试获取三列,第一列是单元格地址,第二列是列标题(顶部值),第三列是行标题(行中最左边的值)。
  • @UshamanSarkar 总是只有 6 行 3 列吗?

标签: excel


【解决方案1】:

您可能会摆脱一些懒惰的事情,您可以根据需要更改工作表和目标范围 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

【讨论】:

  • 嘿 Qharr - 我正在为基于工作表的解决方案进行头脑风暴...我可以创建一个 1 到 { COUNTIF($B$2:$D$7,"X") } 的列表没问题,但你知道内置返回某个范围内第 ? 次出现值的单元格的函数? (比如Match,但带有 occurence 参数?)我有几次本可以派上用场的。
  • @ashleedawg 这不是像对我之前在进行坐标练习时失败的数组进行子集化一样吗?
  • @qharr - 你的评论引发了一个想法,所以我在过去的一个小时里(再次)一直在搞乱数组公式,我如此接近(但 到目前为止)...令人沮丧,我放弃了(再次!)
  • 我不确定 OP 是否需要工作表公式(我看到他没有回来)...我可以得到一个带有 X 的单元格的一维数组...我可以得到二维范围内所有单元格ADDRESS 的一维数组...我可以得到一个带有值的行号或列号的排序数组(但不能将它们组合成ADDRESS)...跨度>
  • 是的,我也会进一步研究它。我很想在这里投入我自己的赏金......有必须有办法。
【解决方案2】:

这个数组公式似乎对我有用

=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)),"")

但我认为使用 AGGREGATE 可以做得更整洁。

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

这里是 AGGREGATE

=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)),"")

编辑

这是一个更通用的解决方案,适用于工作表上任意位置的任意大小的 2d 范围。

对于行:

=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)),"")

【讨论】:

    【解决方案3】:

    这是获得类似结果的类似方法:

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-17
      • 1970-01-01
      • 2018-04-10
      • 1970-01-01
      • 1970-01-01
      • 2023-03-04
      相关资源
      最近更新 更多