Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String Excel匹配范围内所有字符串中的最后一个单词…VBA_String_Vba_Excel_Vlookup - Fatal编程技术网

String Excel匹配范围内所有字符串中的最后一个单词…VBA

String Excel匹配范围内所有字符串中的最后一个单词…VBA,string,vba,excel,vlookup,String,Vba,Excel,Vlookup,我正在创建一个小工具,帮助分析歌曲写作技巧。 我有一个数据库,里面有今年a组的歌词。 歌词一行接一行向下(示例) 我想创建一个vba,调用用户输入一个单词…例如 在本例中为“开始”。 代码将匹配每个句子的最后一个单词,并返回包含搜索单词的列作为句子的最后一个单词 然后,它需要向用户显示一条包含整个句子的消息,以及上面的两句话和下面的两句话 在我们的示例中,它会将下面的句子带回给用户: 1. Tryna catch the beat, make up your heart 1. Don't kno

我正在创建一个小工具,帮助分析歌曲写作技巧。 我有一个数据库,里面有今年a组的歌词。 歌词一行接一行向下(示例)

我想创建一个vba,调用用户输入一个单词…例如 在本例中为“开始”。 代码将匹配每个句子的最后一个单词,并返回包含搜索单词的列作为句子的最后一个单词

然后,它需要向用户显示一条包含整个句子的消息,以及上面的两句话和下面的两句话

在我们的示例中,它会将下面的句子带回给用户:

1. Tryna catch the beat, make up your heart
1. Don't know if you're happy or complaining
1. Don't want for us to end, where do I start?
1. First you wanna go to the left then you wanna turn right
1. Wanna argue all day, making love all night
我在V型查找和索引匹配之间挣扎,但在找到一个好的起点时遇到了困难

有没有人能告诉我正确的方向

更新:

我还没有工作代码。我的工作表中有公式

在B栏中

我有公式

=IF(ISERR(FIND(" ",A4)),"",RIGHT(A4,LEN(A4)-FIND("*",SUBSTITUTE(A4," ","*",LEN(A4)-LEN(SUBSTITUTE(A4," ",""))))))
它记录了每句话的最后一句话

在D栏中

我有一个公式,将输入字与B列进行比较,然后返回a列

=IF($D$2=B4,A4,"NO MATCH")
我相信我可以写一个VBA,用搜索词来代替“D2”,但接下来我就被困在如何从那里开始了


一般方法

您需要将问题分解为可组合的步骤:

  • 问题1。获取要分析的值(字符串)
  • 问题2。在列中查找单个值的所有出现项
  • 问题3。对于给定的一行,显示相邻的两行(上下)
如果你能单独解决每一个问题,你只需要以某种方式组合出解决方案,最终得到你想要的

VBA与普通excel公式的比较

如果你对能量学没有严格的要求,你可以用excel公式做很多你想做的事情。但是,如果您有/需要用户界面,VBA是最佳选择。因此,如果你有很好的,甚至是一般的VBA技能,那么就走这条路,因为公式之路需要大量excel公式的优秀知识

解决问题

一旦你有了这个问题,你可以在谷歌上搜索它(或者把它贴在网上——如果你有一个小问题,你会得到更多的答案)

