Excel - 将countif标识的单元格导出到新文件

时间:2015-12-21 19:14:33

标签: excel excel-vba excel-formula vba

我正在尝试将countif标识的单元格导出到新文件中。

例如,给定:

Red      dog
Blue     cat
Red      horse
Purple   bird
Red      mouse

我可以让countif计算A列中红色出现的次数。 但是,只有当A列为红色时,如何才能将Excel A和B的内容写入新文件(csv?)?

所以输出将是

Red    dog
Red    horse
Red    mouse

在这个例子中,我可以手动对这个列表进行排序并复制它,但是我的实际conutif语句(技术上是countifs)有4个或5个变量。

谢谢, 阿夫拉姆

2 个答案:

答案 0 :(得分:0)

可能是一个更优雅的解决方案,但这会奏效。 添加一个真或假的帮助列,具体取决于该行是否符合您的所有条件。这将生成一个类似于以下

的表
Red     Dog     TRUE
Blue    Cat     FALSE
Red     Horse   TRUE
Purple  Bird    FALSE
Red     Mouse   TRUE

然后,一个简单的宏将复制并使用true复制到新工作表。根据需要进行编辑(不一定是最优雅的,但可以完成工作)

Sub copyCriteriaRange()
Dim rcounter As Integer, outputRow As Integer, dataVariant As Variant

outputRow = 1
'loop through all rows

For rcounter = 1 To 5
  'if column 3 is true, copy to a new sheet
  If Sheets("Sheet1").Cells(rcounter, 3) = True Then
     dataVariant = Sheets("Sheet1").Range("A" & rcounter & ":C" & rcounter)
     Sheets("Sheet2").Range("A" & outputRow & ":C" & outputRow) = dataVariant
     outputRow = outputRow + 1
  End If
Next

'now get rid of helper column
Sheets("Sheet2").Range("C:C").ClearContents
MsgBox "Done copying"
End Sub

然后可以使用另一个宏导出到csv。应该很容易通过谷歌找到一个。享受!

答案 1 :(得分:0)

对于公式:

在A1的另一张纸上进行了所需的测试,在这种情况下"红色"。在A2中提出这个公式:

=IF(ROW()<=COUNTIF(Sheet8!$A$1:$A$5,$A$1),$A$1,"")

根据需要复制尽可能多的行。

在B1中放入这个数组公式:

=IF(A1<>"",INDEX(Sheet8!$B$1:$B$5,LARGE(ROW($1:$5)*ISNUMBER(FIND(A1,Sheet8!$A$1:$A$5)),COUNTA($A$1:$A1))),"")

将所有Sheet8引用更改为包含数据的工作表的名称。要放大搜索的数据,请修改范围Sheet8!$B$1:$B$5Sheet8!$A$1:$A$5以匹配大小。以及ROW($1:$5)需要包含相同数量的数据行。

使用确认Ctrl - Shift - 输入并复制下来。

对于可以用作函数的UDF:

Function Avram(val As String, IRng As Range, k As Long)
Dim rng
Dim j As Long
Dim i As Long

rng = IRng.Value
j = 1
For i = LBound(rng, 1) To UBound(rng, 1)
    If rng(i, 1) = val Then
        If j = k Then
            Avram = rng(i, 2)
            Exit Function
        Else
            j = j + 1
        End If
    End If
Next i

Avram = CVErr(xlErrNA)


End Function

此wold位于工作簿(不是工作簿或工作表代码)附带的模块中

您将在纸张上输入A列,如上面的公式部分所述。然后在B1中输入:

=IFERROR(Avram(A1,Sheet8!$A$1:$B$5,COUNTA($A$1:$A1)),"")

这次唯一需要更改的是Sheet8!$A$1:$B$5以包含您的数据范围。这比阵列公式更加挑剔,速度更快。

至于Sub要做到这一切:

Sub avram2()

Dim ows As Worksheet
Dim tws As Worksheet
Dim rng
Dim Orng
Dim i As Long
Dim FndString As String

FndString = "Red" 'Change to what you want

Set ows = Sheets("Sheet8") 'Change to your sheet name with the data.
Set tws = Sheets("Sheet9") 'Change to the output sheet name

With ows
    rng = .Range(.Cells(1, 1), .Cells(.Rows.Count, 2).End(xlUp)).Value
End With
For i = LBound(rng, 1) To UBound(rng, 1)
    If rng(i, 1) = FndString Then
        tws.Cells(tws.Rows.Count, 1).End(xlUp).Offset(1).Resize(, 2).Value = Array(rng(i, 1), rng(i, 2))
    End If
Next i

End Sub