1

У меня есть следующие две колонки Excel. У них есть родительские дочерние отношения. например, если значение D ячейки строки 1 равно 1000000000, то оно может быть родительским для другой строки.

То, что я пытаюсь сделать, это иметь лист Excel с 1000 строк. Структура идентификатора, которую я получил, неверна. Я пытаюсь начать новый идентификатор с 1 и увеличить до 10, чтобы следующий идентификатор был 10. Таким образом, с этим шаблоном я хочу заменить существующие новые ID, начиная с 1, а затем также обновить столбец New ParentID с обновленным NewID.

Я пытался написать формулу для достижения этой цели, но я очень новичок, чтобы преуспеть. Должно ли это быть сделано с помощью макроса? Какие-либо предложения?

Пример текущих данных

 D           E
New ID      New Parent ID
1000000000  0
1100000000  1000000000
1100000001  1100000000
1100000002  1100000000
1100000003  1100000000
1100000004  1100000000
1100000005  1100000000
1100000006  1100000000
1100000007  1100000000
1200000000  1000000000
1200000001  1200000000
1200000002  1200000000
1200000003  1200000000
1200000004  1200000000
1200000005  1200000000
1200000006  1200000000
1200000007  1200000000
1200000008  1200000000
1200000009  1200000000
1200000010  1200000000
1200000011  1200000000
1200000012  1200000000
2000000000  0
2000000001  2000000000
2000000002  2000000000
3000000000  0
3100000000  3000000000
3100000001  3100000000
3100000002  3100000000
3100000003  3100000000
3100000004  3100000000

Новый пример данных Обратите внимание на новый шаблон. Таким образом, новый идентификатор 1000000000 был заменен на 1, а там, где 1000000000 использовался в столбце NewParentID, он также был заменен на 1. И так далее.. Так что, по сути, я мог бы легко создавать добавочные значения в NewID, я просто не могу обновить второй столбец с правильным идентификатором.

   New ID   New Parent ID
    1             0
    10            1
    1100000001    10
    1100000002    10
    1100000003    10
    1100000004    10
    1100000005    10
    1100000006    10
    1100000007    10

2 ответа2

2

Для нового пользователя Excel я бы держался подальше от VBA без необходимости. Если я правильно понимаю ваш вопрос, вы можете решить его только по формулам. Я старался сделать их максимально простыми.

Во-первых, я бы сохранил исходный набор данных, работая над изображением исходных данных. Это полезно для целей аудита и может помочь вам лучше понять, как это работает. Столбцы будут выглядеть так:

ID         | Parent ID  | New ID     | New Parent ID
----------------------------------------------------
1000000000 | 0          |            |
1100000000 | 1000000000 |            |
1100000001 | 1100000000 |            |
1200000000 | 1000000000 |            |
1200000001 | 1200000000 |            |
1200000002 | 1200000000 |            |

(Для всех примеров я буду использовать один и тот же урезанный набор данных примера. Первый столбец - это столбец A, заголовки столбцов находятся в строке 1.)

Мы дадим новый идентификатор дочернему элементу в столбце Новый идентификатор, а его родительский идентификатор будет автоматически оценен в столбце Новый родительский идентификатор.

Типизированные идентификаторы

Сейчас просто скопируйте и вставьте значения ID в столбец New ID:

ID         | Parent ID  | New ID     | New Parent ID
1000000000 | 0          | 1000000000 |
1100000000 | 1000000000 | 1100000000 |
1100000001 | 1100000000 | 1100000001 |
1200000000 | 1000000000 | 1200000000 |
1200000001 | 1200000000 | 1200000001 |
1200000002 | 1200000000 | 1200000002 |

Затем в первой ячейке идентификатора New Parent введите следующую формулу: =VLOOKUP($B2,$A:$C,3,FALSE) . Эта формула заставляет Excel смотреть вертикально. Он выглядит следующим образом: «найдите значение ячейки B2 (идентификатор родителя) в столбце A (столбец идентификатора) и, когда найдете точное совпадение, верните значение в третьем столбце (столбец C, новые идентификаторы)».

Учитывая расположение наших данных, это на самом деле означает «поиск идентификатора родителя в столбце идентификатора, а когда вы найдете точное совпадение, верните его новый идентификатор». Прямо сейчас новые идентификаторы идентичны исходным идентификаторам, об этом мы позаботимся позже. Если вам нужно больше объяснений по поводу использования функций (например, VLOOKUP) в формулах, нажмите кнопку « fx рядом с панелью формул, а затем ссылку "дополнительная справка по этой функции".

Как только вы введете Enter, формула будет заменена ее результатом и в этом случае значением ошибки #N/A Это потому, что первый родительский идентификатор не может быть найден в столбце идентификатора. Это логично, поскольку у самого верхнего родителя по определению нет родителя.

Чтобы справиться с этим случаем, мы обновим нашу формулу до =IF($B2=0,0,VLOOKUP($B2,$A:$C,3,FALSE)) . Он читает «если значение в ячейке B2 равно 0, то возвращает 0, в противном случае ищите [...]» или «если идентификатор родителя равен 0, тогда возвращайте 0, в противном случае ищите его новый идентификатор».

Пришло время применить эту формулу ко всему столбцу, что вы можете сделать с помощью простого копирования и вставки:

ID         | Parent ID  | New ID     | New Parent ID
1000000000 | 0          | 1000000000 | 0
1100000000 | 1000000000 | 1100000000 | 1000000000
1100000001 | 1100000000 | 1100000001 | 1100000000
1200000000 | 1000000000 | 1200000000 | 1000000000
1200000001 | 1200000000 | 1200000001 | 1200000000
1200000002 | 1200000000 | 1200000002 | 1200000000

