所以我有一个71563 x 3数据集,其中包含一系列化学分子式。这种化学式的一个例子是C40H56O4,其中字母代表化学物质,数字代表它们的多样性。我想要做的是用字母'O'替换所有字符,用较小的字母'o'替换,但仅当'O'在两个数字之间,而不是在它之前有字符时。例如: -
C57H85N <9109 将变为C57H85N 9o9 ,但C6H13 NO2 将保持不变。如果可能的话,我如何在excel中写出这个公式呢?由于
道歉我之前应该说过,有些情况下,字母“O”之前有一个数字,但它之后没有任何内容。例如: - C8H16O,应为C8H16o
答案 0 :(得分:1)
好的,所以我的解决方案可能不是最紧凑的,但它确实可以使用公式。你必须调整为三列,但是如果所有数据都在A列中,它就是如何工作的。
将此公式添加到B列。这会从单元格中的第二个字母开始忽略前导O.它返回单元格中第一个O的位置。
=FIND("O",A1,2)
在B栏中添加这个,它将为您提供三个字母的字符串。
=MID(A1,B1 - 1,3)
在C栏中输入第一个数字。
=LEFT(C1,1)
D列检查C列是否为整数。
=IF(IFERROR(INT(D1),FALSE),A1,FALSE)
E栏进行替换。
=IF(E1 <>FALSE,REPLACE(A1,B1-1,3,LEFT(C1,1) & "o" & RIGHT(C1,1)),A1)
请注意,这假设每个分子只有一个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)非常易于安装和使用:
如果保存工作簿,UDF将随之保存。 如果您在2003年之后使用的是Excel版本,则必须保存 该文件为.xlsm而不是.xlsx
删除UDF:
从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