我正在尝试将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个变量。
谢谢, 阿夫拉姆
答案 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$5
和Sheet8!$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