英文:
Copy row if condition met using IF function, without blank rows
问题
我对宏和复杂的Excel函数都非常陌生,因此希望这个社区能帮助我。
顶部表格是反转表格。我在列F中添加了一个是/否选项,它会传递到列D中的IF函数,以根据列F显示的y(是)来反转+/-。
然后在下面的"Auto Reversals"表格中,如果"Reversals"中的列D被填充,列C中的IF函数将被填充。
然后,我在其他列中使用了IF函数,所有这些函数都引用了"Auto Reversals"中的列C。如果C被填充,其余的行将被填充以相应的信息。
是否有办法在"Auto Reversals"表中不产生大量空白行?或者是否有更加简化的方法?
我使用IF函数是因为我在VB方面表现不佳,但是这种方式会产生空白行。我只想复制所需的行(即在列F中包含Y而不是N的行)到"Auto Reversals"表中。
英文:
I am very new to macros and complicated Excel functions in general, so I am hoping this community can help me.
The top table is the Reversal Table. I have added a yes/no option in column F which feeds into an IF function in column D to reverse the +/- if column F shows y (Yes).
Then in the lower, Auto Reversals table, an IF function in column C populates if column D in Reversals is populated.
I have then used IF functions in the other columns, all referring to column C in Auto Reversals. If C is populated, the rest of the rows will be populated with the corresponding info.
Is there a way to do this without having lots of blank rows in the auto reversals table? Or a more streamlined way overall?
I am using IF functions as I didn't get on great with the VB, but this way is producing blank rows. I would like only the required rows (ie. Contain Y not N in column F) to be copied into the auto reversals table.
答案1
得分: 1
这是一个用于执行与FILTER()
类似功能的自定义函数(UDF)。
'根据一个或多个条件筛选范围`rng`,并返回满足所有条件的所有行。
'示例用法:
'=myfilter(A3:K10,F3:F10="fred") 单个条件
'=myfilter(A3:K10,F3:F10="fred",H3:H10="y") 两个条件
Function MyFilter(rng As Range, ParamArray tests())
Dim rw As Range, i As Long, n As Long, c As Long, rOut As Long, arr, arrout()
Dim arrOK() As Boolean, t As Long, anyRows As Boolean
arr = rng.Value '将所有输入数据转换为数组
ReDim arrOK(1 To UBound(arr, 1))
'查找满足所有条件的行
'tests()中的每个项目都是一个True/False值的2维数组
For i = 1 To UBound(arr, 1)
arrOK(i) = True '默认为True
For t = 0 To UBound(tests)
If Not tests(t)(i, 1) Then
arrOK(i) = False '标记跳过行
Exit For '停止测试
End If
Next t
If arrOK(i) = True Then n = n + 1 '如果所有条件都通过,则增加行计数
Next i
'如果有满足条件的行,填充输出数组
If n > 0 Then
ReDim arrout(1 To n, 1 To UBound(arr, 2))
For i = 1 To UBound(arr)
If arrOK(i) Then '这一行是否满足所有条件?
rOut = rOut + 1
For c = 1 To UBound(arr, 2)
arrout(rOut, c) = arr(i, c)
Next c
End If
Next i
End If
MyFilter = IIf(n > 0, arrout, "没有行")
End Function
英文:
Here's a UDF which sort-of does the same thing as FILTER()
'Filter range `rng` according one or more tests and return all
' rows which pass all the tests.
'Example usage:
' =myfilter(A3:K10,F3:F10="fred") one test
' =myfilter(A3:K10,F3:F10="fred",H3:H10="y") two tests
Function MyFilter(rng As Range, ParamArray tests())
Dim rw As Range, i As Long, n As Long, c As Long, rOut As Long, arr, arrout()
Dim arrOK() As Boolean, t As Long, anyRows As Boolean
arr = rng.Value 'all input data as array
ReDim arrOK(1 To UBound(arr, 1))
'Find which rows satisfy all the tests
'Each item in `tests()` is a 2-d array of True/False values
For i = 1 To UBound(arr, 1)
arrOK(i) = True 'defaults to true
For t = 0 To UBound(tests)
If Not tests(t)(i, 1) Then
arrOK(i) = False 'flag skip row
Exit For 'stop testing
End If
Next t
If arrOK(i) = True Then n = n + 1 'increase row count if all tests passed
Next i
'if any good rows, populate the array for output
If n > 0 Then
ReDim arrout(1 To n, 1 To UBound(arr, 2))
For i = 1 To UBound(arr)
If arrOK(i) Then 'this row passed all tests?
rOut = rOut + 1
For c = 1 To UBound(arr, 2)
arrout(rOut, c) = arr(i, c)
Next c
End If
Next i
End If
MyFilter = IIf(n > 0, arrout, "No rows")
End Function
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论