复制和粘贴非零行和相邻单元格

Copying and pasting nonzero rows and adjacent cells

我正在处理大量要导入到 Excel 中的 GIS 元数据,其中有许多行和列的空白值或零值。我正在尝试获取这样的数据:

(左列是名称,右列是与该名称关联的值)

并且仅选择具有值的列,最终得到一组新的 tables,在左侧显示非零行及其对应名称:

我尝试通过过滤 table 中的数据来做到这一点,以便它只显示非零值,复制该列和最左边的列并将其粘贴到新的 sheet 上。如果我只有几列,这很容易,但考虑到我拥有的数量,这非常费力。我必须分别过滤每一列,因为根据列的不同,每一列中的行可能有也可能没有空白或零。

可以为此使用 LOOKUP 函数,还是使用 VBA 会更好?

类似情况下的过滤可以使用数组公式执行,如下例所示。

看一个例子: http://i.stack.imgur.com/YlyUN.jpg

(我还不能 post 图片 - 请编辑我的 post 以便整合图片)

要使用它 select 范围 E1:E6,写出显示的公式并按 ctrl+shift+enter。

逻辑如下:

1) 基于范围 B1:B6 创建两个向量:1 包含每行的行号,在本例中为 v1 = {1,2,3,4,5,6} 和每行的 TRUE 和 FALSE 向量,如果行非空则为 TRUE,如果行为空则为 FALSe:在本例中为 v2 = {TRUE,FALSE,TRUE,TRUE,FALSE,FALSE}。

2) 逐个元素地乘以 v1 和 v2,得到向量 v3 = {1,0,3,4,0,0}

3) 使用 SMALL 函数从最小到最大提取值 使用 COUNTBLANK 函数跳过所有零(它们的数量等于空白的数量)- 在范围 E1:E6 上使用的 ROW 函数作为我们的SMALL 函数中的迭代器

4) 在第 3) 点之后,你最终得到基于范围 B1:B6 的非空单元格的行号,现在你必须调用 INDEX 函数从范围 A1:A6[= 中提取值11=]

5) 在所有内容之上添加 IFERROR,以便在超出 SMALL 的输入数组范围时 returns ""

要在 F 列中赋值,只需使用 INDEX + MATCH(我鼓励大家忘记 *LOOKUP)。

我认为你最终得到的东西解决了你的核心问题。如果你想让它全部 "draggable" 或 "fillable",在以 1 开头的其他范围上使用它,或者将它全部放在设置行中而不是一列又一列,你将不得不做一些对此处使用的公式进行修改,但逻辑是相同的。

为什么不能使用 2 个简单循环(行、列)?? 我假设数据从 "A1" 开始,我计算行数和列数并播放此代码。

Sub tras()
Dim lastRw As Integer
Dim lastCol As Integer
Dim ResultRow As Integer
ResultRow = 20 '1th row for result
lastRw = Range("A1").End(xlDown).Row
lastCol = Cells(1, ActiveSheet.Columns.Count).End(xlToLeft).Column 
Set rgn = Range("A1", Cells(lastRw, lastRw))
For x = 2 To lastCol
    For y = 1 To lastRw
        If Cells(y, x) <> "" Then
            Cells(ResultRow, 1) = Cells(y, 1).Value
            Cells(ResultRow, 2) = Cells(y, x).Value
            ResultRow = ResultRow + 1
        End If
    Next y
    ResultRow = ResultRow + 1
Next x
End Sub