2014-10-10 43 views
0

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

C57H85N 9O9将成为C57H85N 9o9,但C6H13 NO2将保持不变。如果可能的话,我将如何在excel中为此写出一个公式?

感谢

道歉,我应该更早,有其存在的字母前的一些情况说明“O”,但它没有经过任何事情。例如: - C8H16O,应该是C8H16o

+0

作为首字母或尾字符的** O **如何? – 2014-10-10 13:27:55

+0

它不会工作,因为我需要它只能被替换,如果有一个整数在它之前,而不是一个字符 – user2062207 2014-10-10 13:39:32

回答

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)

注意,这个假设只会有每个分子一个O。我会尝试更新它来检查多个O's。

编辑:

我把它归结为一个单元格公式。保持上述,但解释的步骤。

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

道歉为最近的答复,我会很快就给这个去看看它如何展示,但谢谢你! – user2062207 2014-10-10 14:01:53

+0

这个作品也很漂亮!非常感谢你 – user2062207 2014-10-10 14:03:17

+0

这一个没有解决终端“O”的问题。 – 2014-10-10 14:05:06

1

在标准模块中输入以下UDF:在A1

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 
与数据

然后,在B1输入:

=xlate(A1) 

和复制下来

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

  1. ALT-F11带来了VBE窗口
  2. ALT-I ALT + M打开一个新的模块
  3. 粘贴的东西并关闭VBE窗口

如果保存工作簿,则UDF将与其一起保存。 如果您正在使用一个版本的Excel更高然后2003,你必须保存 该文件作为.XLSM而非的.xlsx

要删除UDF:

  1. 弹出窗口VBE如上
  2. 清晰的代码进行
  3. 关闭VBE窗口

从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

必须启用宏才能使其工作!

EDIT#1

这里是更新的代码来处理终端ø

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 
+0

你先生是一个向导。对不起,我刚刚意识到有些情况下在O之前有一个数字,但之后没有字符或数字,例如C8H16O的情况。我将如何去调整代码,以便将其考虑在内? 也从现在开始了解更多关于宏的内容haha – user2062207 2014-10-10 13:58:01

+0

这个终端应该如何处理? – 2014-10-10 13:59:31

+0

所以它也应该成为一个小写的O,所以C8H16O应该是C8H16o,除非在它之前有一个字符 – user2062207 2014-10-10 14:00:36

-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 
+0

我同意使用一个宏,但是你只需要替换_9O9_,而用户想要在哪里有任何解决方案(如果_n_是任何数字)就存在_nOn_该字符串变成_n ** o ** n_ – BradyK 2014-10-10 13:52:05

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

+0

Upvoted for being比我的公式更清洁。从未想过要使用'ISERROR'。 – BradyK 2014-10-10 13:59:04

+0

他们都似乎很好,对不起,我不能接受所有的答案,但他们都很棒!谢谢 – user2062207 2014-10-10 14:04:30

+0

我的答案是迄今唯一解决终端“O”问题的答案。 – 2014-10-10 14:05:58