Я активно работаю в области аналитической химии для моей стажировки и буду sh сравнивать большие наборы данных (две колонки до 15 000 строк). Основная идея этого заключается в том, что у меня есть два столбца с массовыми данными (с 4 десятичными знаками), в которых макрос должен искать каждую массу в первом столбце второго столбца, но с дефектом / ошибкой массы. Это означает, что значение не полностью соответствует (из-за инструментальных ошибок в измерениях), но должно находиться в пределах нижнего предела и верхнего предела. Когда макрос циклически перебирает набор данных2 для проверки каждого значения, проверенная ячейка набора данных1 смещается к следующему (.Offset (1,0)), чтобы повторить поиск этого указанного c значения. Верхний и нижний пределы настраиваются автоматически.
В качестве примера (используется формат кода, в противном случае таблица будет отображаться некорректно):
Value to check from dataset1 is 101.1048, mass error is 5 ppm (parts-per-million, 0.000005%),
so the lower limit is 101.1043 and the upper limit is 101.1053. So in the example shown below,
the mass in dataset2 falls within the boundaries, after which the macro should sum the intensity
(linked to the mass column) of all mass values from dataset2 that fall within the dataset1 limits
for the checked cell. So SumIntensity=105+209 in the example, if no corresponding value is found,
the intensity of the dataset1 is used (so 100).
**Dataset1** " **Dataset2**
Mass ' Intensity " Mass ' Intensity
''''''''''''''''''''''''''''''''''''''''''''''''''''
101.1048 ' 100 " 101.1045 ' 105
101.1272 ' 300 " 101.1051 ' 209
Однако я не очень хорошо разбираюсь в VBA ( Я написал только несколько макросов basi c для сравнения значений в одном и том же наборе данных с массовым дефектом / ошибкой), и после бесчисленных попыток я пока не смог заставить работать макрос. Мой текущий код выглядит следующим образом, но продолжает падать (скорее всего из-за циклов):
Sub CompareColumnsTest2()
Dim wscalc, wsdata, wscontrol As Worksheet
Set wscalc = Sheet2
Set wsdata = Sheet1
Set wscontrol = Sheet4
''-----------------------------------------------------------
''Compares datasets 1 and 2 in two steps:
''Looks up each Rounded Mass from dataset1 in dataset2 and substracting the relative intensity respectively
''Looks up each Rounded Mass from dataset 2 in dataset1 and if NOT present in dataset 1, copies Rounded Mass and (negative) Intensity
wscalc.Range("B3:B" & wscalc.Range("B" & Rows.Count).End(xlUp).Row).Copy
wscalc.Range("K3").PasteSpecial (xlPasteValues)
''Step one
Dim refcl, refint, massdefect, lowerlimit, upperlimit As Range
Set refcl = wscalc.Range("B3")
Set refint = wscalc.Range("D3")
Set pastecell = wscalc.Range("L3")
Set massdefect = wscontrol.Range("D4")
Set lowerlimit = wscalc.Range("Z2")
Set upperlimit = wscalc.Range("Z4")
Set checkcl = wscalc.Range("G3")
Set checkint = wscalc.Range("I3")
Dim refclnext, refintnext, checkclnext, pastecellnext As Range, sumint As Long
Do While Not IsEmpty(refcl)
Set refclnext = refcl.Offset(1, 0)
Set refintnext = refint.Offset(1, 0)
Set pastecellnext = pastecell.Offset(1, 0)
Set checkclnext = checkcl.Offset(1, 0)
Set checkintnext = checkint.Offset(1, 0)
sumint = 0
lowerlimit.Value = refcl / (1 + (massdefect / 1000000))
upperlimit.Value = refcl * (1 + (massdefect / 1000000))
Do While Not IsEmpty(checkcl)
If checkcl <= upperlimit And checkcl >= lowerlimit Then
sumint = sumint + checkint
End If
Set checkcl = checkclnext
Set checkint = checkintnext
Loop
Set pastecell.Value = refint - sumint
Set refcl = refclnext
Set refint = refintnext
Set pastecell = pastecellnext
Loop
End Sub
Я надеюсь, что мое описание достаточно ясно, чтобы помочь мне. Я не прошу вас полностью переписать мой код, поскольку это, конечно, займет много времени, но любые советы / модификации будут высоко оценены.
Best, JamesLooks
Редактировать 1: Здесь На некоторых снимках экрана показаны некоторые данные и порядок организации листа для ссылок на ячейки.
Обзор данных и макет листа,
Ячейки, используемые для верхнего и нижнего яруса предел