Вот где происходит волшебство

Теперь переписать новый идентификатор. Как в вашем примере, замените 1000000000 на 1 . Вы увидите, что новый идентификатор родителя обновится сразу с новым идентификатором. Сыграйте снова и замените 1100000000 на 10:

ID         | Parent ID  | New ID     | New Parent ID
1000000000 | 0          | 1          | 0
1100000000 | 1000000000 | 10         | 1
1100000001 | 1100000000 | 1100000001 | 10
1200000000 | 1000000000 | 1200000000 | 1
1200000001 | 1200000000 | 1200000001 | 1200000000
1200000002 | 1200000000 | 1200000002 | 1200000000

Это было весело! Но делать это тысячу раз, нет, спасибо, верно?

Авто-идентификаторы

Вот где Excel сияет, потому что, как только вы задумаетесь, он сделает всю тяжелую работу. В ячейке C4 введите следующую формулу: =C3+10 . Эта единица добавляет десять к значению в ячейке C3, ячейке чуть выше, эффективно увеличивая новый идентификатор на десять. Скопируйте и вставьте его до конца столбца, и все готово:

ID         | Parent ID  | New ID     | New Parent ID
1000000000  0             1            0
1100000000  1000000000  | 10         | 1
1100000001  1100000000  | 20         | 10
1200000000  1000000000  | 30         | 1
1200000001  1200000000  | 40         | 30
1200000002  1200000000  | 50         | 30

Копирование-вставка формул

Последнее слово предостережения. Я предполагаю, что вы будете использовать новые идентификаторы и новые родительские идентификаторы, возможно, в других книгах. В этом случае вы, вероятно, захотите сделать специальную вставку, чтобы сохранить только значение, а не формулу.

Допустим, что когда вы закончите, вы хотите удалить столбцы исходного идентификатора и родительского идентификатора. Перед этим скопируйте столбцы «Новый идентификатор» и «Новый родительский идентификатор», как обычно. Затем вместо вставки используйте special paste команду вставки и выберите «Значения», затем нажмите «ОК». special paste команда вставки доступна правой кнопкой мыши на месте назначения, среди других мест.

0

Вы можете сделать это с помощью макроса, и все, что вам нужно, это создать большой массив повторяющихся данных. Я лично избегаю макросов и делаю большую часть своего генерации текста в Powershell.

Теперь, если вы хотите взять данные и сделать некоторые вычисления на них, мы можем сделать это с помощью формул. Вот те, которые, я думаю, вам нужны:

  • = IF(условие, истинное значение, ложное значение) - логические тесты для принятия решений.
  • = MOD(ячейка данных, делитель) - возвращает остаток после деления.
  • = MROUND(ячейка данных, несколько) - округляет до ближайшего определенного кратного числа.

Когда мы работаем с формулами, нам нужно изложить нашу логику того, какие действия мы хотим предпринять в порядке. Все формулы носят процедурный характер, поэтому это помогает понять, что нам нужно сделать в первую очередь. Я предполагаю, что все входные данные находятся в столбце "Новый идентификатор", а все выходы (иначе возвращаемые данные) находятся в столбце "Родительский идентификатор". Глядя на ваш пример данных, вот то, что я думаю, вы хотите.

  1. Найдите идентификаторы, которые являются факторами "1000000000" (10 ^ 9) и верните 0.
  2. Найдите идентификаторы с коэффициентами "100000000" (10 ^ 8) и округлите до целого числа с коэффициентом "1000000000" (10 ^ 9).
  3. Округлить оставшиеся идентификаторы до целого числа с коэффициентом "100000000" (10 ^ 8)

Есть большие цифры, которые нужно выяснить, поэтому вот пример того, что делает каждый шаг.

  • Шаг 1: 700000000 возвращает 0
  • Шаг 2: 770000000 возвращает 700000000
  • Шаг 3: 770000007 возвращает 770000000

Если это правильно, давайте настроим ваши функции:

Шаг 1

Первое уравнение, которое мы используем, это уравнение "MOD". Если мы разделим каждое число на "1000000000" (10 ^ 9), мы сможем найти любое число с остатком от нуля. Каждый, кого мы находим, это тот, который хочет вернуть ноль с. Для этого нам нужно использовать формулу "ЕСЛИ". Вот как будет выглядеть ваша формула в ячейке E2:

=IF(MOD(D2,1000000000)=0,0,"false")

Этот первый параметр IF проверяет, имеет ли число в D2 остаток от деления на 10 ^ 9. Если это не так, вернуть ноль, если не вернуть текст "ложь"

Шаг 2

Теперь, когда мы обработали нашу первую группу чисел, мы можем добавить к соединению оператор IF, чтобы объединить логику. Теперь нам нужно уравнение "ЭТАЖ", чтобы округлить число в число значащих цифр. В этом случае восемь цифр. Вот как будет выглядеть формула в одиночку:

=IF(MOD(D2,10000000)=0,MROUND(D2,1000000000),"false")

Затем нам нужно объединить это в формулу на шаге 1. Замените "ложь" на шаге 1 формулой на шаге 2.

Шаг 3

Наконец, нам просто нужно округлить оставшиеся числа. Мы можем сделать это с другим MROUND. Вот одна формула:

=MROUND(D2,100000000)

И теперь все это приковано цепью:

=IF(MOD(D2,1000000000)=0,0,IF(MOD(D2,10000000)=0,MROUND(D2,1000000000),MROUND(D2,100000000)))

Попробуйте, и я надеюсь, что это сработает. Когда я запускаю эту формулу для ваших данных в столбце D, я получаю те же числа, что и в столбце E.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .