【问题标题】:Have formula to remove all characters to the right of the last char (there might be more then one) problems with vba有公式可以删除最后一个字符右侧的所有字符(可能有多个)vba问题
【发布时间】:2014-04-10 15:27:49
【问题描述】:

公式=LEFT(A2,FIND("|",SUBSTITUTE(A2,".","|",LEN(A2)-LEN(SUBSTITUTE(A2,".",""))))-1) 删除last . 右侧的所有字符(可能不止一个)如果我将它添加到单元格并复制下来,它就可以工作。

我不知道如何将公式添加到 vba

如果只有一个.,我有vba

(要评估的单元格在 A 列中,输出到 E 列) 当我将代码添加到模块c.Formula = "=LEFT(A2,FIND("|",SUBSTITUTE(A2,".","|",LEN(A2)-LEN(SUBSTITUTE(A2,".",""))))-1)" 时,它以红色突出显示,错误Invalid Character 带有| 高亮显示

谢谢

Sub NotWorking()
Dim c As range
Dim Lastrow As Long

With Sheets("sheet1")
    Lastrow = .range("C" & .Rows.Count).End(xlUp).Row
    For Each c In .range("E2:E" & Lastrow)
        c.Formula = "=LEFT(A2,FIND("|",SUBSTITUTE(A2,".","|",LEN(A2)-LEN(SUBSTITUTE(A2,".",""))))-1)"
    Next
    .range("E1").Value = "Source"
End With

End Sub

【问题讨论】:

  • 公式中的双引号需要加倍。
  • 正如 Gary'sStudent 提到的,你应该使用:c.Formula = "=LEFT(A2,FIND(""|"",SUBSTITUTE(A2,""."",""|"",LEN(A2)-LEN(SUBSTITUTE(A2,""."",""""))))-1)"
  • 谢谢,感谢您的帮助

标签: excel vba


【解决方案1】:

第一个提示:

当你在 VBA 的公式中使用引号时,你应该使用双引号。例如

改为

Range("E1").Formula="=IF(A1="test",1,2)"

你应该使用

Range("E1").Formula="=IF(A1=""test"",1,2)"

第二个提示:

应用公式时无需使用循环。有一种更有效的方法。

接下来是你的代码

For Each c In .range("E2:E" & Lastrow)
    c.Formula = "=LEFT(A2,FIND("|",SUBSTITUTE(A2,".","|",LEN(A2)-LEN(SUBSTITUTE(A2,".",""))))-1)"
Next

为您提供 E2 的公式:=LEFT(A2,...),以及 E3 的公式 =LEFT(A2,...)(请注意两个公式中的 A2)。我想,这不是你所期望的。改用这个:

.Range("E2:E" & Lastrow).Formula="=LEFT(A2,FIND(""|"",SUBSTITUTE(A2,""."",""|"",LEN(A2)-LEN(SUBSTITUTE(A2,""."",""""))))-1)"

以上代码将公式应用于整个范围。公式将针对每一行进行调整,例如E2 的公式为 =LEFT(A2,...)E3 的公式为 =LEFT(A3,...),以此类推。

但是,如果您需要对整列 E 使用相同的公式(对于 E2=LEFT(A2,...),对于 E3,再次使用 =LEFT(A2,...)),请使用 absolute/混合引用(带有$ 符号):

.Range("E2:E" & Lastrow).Formula="=LEFT(A$2,FIND(""|"",SUBSTITUTE(A$2,""."",""|"",LEN(A$2)-LEN(SUBSTITUTE(A$2,""."",""""))))-1)"

【讨论】:

  • 感谢 simoco,我对何时使用循环以及何时(如果有)不使用感到困惑,因为我所知道的大部分内容来自论坛和谷歌搜索,而且我阅读的大多数内容都使用循环,所以我使用循环所以我很感激你的cmets
  • @Tim,在所有可能不使用循环的情况下 - 不要使用它:) 当您对整个范围应用相同的公式时,最好使用 Range("A1:A10").Formula="=Left(A2,...)" 而不是使用循环。我已经更新了我的回答,详细说明了你的循环实际上做了什么,并以最合理的方式完成了
【解决方案2】:

除了@Simoco 提出的要点之外,您还需要调整单元格引用以获得与复制范围相同的效果,因为 Excel 会自动为您调整这些(除非您使用绝对引用 $) ,而 VBA 不会。

最简单的方法是使用R1C1 版本的单元格引用。

试试这个

Sub Working()
    Dim rng As Range
    With Sheets("sheet1")
        Set rng = Range(.Cells(2, 5), .Cells(.Rows.Count, 3).End(xlUp).Offset(, 2))
    End With
    rng.FormulaR1C1 = "=LEFT(RC1,FIND(""|"",SUBSTITUTE(RC1,""."",""|"",LEN(RC1)-LEN(SUBSTITUTE(RC1,""."",""""))))-1)"

End Sub

【讨论】:

  • 感谢 Chris,我刚刚在 R1C1 上找到了这个 http://excelmate.wordpress.com/2013/04/22/excel-r1c1-reference-style-vs-a1/,我希望它能让我清楚地了解 R1C1 的使用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-02-22
  • 1970-01-01
  • 2013-04-23
  • 1970-01-01
  • 2015-09-26
  • 2014-02-01
  • 2018-08-15
相关资源
最近更新 更多