使用Excel进行字符串操作-如果存在其他部分,如何删除字符串的一部分?

使用Excel进行字符串操作-如果存在其他部分,如何删除字符串的一部分?,excel,vba,string,worksheet-function,Excel,Vba,String,Worksheet Function,我在谷歌上搜索了一下,什么也找不到,尽管我可能只是找错地方了。我也不太擅长VBA,但我相信我可以用正确的指针来解决它:) 我正在构建一个字符串,它是基于各种条件的各种单元格的串联。我按顺序打这些 =IF(A405<>A404,G405,G405&H404) 如果存在Y,我只想删除D,如果存在Y,我只想删除 我该怎么办?(VBA或在单元格中,尽管我更喜欢在单元格中)可能更容易从末尾开始,在字符串开头添加内容,只有在Y不存在时才添加d。首先,为什么不在遍历所有单元格时保留一个字

我在谷歌上搜索了一下,什么也找不到,尽管我可能只是找错地方了。我也不太擅长VBA,但我相信我可以用正确的指针来解决它:)

我正在构建一个字符串,它是基于各种条件的各种单元格的串联。我按顺序打这些

=IF(A405<>A404,G405,G405&H404)
如果存在
Y
,我只想删除
D
,如果存在
Y
,我只想删除


我该怎么办?(VBA或在单元格中,尽管我更喜欢在单元格中)

可能更容易从末尾开始,在字符串开头添加内容,只有在Y不存在时才添加d。

首先,为什么不在遍历所有单元格时保留一个字符串数组,然后在末尾将其全部连接起来

否则,您将使用INSTR和MID等字符串函数执行以下操作:

start1 = instr(myLongString,"Y, ")
if start1 > 0 Then
    start2 = instr(myLongString,"D, ")
    if start2 > 0 then
        newLongString = left(myLongString, start2 - 1) & _
                        mid(myLongString, start2 + 3)
    end if
end if

但是,正如我所说的,我会保留一个易于循环的数组,一旦你有了所有你知道你将要使用的值,就在最后把它们连接起来。

我想D可能会出现在任何地方,那么:

If InStr(strString, "Y") > 0 Then
   strString = Replace(strString, "d", "")
   strString = Replace(strString, "  ", "")
   strString = Replace(strString, " ,", "")
   strString = Replace(strString, ",,", ",")
End If
尝试:


但这是假设在D后面总是有逗号和空格。

我也通过电子邮件得到了这个可能的解决方案:

=IF(A15<>A14,G15,IF(OR(AND(G15="CR247, ",ISNUMBER(FIND("CR247, ",H14))),AND(G15="CR149, ",ISNUMBER(FIND("CR215, ",H14))),AND(G15="CR149, ",ISNUMBER(FIND("CR180, ",H14))),AND(G15="CR180, ",ISNUMBER(FIND("CR215, ",H14))),G15="CR113, "),H14,G15&H14))
=IF(A15A14,G15,IF(或(和(和)(和)(G15=“CR247,”,ISNUMBER(查找(“CR247,”,H14)))和(G15=“CR149,”,ISNUMBER(查找(“CR215,”,H14)))和(G15=“CR180,”,ISNUMBER(查找(“CR215,”,H14)),G15=“CR113,”,H14,”)
(具有具有优先规则的“真实”值)

这看起来与奥巴马的答案相对类似


有更好的解决办法吗

如果要删除的组合不太多,可以使用=If(查找(“D”;A2)>0;替换(A2;1;3;“”);A2)

VBA:始终可以使用regexp对象。 我认为,只要正确构建正则表达式,就可以在脚本上测试任何内容

签出:(供regexp参考)
还有一个测试regexp的简单工具:

在单元格中:您可以用一种更加友好的方式来完成:
假设在A:A列上有值。
您可以在执行检查的位置添加一个新列
if(间接(“A”&row())间接(“A”&row()-1)、间接(“G”&row())、间接(“G”&row())和间接(“H”&row())

或者不管值是什么。然而,我猜想if语句的一个分支上的值应该是空的。在此之后,只连接B:B列值(如果需要,跳过空格)


希望这能有所帮助。

您需要在FIND语句中使用ISERROR或ISNUMBER,以防它找不到它要找的内容(因此您必须切换这两个案例)。fwiw:这是我最后使用的答案-感谢其他建议!!
=IF(ISERROR(FIND("Y",A1)),A1,SUBSTITUTE(A1,"D, ",""))
=IF(A15<>A14,G15,IF(OR(AND(G15="CR247, ",ISNUMBER(FIND("CR247, ",H14))),AND(G15="CR149, ",ISNUMBER(FIND("CR215, ",H14))),AND(G15="CR149, ",ISNUMBER(FIND("CR180, ",H14))),AND(G15="CR180, ",ISNUMBER(FIND("CR215, ",H14))),G15="CR113, "),H14,G15&H14))