Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Дублирование столбцов - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: _Boroda_, китин  
Дублирование столбцов
oxidia Дата: Четверг, 22.02.2024, 13:55 | Сообщение № 1
Группа: Пользователи
Ранг: Новичок
Сообщений: 16
Репутация: 0 ±
Замечаний: 0% ±

2021
Добрый день.

Подскажите пожалуйста.
На одном листе создал в столбце список персонала.
На другом листе продублировал столбец формулой данный список персонала и добавил к нему еще столбцы графиков отпусков.
При удалении сотрудника из основного списка - в дубле удаляется также сотрудник (удаляется ячейка со сдвигом вверх), а остальные столбы остаются на своем месте, чем нарушают весь график отпусков.
Что сделать для того, чтобы при удалении сотрудника - в дублирующем списке удалялась вся строка, а не только ячейка со сдвигом вверх.
Заранее большое спасибо за ответы.
 
Ответить
СообщениеДобрый день.

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

Автор - oxidia
Дата добавления - 22.02.2024 в 13:55
Gustav Дата: Пятница, 23.02.2024, 05:05 | Сообщение № 2
Группа: Админы
Ранг: Участник клуба
Сообщений: 2808
Репутация: 1184 ±
Замечаний: ±

начинал с Excel 4.0, видел 2.1
Удалите сначала всю строку в дублирующем списке, а затем всю строку в основном.


МОИ: Ник, Tip box: 41001663842605
 
Ответить
СообщениеУдалите сначала всю строку в дублирующем списке, а затем всю строку в основном.

Автор - Gustav
Дата добавления - 23.02.2024 в 05:05
oxidia Дата: Пятница, 23.02.2024, 12:03 | Сообщение № 3
Группа: Пользователи
Ранг: Новичок
Сообщений: 16
Репутация: 0 ±
Замечаний: 0% ±

2021
Удалите сначала всю строку в дублирующем списке, а затем всю строку в основном.


Большое спасибо. Но это ручная работа. Тогда смысл привязывать столбцы нет. В любом случае как вариант...
 
Ответить
Сообщение
Удалите сначала всю строку в дублирующем списке, а затем всю строку в основном.


Большое спасибо. Но это ручная работа. Тогда смысл привязывать столбцы нет. В любом случае как вариант...

Автор - oxidia
Дата добавления - 23.02.2024 в 12:03
Gustav Дата: Пятница, 23.02.2024, 19:58 | Сообщение № 4
Группа: Админы
Ранг: Участник клуба
Сообщений: 2808
Репутация: 1184 ±
Замечаний: ±

начинал с Excel 4.0, видел 2.1
Но это ручная работа

Это общее описание алгоритма, основанного на принципах каскадного удаления записей в больших взрослых БД, согласно которым сначала удаляются записи из подчиненной таблицы, а затем из главной. При этом подразумевается транзакционность всего процесса, согласно которой либо выполнятся все (обе) операции, либо не выполнится ни одна. Выполнение только одной из них и невыполнение другой переводит систему в неконсистентное (несогласованное) состояние, с нарушением целостности данных, что есть нехорошо.

А как последовательно выполнить эти две операции - это уже дело второе. Можно вручную, а можно несложным скриптом:
[vba]
Код
// предполагаем, что на обоих листах списки находятся в колонке A
// перед запуском скрипта встаем на первом листе в ячейку колонки A, которую хотим удалить из списка

function deleteElementFromList() {
  var ss = SpreadsheetApp.getActive();

  var rng = ss.getActiveRange();  // ячейка, которую будем удалять из списка
  var val = rng.getValue();       // ее значение (для поиска на втором листе)
  SpreadsheetApp.flush();

  var sheet2 = ss.getSheetByName('Лист2');  
  var values = sheet2.getRange('A:A').getValues().map((v) => { return v[0] });
  SpreadsheetApp.flush();  

  var pos = values.indexOf(val) + 1;
  if (pos) sheet2.deleteRow(pos);  // удаляем всю строку на втором листе

  rng.deleteCells(SpreadsheetApp.Dimension.ROWS); // удаляем элемент списка на первом листе
  // "транзакция" закончена
}
[/vba]


МОИ: Ник, Tip box: 41001663842605
 
Ответить
Сообщение
Но это ручная работа

Это общее описание алгоритма, основанного на принципах каскадного удаления записей в больших взрослых БД, согласно которым сначала удаляются записи из подчиненной таблицы, а затем из главной. При этом подразумевается транзакционность всего процесса, согласно которой либо выполнятся все (обе) операции, либо не выполнится ни одна. Выполнение только одной из них и невыполнение другой переводит систему в неконсистентное (несогласованное) состояние, с нарушением целостности данных, что есть нехорошо.

А как последовательно выполнить эти две операции - это уже дело второе. Можно вручную, а можно несложным скриптом:
[vba]
Код
// предполагаем, что на обоих листах списки находятся в колонке A
// перед запуском скрипта встаем на первом листе в ячейку колонки A, которую хотим удалить из списка

function deleteElementFromList() {
  var ss = SpreadsheetApp.getActive();

  var rng = ss.getActiveRange();  // ячейка, которую будем удалять из списка
  var val = rng.getValue();       // ее значение (для поиска на втором листе)
  SpreadsheetApp.flush();

  var sheet2 = ss.getSheetByName('Лист2');  
  var values = sheet2.getRange('A:A').getValues().map((v) => { return v[0] });
  SpreadsheetApp.flush();  

  var pos = values.indexOf(val) + 1;
  if (pos) sheet2.deleteRow(pos);  // удаляем всю строку на втором листе

  rng.deleteCells(SpreadsheetApp.Dimension.ROWS); // удаляем элемент списка на первом листе
  // "транзакция" закончена
}
[/vba]

Автор - Gustav
Дата добавления - 23.02.2024 в 19:58
  • Страница 1 из 1
  • 1
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2024 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!