例如,我在谷歌上搜索了第二期,我发现(除其他外):

  • 这是一个解决问题2的常规excel公式(请特别注意步骤3,这是问题3所需的,即找到的值的索引)。还详细解释了公式的工作原理。即使您遵循VBA路线,仍然可以在VBA代码中重用公式,因此一切都很好

    现在,你希望在句子的最后一个单词中找到这个值。因此,添加一个列来容纳句子的最后一个单词,并将解决方案2应用于该列

    问题3也可以通过公式解决,一旦你有了索引开始。您可能必须使用以下函数
    OFFSET
    和数组公式。有关数组公式,请参见:。如果我刚才说的对你来说是中文,走VBA之路,会更容易

    我没有给你一个解决方案(对不起,我有点忙),但我希望这至少能帮助你思考这个问题,并为你正在寻找的小步骤找到解决方案

    [更新]: 在谷歌搜索之后,以下是一些您可以改进的解决方案:

    • 将以下用户定义的函数添加到excel工作表中
    `

    函数concatFormat(分隔符作为变量,ParamArray CellRanges()作为变量)作为字符串
    变暗索引为长,Rw为长,Col为长,Down为布尔值,Rng为范围,单元格为范围
    如果IsMissing(分隔符),则Delimiter=“”
    索引=LBound(单元格范围)
    当指数=65和_
    
    Asc(Schracter)一般方法

    您需要将问题分解为可组合的步骤:

    • 问题1。获取要分析的值(字符串)
    • 问题2。在列中查找单个值的所有出现项
    • 问题3。对于给定的一行,显示相邻的两行(上下)
    如果你能单独解决每一个问题,你只需要以某种方式组合出解决方案,最终得到你想要的

    VBA与普通excel公式的比较

    如果你对能量学没有严格的要求,你可以用excel公式做很多你想做的事情。但是,如果您有/需要用户界面,VBA是最佳选择。因此,如果你有很好的,甚至是一般的VBA技能,那么就走这条路,因为公式之路需要大量excel公式的优秀知识

    解决问题

    一旦你有了这个问题,你可以在谷歌上搜索它(或者把它贴在网上——如果你有一个小问题,你会得到更多的答案)

    例如,我在谷歌上搜索了第二期,我发现(除其他外):

  • 这是一个解决问题2的常规excel公式(请特别注意步骤3,这是问题3所需的,即找到的值的索引)。还详细解释了公式的工作原理。即使您遵循VBA路线,仍然可以在VBA代码中重用公式,因此一切都很好

    现在,你希望在句子的最后一个单词中找到这个值。因此,添加一个列来容纳句子的最后一个单词,并将解决方案2应用于该列

    问题3也可以通过公式解决,一旦你有了索引开始。您可能必须使用以下函数
    OFFSET
    和数组公式。有关数组公式,请参见:。如果我刚才说的对你来说是中文,走VBA之路,会更容易

    我没有给你一个解决方案(对不起,我有点忙),但我希望这至少能帮助你思考这个问题,并为smalle找到解决方案
    =IF($D$2=B4,A4,"NO MATCH")
    
    Function concatFormat(Delimiter As Variant, ParamArray CellRanges() As Variant) As String
      Dim Index As Long, Rw As Long, Col As Long, Down As Boolean, Rng As Range, Cell As Range
      If IsMissing(Delimiter) Then Delimiter = ""
      Index = LBound(CellRanges)
      Do While Index <= UBound(CellRanges)
        If TypeName(CellRanges(Index)) = "Range" Then
          Set Rng = CellRanges(Index)
          If Index < UBound(CellRanges) Then
            If TypeName(CellRanges(Index + 1)) <> "Range" Then Down = CellRanges(Index + 1) = "|"
          End If
          If Down Then
            For Col = 0 To Rng.Columns.Count - 1
              For Rw = 0 To Rng.Rows.Count - 1
                If Len(Rng(1).Offset(Rw, Col).Value) Then concatFormat = concatFormat & Delimiter & Rng(1).Offset(Rw, Col).Text
              Next
            Next
            Index = Index + 1
          Else
            For Each Cell In Intersect(Rng, Rng.Parent.UsedRange)
              If Len(Cell.Value) Then concatFormat = concatFormat & Delimiter & Cell.Text
            Next
          End If
        Else
          If CellRanges(Index) = "||" Then
            concatFormat = concatFormat & Delimiter & "|"
          Else
            concatFormat = concatFormat & Delimiter & CellRanges(Index).Text
          End If
        End If
        Index = Index + 1
      Loop
      concatFormat = Mid(concatFormat, Len(Delimiter) + 1)
    End Function
    
    Function UStrip(sWord As String) As String
        Dim x As Long
        Dim sCharacter As String
    'This function takes a string outputs an uppercase equivalent with
    '  all characters stripped but numbers and letters
    'Uppercase is used since it is a better function with "Find" since case becomes immaterial
        sWord = UCase(sWord)  'Convert to Uppercase
        UStrip = "" 'Set originall as null
        For x = 1 To Len(sWord) 'Act on each letter
            sCharacter = Mid(sWord, x, 1)
            If Asc(sCharacter) >= 65 And _
                Asc(sCharacter) <= 90 Then '65-90 are ASCII "A"-"Z"
                'sCharacter is a LETTER
                UStrip = UStrip & sCharacter
            ElseIf sCharacter = " " Then
                'sCharacter is a space
                UStrip = UStrip & sCharacter
            ElseIf Asc(sCharacter) >= 48 And _
                Asc(sCharacter) <= 57 Then '48-57 are ASCII "0"-"9"
                'sCharacter is a "text-NUMBER"
                UStrip = UStrip & sCharacter
          End If
        Next x
    End Function