我需要编写一个宏来搜索指定的列并计算包含指定字符串的所有单元格,例如字符“p”和字符“q”然后将其关联到另一列,即总列,表示字符已在相应行中发生最大次数
附上了相同的样本屏幕截图。
有没有人有任何想法?
提前谢谢你。
答案 0 :(得分:0)
您不需要宏。以下公式将为您提供所需。计算的范围在公式中出现3次。您需要针对要检查的范围进行调整
=INDEX(A1:C1,MODE(MATCH(A1:C1,A1:C1,0)))
注意:如果没有单个字符出现的次数超过任何其他字符,则会返回错误。在这种情况下,您可以将上述公式包装在IFERROR
函数中,以返回在发生这种情况时您希望看到的任何值。
如果行中有任何空白单元格,您可以使用以下数组公式,它会添加一个IF语句来测试空单元格:
=INDEX(A1:C1,MODE(IF(A1:C1<>"",MATCH(A1:C1,A1:C1,0))))
输入此公式时,您需要按Ctrl + Shift + Enter
答案 1 :(得分:0)
根据您必须排除行中某些列的其他条件,我认为使用VBA并创建用户定义的函数确实更容易,然后您可以以与任何方式相同的方式输入电子表格中的单元格其他功能。
我已经在下面展示了我的尝试,它基本上检查了范围中每个单元格的列,以确保它具有“符号”的标题,如果是,则将该单元格的值添加到数组中(在转换为数字之后)值)。然后有另一个函数从该数组获取模式(这仅适用于数值,这就是它在上一步中转换的原因)。最后,它被转换回一封信。
这是一种相当迂回的方式,可能会有一种更简单的方法,但希望现在可以使用,并为您提供一些如何为自己创建这些功能的想法。
在您的VBA项目中创建一个新模块,并将以下所有4个程序复制到其中:
Option Explicit
Public Function MostFrequentValue(RNG As Range) As String
Dim HeaderRow As Integer
Dim a As Range
Dim arr As Variant
HeaderRow = 1 'Change this to whatever row your headers are in
For Each a In RNG.Cells
If Cells(HeaderRow, a.Column) = "Symbol" Then
If IsEmpty(arr) Then
arr = Array(ConvertLetterToNumber(a.Value))
Else
ReDim Preserve arr(UBound(arr) + 1)
arr(UBound(arr)) = ConvertLetterToNumber(a.Value)
End If
End If
Next
MostFrequentValue = ConvertNumberToLetter(ArrayMode(arr))
End Function
Function ConvertNumberToLetter(ByVal strSource As Integer) As String
ConvertNumberToLetter = LCase(Chr(strSource + 64))
End Function
Function ConvertLetterToNumber(ByVal strSource As String) As Integer
Dim i As Integer
Dim strResult As String
strSource = UCase(strSource)
For i = 1 To Len(strSource)
Select Case Asc(Mid(strSource, i, 1))
Case 65 To 90:
strResult = strResult & Asc(Mid(strSource, i, 1)) - 64
Case Else
strResult = strResult & Mid(strSource, i, 1)
End Select
Next
ConvertLetterToNumber = strResult
End Function
Function ArrayMode(Ray As Variant) As Integer
With Application
ArrayMode = .Mode(Ray)
End With
End Function
然后,您可以将函数输入到像=MostFrequentValue("A2:C2")
P.S。这假定符号列中每个值中的符号是字母表的小写字母(a-z)。您的示例
就是这种情况