英文:
Failing to use an Excel array formula with a custom VB function
问题
我正在尝试使用Excel数组公式来计算列范围(如果你愿意,也可以称为数组)中具有背景颜色的单元格数量。
要检查单元格是否具有背景颜色,我使用了这个函数:
Function FillIndicator(color As Range) As Integer
If color.Interior.ColorIndex = -4142 Then
FillIndicator = 0
Else
FillIndicator = 1
End If
End Function
这个函数是有效的。
如果我要避免使用数组公式,假设我的范围是C5:C7,我需要写类似于以下内容:
=FillIndicator(C5) + FillIndicator(C6) + FillIndicator(C7)
现在,我尝试使用数组公式的幼稚尝试是:
=SUM(FillIndicator(C5:C7))
然后按下Ctrl+Shift+Enter。但是这只会得到一个#VALUE
错误。
我做错了什么?还有 - 我可以使这个工作吗?
注意:我使用的是Excel 365版本2208。我想是这样的。
英文:
I'm trying to use Excel array formulae for summing up the number of cells in a columnar range (an array if you will), which have a background color.
For checking whether a cell has a background color, I use this function:
Function FillIndicator(color As Range) As Integer
If color.Interior.ColorIndex = -4142 Then
FillIndicator = 0
Else
FillIndicator = 1
End If
End Function
which works.
If I were to eschew array formulae, and my range were, say, C5:C7, I would need to write something like:
=FillIndicator(C5) + FillIndicator(C6) + FillIndicator(C7)
Now, my naive attempt at using an array formula here was writing:
=SUM(FillIndicator(C5:C7))
and pressing <kbd>Ctrl</kbd>+<kbd>Shift</kbd>+<kbd>Enter</kbd>. But that just gets me a #VALUE
error.
What am I doing wrong? And - can I make this work?
Note: I'm using Excel 365 version 2208. I think.
答案1
得分: 1
以下是您需要翻译的代码部分:
Function SumCellsByColor(colorRange As Range, targetColor As Long) As Long
Dim cell As Range
Dim count As Long
count = 0
For Each cell In colorRange
If cell.Interior.color = targetColor Then
count = count + 1
End If
Next cell
SumCellsByColor = count
End Function
Sub ExampleUsage()
Dim rng As Range
Dim count As Long
' Define the range of cells in which you want to count
Set rng = Range("A18:C22")
' Call the SumCellsByColor function and pass the range and target color.
count = SumCellsByColor(rng, RGB(255, 0, 0)) ' For example, the color red
' Print the result
MsgBox "Number of cells with red color: " & count
End Sub
请注意,这是用于在特定列中计算单元格或范围的颜色的代码。
英文:
I think this is what you need to count cells or ranges of specific columns.
<!-- begin snippet: js hide: false console: true babel: false -->
<!-- language: lang-html -->
Function SumCellsByColor(colorRange As Range, targetColor As Long) As Long
Dim cell As Range
Dim count As Long
count = 0
For Each cell In colorRange
If cell.Interior.color = targetColor Then
count = count + 1
End If
Next cell
SumCellsByColor = count
End Function
Sub ExampleUsage()
Dim rng As Range
Dim count As Long
' Define the range of cells in which you want to count
Set rng = Range("A18:C22")
' Call the SumCellsByColor function and pass the range and target color.
count = SumCellsByColor(rng, RGB(255, 0, 0)) ' For example, the color red
' Print the result
MsgBox "Number of cells with red color: " & count
End Sub
<!-- end snippet -->
答案2
得分: 1
以下是您要翻译的代码部分:
这个答案与@RicardinhoL的答案相同,只有三个小的不同之处:
1)使用默认值的可选颜色参数,您在问题2中使用
2)检查范围是否为空,否则会出现错误
3)使用函数的名称作为计数器,因为它本身像一个变量一样工作。
必须返回Long,因为Excel中有很多单元格!
Public Function CountIfColor(rngClr As Range, Optional thisColor As Long = -4142) As Long
Dim r As Range
If Not rngClr Is Nothing Then
For Each r In rngClr
If r.Interior.ColorIndex = thisColor Then CountIfColor = CountIfColor + 1
Next
End If
End Function
英文:
This answer is the same as @RicardinhoL answer with three small differences: 1) use an Optional color parameter with default value that you use in question 2) check if range is nothing else an error occurs 3) use as counter the name of the function, since it works like a variable itself.
Must to return Long because there are many-many cells in excel!
Public Function CountIfColor(rngClr As Range, Optional thisColor As Long = -4142) As Long
Dim r As Range
If Not rngClr Is Nothing Then
For Each r In rngClr
If r.Interior.ColorIndex = thisColor Then CountIfColor = CountIfColor + 1
Next
End If
End Function
答案3
得分: 1
要使UDF返回一个数组,你只需在返回行将数组设置为该函数。
例如,假设你想返回一个布尔数组,表示范围中的单元格是否着色:
Option Explicit
Function FillIndicator(color As Range)
Dim v '循环遍历数组的变量
Dim al As Object '收集测试结果
Set al = CreateObject("System.Collections.ArrayList")
'在每个单元格上运行测试
For Each v In color
al.Add v.Interior.ColorIndex <> -4142
Next v
'将函数设置为一个数组
FillIndicator = al.toarray
End Function
请注意倒数第二行,FillIndicator
被设置为该数组。
这个公式将根据 Interior.ColorIndex
属性返回一个 TRUE/FALSE
数组。
然后你可以像处理其他数组函数一样处理它。
英文:
To have the UDF return an array, you merely need to set the array equal to the function in the return line.
For example, given your apparent desire to return a boolean array corresponding to whether or not the cells in a range are colored:
Option Explicit
Function FillIndicator(color As Range)
Dim v 'variable to loop through array
Dim al As Object 'collect the test results
Set al = CreateObject("System.Collections.ArrayList")
'run the test on each cell
For Each v In color
al.Add v.Interior.ColorIndex <> -4142
Next v
'Set the Function equal to an array
FillIndicator = al.toarray
End Function
Note the penultimate line where FillIndicator
is set equal to the array.
The formula will return an array of TRUE/FALSE
depending on the Interior.ColorIndex
property.
You can then treat this the same as any other array function.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论