如何在VBA宏中应用Excel公式来查找倒数第二个单词

时间:2018-05-30 07:16:52

标签: excel vba excel-vba excel-formula

我对VBA很陌生,但一直在使用Excel。我创建了一个完全符合我需要它的公式:在单元格中找到Nth到最后一个单词(大多数是第二个或第三个到第三个)。我认为我的主要问题是如何在不覆盖单元格的情况下将公式应用于一系列单元格以及如何在VBA中使用excel公式。我使用的Excel公式如下

=TRIM(LEFT(RIGHT(" "&SUBSTITUTE(TRIM(A1)," ",REPT(" ",60)),180),60))

它可能不是最有说服力的方式,但它在Excel中运行良好。将数字180更改为60将给出最后一个单词,将120更改为倒数第二个,依此类推。但是在VBA中它给出了第一个语法错误,当我让它在没有参数的情况下运行时,只有TRIM(A1)它会覆盖单元格。我使用的代码如下(仅引用A1来测试它):

reportsheet.Range("A1").Formula = "=TRIM(LEFT(RIGHT(" " & SUBSTITUTE(TRIM(A1)," " ,REPT(" ",60)),180),60))"

我的宏搜索并从Sheet1提取特定数据到Sheet2。现在我想将这个(或类似的)公式应用于它提取给Sheet2的数据。我尝试了很多不同的东西,从使用VBA自己的装饰到制作完全自定义的功能。它似乎都不起作用,我认为这是由于对Excel公式和VBA如何一起玩的误解。

此外,我正试图找到一种方法来查找单元格中的唯一数字并删除其他所有数字。任何有关这方面的帮助也将不胜感激。

编辑:对不起,伙计们,我提供的代码中有一个错误,在两个实例中都应该引用A1。

2 个答案:

答案 0 :(得分:2)

在引用的字符串中加倍引号或使用替代字符。

reportsheet.Range("A1").Formula = "=TRIM(LEFT(RIGHT("" "" & SUBSTITUTE(TRIM(A20),"" "" ,REPT("" "",60)),180),60))"
'alternative
reportsheet.Range("A1").Formula = "=TRIM(LEFT(RIGHT(char(32) & SUBSTITUTE(TRIM(A20), char(32), REPT(char(32),60)),180),60))"

答案 1 :(得分:2)

将引号加倍为@Jeeped和评论者写的是用公式解决你的问题。 作为替代方案,您可以编写一个函数(" UDF"),它返回字符串的第n个单词。使用返回字符串数组的VBA函数split相当容易。将以下代码放在模块中:

Public Function getWord(s As String, ByVal n As Integer) As String

    n = n - 1   ' Because Array index will start at 0

    Dim arr() As String
    arr = Split(s, " ")
    If UBound(arr) >= n Then
        getWord = arr(n)
    End If

End Function

在Excel中,您编写例如=getWord(A20, 3)作为公式