Разделите значение на две разные переменные

Я думал, что у меня проблема, но теперь у меня другая проблема... VBA так тяжело.

For i = 2 To LastRow
 For j = 2 To LastCol
 '
 '*There is lots of code here....*
 '
 salk = Sheets("SheetS").Cells(i, j).Value
 presence = WorksheetFunction.CountIf(Range("B1:D19"), salk)


 Dim arrOutput(2)

 Select Case presence
 Case 1
 Sheets("SheetX").Cells(i, j).Value = salk & " (" & GroupCol(salk) & ")"
 Case 2
 arrOutput(0) = Int(GroupCol(salk) / presence)
 arrOutput(1) = GroupCol(salk) - arrOutput(0)
 arrOutput(2) = 0

 Sheets("SheetX").Cells(i, j).Value = salk & " (" & arrOutput(0) & " - " & arrOutput(1) & ")"
 Case Else
 MsgBox "Error"
 End Select
 Next j
Next i

С приведенным выше кодом мне удалось получить этот результат:

Я очень доволен кодом, который разбивает нечетное число на два разных числа. Поэтому мне не нужно сокращать людей на половину. Когда группа имеет четное число в качестве результата, ее можно разделить на два одинаковых числа. Когда его нечетное число, это становится очень сложным. Дэйв помог мне исправить нечетное число. Я внедрил код Dave в свой код. Вы видите, что в скобках указано общее количество лиц в группе, принадлежащей команде. Вы видите, что у 4a4 всего 39. Поскольку эта группа появляется дважды, я хочу разбить эту группу на две части. Когда я это делаю, я получаю 18,5, код Dave (выше реализованный) дает мне возможность получить следующие два числа: 19 и 20. Мой вопрос состоит в том, чтобы получить эти два отдельных номера по двум группам, группа с именем команды C получает 19 (см. B2 на картинке), а другая цифра 20 переходит на B6. Когда это будет настроено, я получаю следующее изображение:

Поскольку случай выбора находится в цикле, я не могу зарезервировать их в отдельной переменной: (... Есть ли способ получить то, что я хочу.

1 ответ

У меня есть потенциальное решение (взял меня на некоторое время, и качество algo не так уж и хорошо)

Вместо того, чтобы делать:

Sheets("SheetX").Cells(i, j).Value = salk & " (" & arrOutput(0) & " - " & arrOutput(1) & ")"

в Case 2 вы можете попробовать (вам придется адаптировать мой код, я попробовал его на индивидуальном примере):

' ====== ALGO START
' The following calculate the number of times salk appears before the current cell 
Select Case i ' Depends on the ROWS since you CAN'T use a range which is not continuous with COUNTIF!
 Case 1
 presenceCurr = WorksheetFunction.CountIf(Range("B1" & ":" & Cells(i, j).Address), salk)
 Case 2
 presenceCurr = WorksheetFunction.CountIf(Range("B2" & ":" & Cells(i, j).Address), salk) _
 + WorksheetFunction.CountIf(Range("B1:D1"), salk)
 Case 3
 presenceCurr = WorksheetFunction.CountIf(Range("B3" & ":" & Cells(i, j).Address), salk) _
 + WorksheetFunction.CountIf(Range("B1:D2"), salk)
 Case 5
 ' etc ...

 ' All the other Cases

 Case 19
 presenceCurr = WorksheetFunction.CountIf(Range("B19" & ":" & Cells(i, j).Address), salk) _
 + WorksheetFunction.CountIf(Range("B1:D18"), salk)
 Case Else ' Should not happen
 MsgBox "Error, out of range"
End Select
presenceCurr = presenceCurr - 1 ' Minus 1 because the current cell would be counted
' ===== ALGO END

Sheets("SheetX").Cells(i, j).Value = salk & " (" & arrOutput(presenceCurr) & ")"

Я не совсем уверен, что это сработает, потому что я полагаю, что "B1:D19" связан (с точки зрения диапазона) с вашим вложенным циклом.

Как уже было сказано, вам, вероятно, придется адаптировать этот код. Важна идея: я нахожу, сколько раз salk было найдено до текущей ячейки и (в вашем примере будет 0 или 1) и сопоставьте это с позицией в вашем массиве (:

Select Case мог быть действительно короче, я зациклился на столбцах, а затем на строках, но...

ПРИМЕЧАНИЕ. Это быстрый и грязный код, я могу быть четко оптимизирован и факторизуем (например, используя цикл for вместо select case)

В любом случае, я надеюсь, что это поможет, и вы можете использовать его, чтобы делать то, что вы хотите

licensed under cc by-sa 3.0 with attribution.