Excel 计算单元格中的大写单词和标点符号

Excel 计算单元格中的大写单词和标点符号,excel,excel-formula,vba,Excel,Excel Formula,Vba,我已经使用这个网站很长一段时间来解决我的Excel问题,但还没有找到以下问题的解决方案。 我在B16到B936单元格中有文本字符串(从约5个单词到1000个单词长)。 我想实现两件事: 计算每个单元格中出现的大写字母单词 长度超过两个字符的。所以基本上我发现 StackOverflow是一个非常棒的网站“会返回分数“1” 由于“GREAT”是此文本字符串中唯一较长的单词 超过2个字符,并以大写字母表示 计算多个问号(“?”,“?”)的次数, “??,…)显示在这些文本字符串中。示例:“你确定吗?

我已经使用这个网站很长一段时间来解决我的Excel问题,但还没有找到以下问题的解决方案。 我在B16到B936单元格中有文本字符串(从约5个单词到1000个单词长)。 我想实现两件事:

  • 计算每个单元格中出现的大写字母单词 长度超过两个字符的。所以基本上我发现 StackOverflow是一个非常棒的网站“会返回分数
    “1”
    由于
    “GREAT”
    是此文本字符串中唯一较长的单词 超过2个字符,并以大写字母表示

  • 计算多个问号
    (“?”,“?”)的次数,
    “??,…)
    显示在这些文本字符串中。示例:
    “你确定吗?”
    ??真的确定??将返回分数“2”
    。我试着用一个 例如
    (LEN-LEN(替换为(…;“?”)
    ,但当 公式遇到一个
    它返回一个奇数结果

  • 给你:

    Function CountUppercaseWords(Expression As String) As Integer
        Dim SplitArray() As String
        SplitArray = Split(Expression, " ")
        Dim I As Integer
        Dim Count As Integer
        Dim NextWord As String
        Count = 0
        For I = LBound(SplitArray) To UBound(SplitArray)
            NextWord = SplitArray(I)
            If NextWord = UCase(NextWord) And Len(NextWord) >= 2 Then
                Count = Count + 1
            End If
        Next
        CountUppercaseWords = Count
    End Function
    
    Function MultipleQuestionMarkOccurences(Expression As String) As Integer
        Dim I As Integer
        Dim CurrentLength As Integer
        Dim Count As Integer
        Dim NextChar As String
        Count = 0
        CurrentLength = 0
        For I = 1 To Len(Expression)
            NextChar = Mid(Expression, I, 1)
            If NextChar = "?" Then
                CurrentLength = CurrentLength + 1
            Else
                CurrentLength = 0
            End If
            If CurrentLength = 2 Then
                Count = Count + 1
            End If
        Next
        MultipleQuestionMarkOccurences = Count
    End Function
    

    这不是一个完美的解决方案,但可能会有所帮助。 公共函数CountUpperWords(ByVal String1作为字符串)作为整数

    Dim StringArray() As String
    ReDim StringArray(Len(String1)) As String
    Dim String2 As String
    Dim String2Array() As String
    ReDim String2Array(UBound(StringArray)) As String
    Dim isUpper As Boolean
    String2 = UCase(String1)
    
    For i = 0 To Len(String1) ' fragmentation all text to array and make UCase mirror 
        StringArray(i) = Mid(String1, i + 2, 1) 'Function would start from secound character because first character often will be upper
        String2Array(i) = LCase(StringArray(i))
    Next
    
    CountUpperCases = 0
    
    For i = 0 To UBound(StringArray) ' compare original text and upper
        If StringArray(i) <> String2Array(i) Then
            j = i
            isUpper = False
            Do While StringArray(j) <> " " ' checking word is upper
                If StringArray(j) <> String2Array(j) Then
                    isUpper = True
                    Else
                    isUpper = False
                End If
                j = j + 1
            Loop
            If isUpper = True Then
                    CountUpperCases = CountUpperCases + 1
                End If
            i = j
        End If
    Next
    
    End Function
    
    Dim StringArray()作为字符串
    将ReDim StringArray(Len(String1))作为字符串
    将字符串2变暗为字符串
    将String2Array()设置为字符串
    将String2Array(UBound(StringArray))重拨为字符串
    Dim是布尔型的
    String2=UCase(String1)
    对于i=0到Len(String1)'将所有文本碎片化到数组并生成UCase镜像
    StringArray(i)=Mid(String1,i+2,1)'函数将从secound字符开始,因为第一个字符通常是上字符
    String2Array(i)=LCase(StringArray(i))
    下一个
    CountUpperCases=0
    对于i=0到UBound(StringArray)'比较原始文本和上限
    如果StringArray(i)String2Array(i),则
    j=i
    isUpper=False
    当StringArray(j)“”检查单词为大写时执行
    如果StringArray(j)String2Array(j),则
    isUpper=True
    其他的
    isUpper=False
    如果结束
    j=j+1
    环
    如果isUpper=True,则
    CountUpperCases=CountUpperCases+1
    如果结束
    i=j
    如果结束
    下一个
    端函数
    
    我觉得这很搞笑。我很想知道您使用这些数据进行的实际报告的结果。当您返回结果时,布局会是什么样子?1)转到“C”2)转到“D”?您能否给出该列数据中可能存在的所有标点符号的确定列表?“我用这个网站解决我的Excel问题已经很长时间了”,但这是你的第一个问题,从…今天起你就是会员了。你可以不提供代码也可以试试。@PJ Rosenburg:正楷和多个标点符号被用作情绪的代表(大多是负面情绪)以书面形式。现有的元规范不考虑基于单词和其他工件计算价和交互。我不是VBA方面的专家,但请参见上面的OP重新标点。例如,此解决方案是否也会忽略字符串“IS!“-我认为这不应该被视为计数的一部分-从诸如“你知道任何伟大的网站吗?”?对StackOverflow是!“?是的,你是对的。首先你必须从表达式中去掉所有标点符号。还要定义标点符号。@XOR LX:说得好。谢谢。在对法语文本进行分析时,大写字母超过2个字符的任何内容都是有意义的。你给出的示例实际上并不适用于法语年龄。这在英语中是常见的吗?它的意思是什么?它是否有任何情感意义!“?他的意思是我的方法将所有非空白字符作为单词的一部分进行计数。不客气。如果您当时接受我的回答,我将不胜感激。”。