【问题标题】:How to apply a Excel formula in VBA macro to find the 2nd to last word如何在 VBA 宏中应用 Excel 公式来查找倒数第二个单词
【发布时间】:2018-05-30 07:16:52
【问题描述】:

我对 VBA 还是很陌生,但一直在使用 Excel。我创建了一个公式,它完全符合我的需要:在单元格中找到倒数第 N 个单词(主要是倒数第 2 个或倒数第 3 个)。我认为我的主要问题是如何将公式应用于一系列单元格而不覆盖单元格以及如何在 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。

【问题讨论】:

  • 尝试在 VBA 公式字符串中用单引号更改双引号。
  • 您在 vba 中的语法发生了变化。你必须用“”'替换你的正常函数中的“,否则vba认为你的字符串结束了,而不是你真的想写下一个”。所以试试这个:reportsheet.Range("A1").Formula = "=TRIM(LEFT(RIGHT("" "" & SUBSTITUTE(TRIM(A20),"" "" ,REPT("" "",60)) ,180),60))""
  • 谢谢你们。但是,它仍然会覆盖单元格的内容,而不是应用公式。我还有什么遗漏的吗?
  • 哪个单元格的内容? A20 应保持不变,A1 应显示您提取的单词。
  • 真的很抱歉,我搞错了。我正在测试的代码在这两种情况下都有 A1。

标签: vba excel excel-formula


【解决方案1】:

在带引号的字符串中加双引号或使用替代项。

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))"

【讨论】:

    【解决方案2】:

    将@Jeeped 和评论者所写的引号加倍正在解决您的公式问题。 作为替代方案,您可以编写一个返回字符串的第 n 个单词的函数(“UDF”)。使用返回字符串数组的 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) 写为公式

    【讨论】:

    • 谢谢。我主要使用 Excel 公式(有时对我自己不利)并且对 VBA 相当无能
    • OP 想要 n'th to last 字,所以你应该返回 arr(UBound(arr) - n + 1)
    猜你喜欢
    • 2017-03-10
    • 2020-07-21
    • 1970-01-01
    • 1970-01-01
    • 2017-12-28
    • 2019-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多