Копирование таблицы на разные листы с использованием диапазонов функций и текста - PullRequest
0 голосов
/ 16 ноября 2018

У меня уже есть таблица, подготовленная на одном листе документа Excel, которая не может быть изменена, выглядит следующим образом

name | info | info2 | info3 | ammount
-----|------|-------|-------|--------
name | info | info2 | info3 |    0
name1| info | info2 | info3 |    0

и содержит полный список элементов с значениями по умолчанию, равными 0.

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

name | info | info2 | info3 | amount
-----|------|-------|-------|---------------------
name | info | info2 | info3 | different value now
name1| info | info2 | info3 |    0

Я попытался использовать макро-рекордер, чтобы найти вручнуюкакие шаги потребовались, и я попытался написать код, но обнаружил некоторые проблемы:

  • Мне не хватало надежного способа копирования строки таблицы без необходимости копировать всю строку Excel, поэтому я использовалвместо диапазона
  • У меня нет способа сохранить переменные диапазоны ячеек, чтобы составить диапазон с индикатором строки, который будет меняться в зависимости отфункция соответствия и буквы столбцов, которые всегда будут оставаться неизменными, поскольку необходима вся строка.

Я уверен, что есть более разумный способ сделать это, в настоящее время я использую функцию соответствия, чтобы найтииз номера строки, в которой имя, введенное в table2, находится в table1

Так что в коротком примере там будет возвращено 1.

В этот момент я хотел бы иметь возможность использовать это "1 ", чтобы составить диапазон: в этом случае" A2: E2 "и скопируйте диапазон во вторую таблицу, чтобы имя перекрывало имя, используемое для поиска.

Это даст мне копию толькостроки, содержащие имена, которые пользователь вводит в таблице 2.

Теперь пользователь изменит сумму в таблице 2, а затем вернет строку в таблицу 1, используя тот же процесс, который использовался для ее перевода в таблицу 2, но в обратном порядке: знание таблицы 2номер строки и диапазон столбца составляют диапазон для копирования и определяют, какую строку перезаписать с помощью функции сопоставления.

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

Я уверен, что должен быть более простой и умный способ сделать это, но мой опыт работы с VBA очень поверхностен, любое предложение будет оценено.

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

На заключительном замечании: меня попросили записать все внесенные пользователем изменения (поэтому возвращающие значения из таблицы2) с отметкой времени, если это возможно, во внешний файл для безопасности резервного копирования, я не знаю, возможно ли это, икак бы это было решено.

Мне удалось решить одну из проблем, с которыми я столкнулся, используя этот код:

=INDIRECT(CONCATENATE("'sheet1'!B";(CONFRONT(A2;Table1[Column1];0)+1));TRUE)

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

1 Ответ

0 голосов
/ 19 ноября 2018

Поскольку никто не ответил, и я нашел работающее решение (насколько оно может быть неопределенным), я собираюсь поделиться им в надежде, что, если кому-то понадобится что-то подобное, это окажется полезным.

IЯ уже обновил свой вопрос кодом, который использовал для заполнения таблицы2, в зависимости от поиска в столбце «имя», чтобы в нем были только строки, которые будут интересны пользователю для изменения количества в более позднее время.

Это макрос, который я использовал в кнопке, чтобы обновить значение непосредственно в таблице 1 (чтобы оно также отражало изменение в таблице 2).

Sub button2_Click()
    Dim cb As Shape
    Dim x As String
    x = Range("J2").Value

    Set cb = ActiveSheet.Shapes("chkbx2")

    If cb.OLEFormat.Object.Value = 1 Then
        Range(Range("M2")).Value = Range("E2").Value - Range("J2").Value
        MsgBox "Subtracted " + x + " part(s) to component: " + Range("A2").Value
    Else
        Range(Range("M2")).Value = Range("E2").Value + Range("J2").Value
        MsgBox "Added " + x + " part(s) to component: " + Range("A2").Value
    End If
End Sub
  • "E2" содержит адресячейка, содержащая последнее значение, показанное в таблице 2 (которая связана с таблицей 1)
  • «J2» содержит число, которое я хочу изменить на величину «M2», содержит следующую формулу:
    = CONCATENATE ("'sheet1'! B"; (CONFRONT (A2; Table1 [Column1]; 0) +1)), который выдает адрес оригинального поля в Таблице 1 относительно количества

  • chkbx2 это флажок, который позволяетs переход от сложения к вычитанию

  • MsgBox - это простое всплывающее текстовое поле, которое сообщает вам, какая операция была выполнена с каким именем столбца, чтобы вы знали, что произошло с числами
  • "A2"содержит имя элемента

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...