如何在特殊情况下替换excel中的字符

时间:2014-10-10 13:25:13

标签: excel replace

所以我有一个71563 x 3数据集,其中包含一系列化学分子式。这种化学式的一个例子是C40H56O4,其中字母代表化学物质,数字代表它们的多样性。我想要做的是用字母'O'替换所有字符,用较小的字母'o'替换,但仅当'O'在两个数字之间,而不是在它之前有字符时。例如: -

C57H85N <9109 将变为C57H85N 9o9 ,但C6H13 NO2 将保持不变。如果可能的话,我如何在excel中写出这个公式呢?

由于

道歉我之前应该说过,有些情况下,字母“O”之前有一个数字,但它之后没有任何内容。例如: - C8H16O,应为C8H16o

4 个答案:

答案 0 :(得分:1)

好的,所以我的解决方案可能不是最紧凑的,但它确实可以使用公式。你必须调整为三列,但是如果所有数据都在A列中,它就是如何工作的。

  1. 将此公式添加到B列。这会从单元格中的第二个字母开始忽略前导O.它返回单元格中第一个O的位置。

    =FIND("O",A1,2)

  2. 在B栏中添加这个,它将为您提供三个字母的字符串。

    =MID(A1,B1 - 1,3)

  3. 在C栏中输入第一个数字。

    =LEFT(C1,1)

  4. D列检查C列是否为整数。

    =IF(IFERROR(INT(D1),FALSE),A1,FALSE)

  5. E栏进行替换。

    =IF(E1 <>FALSE,REPLACE(A1,B1-1,3,LEFT(C1,1) & "o" & RIGHT(C1,1)),A1)

  6. 请注意,这假设每个分子只有一个O.我将尝试更新此内容以检查多个O.

    编辑:

    我把它归结为一个单细胞配方。保持上述内容虽然可以解释步骤。

    =IF(IFERROR(INT(MID(A1,FIND("O",A1,2) - 1, 1)), FALSE) <> FALSE, REPLACE(A1,FIND("O",A1,2),1,"o"),A1)
    

答案 1 :(得分:1)

在标准模块中输入以下 UDF

Public Function xlate(s As String) As String
    Dim N As Long, i As Long, CH As String
    N = Len(s)
    xlate = ""
    If N < 3 Then
        xlate = s
        Exit Function
    End If
    For i = 2 To N - 1
        CH = Mid(s, i, 1)
        If CH <> "O" Then
            xlate = xlate & CH
        Else
            If IsNumeric(Mid(s, i - 1, 1)) And IsNumeric(Mid(s, i + 1, 1)) Then
                xlate = xlate & "o"
            Else
                xlate = xlate & "O"
            End If
        End If
    Next i
    xlate = Left(s, 1) & xlate & Right(s, 1)
End Function

然后使用 A1 中的数据,在 B1 中输入:

=xlate(A1)

并复制

用户定义函数(UDF)非常易于安装和使用:

  1. ALT-F11调出VBE窗口
  2. ALT-I ALT-M打开了一个新模块
  3. 粘贴内容并关闭VBE窗口
  4. 如果保存工作簿,UDF将随之保存。 如果您在2003年之后使用的是Excel版本,则必须保存 该文件为.xlsm而不是.xlsx

    删除UDF:

    1. 按上述方式调出VBE窗口
    2. 清除代码
    3. 关闭VBE窗口
    4. 从Excel使用UDF:

      = XLATE(A1)

      要了解有关宏的更多信息,请参阅:

      http://www.mvps.org/dmcritchie/excel/getstarted.htm

      http://msdn.microsoft.com/en-us/library/ee814735(v=office.14).aspx

      有关UDF的详细信息,请参阅:

      http://www.cpearson.com/excel/WritingFunctionsInVBA.aspx

      必须启用宏才能使其生效!

      修改#1

      以下是处理终端 O

      的更新代码
      Public Function xlate(s As String) As String
          Dim N As Long, i As Long, CH As String
          N = Len(s)
          xlate = ""
          If N < 3 Then
              xlate = s
              Exit Function
          End If
          For i = 2 To N - 1
              CH = Mid(s, i, 1)
              If CH <> "O" Then
                  xlate = xlate & CH
              Else
                  If IsNumeric(Mid(s, i - 1, 1)) And IsNumeric(Mid(s, i + 1, 1)) Then
                      xlate = xlate & "o"
                  Else
                      xlate = xlate & "O"
                  End If
              End If
          Next i
          xlate = Left(s, 1) & xlate
          If Right(s, 1) = "O" And IsNumeric(Right(xlate, 1)) Then
              xlate = xlate & "o"
          Else
              xlate = xlate & Right(s, 1)
          End If
      End Function
      

答案 2 :(得分:1)

公式:

=IF(ISERROR(INT(MID(A1,FIND("O",A1)-1,1))),A1,IF(FIND("O",A1)=LEN(A1),A1,REPLACE(A1,FIND("O",A1),1,"o")))

答案 3 :(得分:-2)

听起来像是VBA宏的工作:

dim rng as range, subrange as range
rng = range("A1", "ZZ256")
for each subrange in rng
    rng.value2 = replace(rng.value2, "9O9", "9o9")
next rng