2014-10-14 7 views
1

Итак, у меня есть столбец, называемый химической формулой для 40 000 записей, и то, что я хочу сделать, - подсчитать, сколько элементов содержится в химической формуле. Так, например: -Как подсчитать элементы в excel

EXACT_MASS FORMULA 
626.491026 C40H66O5 
275.173274 C13H25NO5 

Для этого мне нужно какое-то формулы, которая будет возвращать с результатом

C H O 
40 66 5 
13 25 5 

все как отдельные колонки для различных элементов и в строках для различных записей , Есть ли формула, которая может это сделать?

+0

Являются ли строки фиксированными, я имею в виду, что каждая запись имеет алфавит, затем два числа, алфавит, а затем два числа, алфавит и остальные цифры? – Vasim

+0

Итак, каждая запись имеет алфавит, но цифры могут отличаться. Например, вы можете получить C10H60, или вы можете получить CH4, который должен считать C как 1 или даже CH3O, который должен считать C и O равным 1 и H как 3 – user2062207

+0

K, но все стандартно, так как всегда начинается с C затем следует H, а затем О. Право? – Vasim

ответ

4

Вы можете сделать свою собственную формулу.

Откройте редактор VBA с ALT и F11 и вставить новый модуль.

Добавить ссылку на Microsoft VBScript Regular Expressions 5.5, нажав Инструменты, затем ссылки.

Теперь добавьте следующий код:

Public Function FormulaSplit(theFormula As String, theLetter As String) As String 

    Dim RE As Object 
    Set RE = CreateObject("VBScript.RegExp") 
    With RE 
     .Global = True 
     .MultiLine = False 
     .IgnoreCase = False 
     .Pattern = "[A-Z]{1}[a-z]?" 
    End With 

    Dim Matches As Object 
    Set Matches = RE.Execute(theFormula) 

    Dim TheCollection As Collection 
    Set TheCollection = New Collection 

    Dim i As Integer 
    Dim Match As Object 
    For i = (Matches.Count - 1) To 0 Step -1 
     Set Match = Matches.Item(i) 
     TheCollection.Add Mid(theFormula, Match.FirstIndex + (Len(Match.Value) + 1)), UCase(Trim(Match.Value)) 
     theFormula = Left(theFormula, Match.FirstIndex) 
    Next 

    FormulaSplit = "Not found" 
    On Error Resume Next 
    FormulaSplit = TheCollection.Item(UCase(Trim(theLetter))) 
    On Error GoTo 0 

    If FormulaSplit = "" Then 
     FormulaSplit = "1" 
    End If 

    Set RE = Nothing 
    Set Matches = Nothing 
    Set Match = Nothing 
    Set TheCollection = Nothing 

End Function 

Использование:

  • FormulaSplit("C40H66O5", "H") вернется 66.
  • FormulaSplit("C40H66O5", "O") вернется 5.
  • FormulaSplit("C40H66O5", "blah") вернется "Не найдено" ,

Вы можете использовать эту формулу непосредственно в своей книге. Example of FormulaSplit usage in Workbook

+0

Благодарим за помощь! Я просто отпустил его сейчас, в основном скопировал и вставил его, но я продолжаю получать следующий ответ: - Пользовательский тип не определен – user2062207

+0

@ user2062207 - добавлена ​​ли ссылка на библиотеку Microsoft VBScript Regular Expressions 5.5? В редакторе VBA щелкните инструменты, а затем ссылки. Затем найдите «Microsoft VBScript Regular Expressions 5.5» в списке. Отметьте его и нажмите OK. –

+1

@ user2062207 Я обновил код Джейми, чтобы иметь позднюю привязку. Я верю, что когда Джейми это одобрит, вы сможете увидеть обновленный код, и тогда вы сможете это проверить. –

3

У меня был удар при этом в формуле-над придумывают следующее:

=IFERROR((MID($C18,FIND(D17,$C18)+1,2))*1,IFERROR((MID($C18,FIND(D17,$C18)+1,1))*1,IFERROR(IF(FIND(D17,$C18)>0,1),0))) 

Это не очень аккуратно и должны быть расширены и далее, если любой из ваших элементов собираются чтобы появиться более 99 раз - я также использовал случайное размещение на моем листе, чтобы заголовки H, C и O были в строке 17. Я бы лично пошел с ответом Джейми, но просто хотел попробовать это, чтобы посмотреть, смогу ли я это сделать в формула была возможной и показала, что стоит поделиться тем же, что и другая перспектива.

+0

Спасибо, тем не менее, за помощь ! Я дам ему понять, как это происходит. – user2062207

+0

Это прекрасно работает для двух примеров, поэтому он получает мой голос. Обратите внимание, что он не будет работать, если элемент имеет два символа. Для CO2 он правильно возвращает 1 для углерода и 2 для кислорода. Но для Co2 он неправильно возвращает 1 для углерода и 1 для кобальта. Я не думаю, что вы можете сделать это с помощью функции без использования формулы массива. –

1

Несмотря на то, что у этого есть превосходное (и принятое) решение VBA, я не мог устоять перед проблемой сделать это, не используя VBA.

Я опубликовал решение ранее, которое не будет работать во всех случаях.Этот новый код должен всегда работать:

=MAX(
    IFERROR(IF(FIND(C$1&ROW($1:$99),$B2),ROW($1:$99),0),0), 
    IFERROR(IF(FIND(C$1&CHAR(ROW($65:$90)),$B2&"Z"),1,0),0) 
) 

Введите как формулу массива: Ctrl + Сдвиг + Введите

Выход:

enter image description here

Эта формула выходы 0, если не найдены, и я сима ply используется условное форматирование, чтобы превратить нули в серый цвет.

Как это работает

Эта часть формулы ищет элемент, за которым следует число от 1 до 99. Если обнаружено, число атомов возвращается. В противном случае возвращается 0. Результаты сохраняются в массиве:

IFERROR(IF(FIND(C$1&ROW($1:$99),$B2),ROW($1:$99),0),0) 

В случае C13H25NO5, в поисках «C» возвращает этот массив:

{1,0,0,0,0,0,0,0,0,0,0,0,13,0,0,0,...,0} 

1 является первым элементом массива, поскольку С1 совпадение , 13 является элементом тринадцатого массива, и это нас интересует.

Следующая часть формулы ищет элемент, за которым следует заглавная буква, которая указывает на новый элемент. (Буквы от A до Z обозначают символы от 65 до 90.) Если найдено, возвращается номер 1. В противном случае возвращается 0. Результаты сохраняются в массиве:

IFERROR(IF(FIND(C$1&CHAR(ROW($65:$90)),$B2&"Z"),1,0),0) 

«Z» добавляется к химической формуле, так что матч будет найден, когда его последний элемент не имеет номера. (Например, «H2O».) В Периодической таблице нет элемента «Z», поэтому это не вызовет проблемы.

В случае C13H25NO5, в поисках «N» возвращает этот массив:

{0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0} 

1 является 15-элемент в массиве. Это потому, что он нашел буквы «НЕТ», а О - 15-ю букву алфавита.

Принимая максимальное значение из каждой матрицы, мы получаем количество атомов по желанию.

Смежные вопросы