Как назначить 1 или 2 на основе нескольких критериев (интересная головоломка)

Вы можете использовать функцию JavaScript eval(str) .

Что эта функция делает, это преобразовать строку, предоставленную в JS-код, а затем выполняет ее.

Например:

eval("console.log('hello world')"); // Logs hello world

Итак, чтобы использовать его как переменную переменную, вы можете сделать следующее:

var a = "hello";
var hello = "world";
console.log(a + " " + eval(a)); // Logs hello world

Это даст тот же результат, что и:

console.log(a + " " + hello); // Logs hello world

(Пример из руководства PHP по переменным переменным .)

0
задан GCC 13 July 2018 в 16:08
поделиться

3 ответа

Это легко с макросом.

Начните с назначения 1 каждому элементу. Затем, начиная с самого высокого значения и работая вниз, добавьте 1 к элементам, пока общее количество не достигнет 64.

Sub assign_values()
    Range("C1:C50").Value = 1
    For i = 1 To 50
        If Application.WorksheetFunction.Sum(Range("C:C")) = 64 Then Exit Sub
        Cells(i, "C").Value = Cells(i, "C").Value + 1
    Next i
End Sub

Обратите внимание, что мои данные были отсортированы по высоким и низким, и код использует это.

1
ответ дан Gary's Student 17 August 2018 в 12:26
поделиться
  • 1
    Чтобы убедиться, что я правильно понял это, сделайте столбец, в котором есть 1. Запустите этот макрос, и он добавит +1 к ячейкам, начиная сверху донизу, пока сумма столбца не будет равна 64? – GCC 13 July 2018 в 16:29
  • 2
    @GCC. Макрос I кодирует исходную 1 в каждой ячейке. – Gary's Student 13 July 2018 в 16:30
  • 3
    @GCC вам не нужно создавать другой столбец с кодом 1s, который сделает это для вас на столбце C. – Xabier 13 July 2018 в 16:30
  • 4
    Спасибо за помощь. Это почти сработало так, как мне было нужно. Есть еще пара вещей, которые мне нужны. Если есть значение, равное или меньшее, чем 0, мне нужно, чтобы он назначил ему 0, и все еще имеют значения 1 и 2 равные 64. Также, как мне сохранить цикл для следующих 50 строк данных и так далее? – GCC 13 July 2018 в 16:35
  • 5
    @GCC, как только вы получите ответ на поставленный вопрос, пожалуйста, не изменяйте требования. Попробуйте изменить ответы, которые отвечают вашим потребностям. Если вы не можете, задайте новый вопрос, связанный с этим, показывая, что вы пытались ответить на свой собственный вопрос и где он терпит неудачу. – Scott Craner 13 July 2018 в 16:37

Должны быть 14 "2" и 36 "1" с.

Вы можете перефразировать свою проблему следующим образом:

  1. x - количество строк, назначенных 2
  2. y, - это количество строки, назначенные 1
  3. 2x + y = 64
  4. x + y = 50
  5. Решите для x и y.
3
ответ дан BigBen 17 August 2018 в 12:26
поделиться
  • 1
    Поэтому, основываясь на этой логике, поместите это в Z2, предполагая, что X2 равен 50: IF(Y2>=LARGE($Y$2:$Y$51,14),2,1) – Scott Craner 13 July 2018 в 16:29
  • 2
    Предполагая, что данные в Y не сортируются большими и малыми. Если это тогда =IF(Row(1:1)<=14,2,1) – Scott Craner 13 July 2018 в 16:30
  • 3
    @ScottCraner да, до OP - моя точка зрения была больше того, что «вы можете найти ответ с помощью простой математики». :) – BigBen 13 July 2018 в 16:32
  • 4
    Я понимаю, что я просто основывался на вашем ответе с формулами, которые вернут то, что хочет OP. Я не сомневался в достоверности этого ответа, поскольку он звучит. – Scott Craner 13 July 2018 в 16:34
  • 5
    Мне нравится алгоритмический подход, который вы использовали. – Gary's Student 13 July 2018 в 16:39

Вы имеете в виду, как это?

=1+1*(ROW(C1)<=64-COUNTA($B$1:$B$50))

EDIT: если вы хотите, чтобы длина столбца также была переменной и все равно давала вам 64 на сумму Z, вы можете просто использовать if:

=IF(B1<>"";1+1*(ROW(C1)<=64-COUNTA(B:B));"")

Просто измените точку с запятой для запятых, если ваш Excel должен

0
ответ дан Daniel Souza 17 August 2018 в 12:26
поделиться
  • 1
    Я не понимаю, парень даже не ответил мне, даже если бы я был первым, кто решился с тегом Excel Formula – Daniel Souza 13 July 2018 в 16:45
Другие вопросы по тегам:

Похожие вопросы: