Если вам интересно, другой подход заключается в том, чтобы сначала настроить динамический именованный диапазон в workbook_a, который охватывает область, в которой вы разрешаете пользователям вводить данные. Затем используйте этот динамический именованный диапазон в качестве источника для сводной таблицы в workbook_b.
Любые изменения, которые вы вносите в свои данные в workbook_a, включая новых клиентов, обнаруживаются при обновлении сводной таблицы в workbook_b.
Обратите внимание, что обе рабочие книги должны быть открыты.
В частности, когда я поиграл с этим, я назвал свой динамический диапазон в workbook_a как "AllCustomerData", с данными, начинающимися в ячейке A1 на sheet1, и определил формулу для "AllCustomerData" как
=OFFSET(Sheet1!$A$1,0,0,COUNTA(Sheet1!$A:$A),COUNTA(Sheet1!$1:$1))
Далее, для источника сводной таблицы в workbook_b я использовал
workbook_a.xlsx!AllCustomerData
Затем, когда я построил сводную таблицу, я выбрал "Классический макет сводной таблицы". Я разместил все свои поля в разделе "RowLabels" в поле "Список полей" сводной таблицы в порядке своих полей в оригинальной рабочей книге_a. Вы можете, конечно, заказать их по своему желанию или выбрать только те поля, которые вам нужны.
Когда я проверил это, я увидел, что если я удаляю клиента, обновляю сводную таблицу, затем повторно использую CUSTID этого клиента в нижней части исходного диапазона и снова обновляю сводную таблицу, то повторно использованный CUSTID будет отображаются в сводной таблице не внизу, а в исходном положении перед удалением. (Надеюсь, это было ясно!) Я не знаю, разрешают ли ваши бизнес-правила повторное использование CUSTID, но помните об этом, если вы это сделаете.
Надеюсь это поможет. Подход VBA @Lance Roberts тоже очень хорош. Преимущество этого подхода в сводной таблице заключается в том, что он не несет все эти "накладные расходы сводной таблицы".