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

时间:2015-10-22 14:17:47

标签: excel excel-vba sorting excel-formula copy-paste vba

我正在处理我导入Excel的很多GIS元数据,其中包含许多行和列的空值或零值。我想尝试这样的数据:

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

enter image description here

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

enter image description here

我尝试过滤表中的数据,以便只显示非零值,复制该列和最左边的列并将其粘贴到新工作表上。如果我只有几列,这很容易,但考虑到我的数量,这是非常辛苦的。我必须单独过滤每个列,因为每列中的行可能有也可能没有空格或零,具体取决于列。

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

2 个答案:

答案 0 :(得分:0)

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

查看示例: http://i.stack.imgur.com/YlyUN.jpg

(我无法发布图片 - 请编辑我的帖子,以便整合图片)

要使用它选择范围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上使用的ROW函数:E6用作SMALL函数中的迭代器

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

5)在所有内容之上添加IFERROR,以便在离开SMALL的输入数组范围时返回“”

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

我认为你最终会解决你的核心问题。如果你想将它全部设为“可拖动”或“可填充”,请在其他以1开头的范围内使用它,或者将它全部放在行后的设置行而不是列之后,你必须对公式进行一些修改在这里使用,但逻辑​​将是相同的。

答案 1 :(得分:0)

为什么不能使用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