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

Вход

Регистрация

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

 

= Мир MS Excel/Сложный Автонумератор - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: _Boroda_, китин  
Сложный Автонумератор
egorus Дата: Среда, 07.06.2023, 10:25 | Сообщение № 1
Группа: Пользователи
Ранг: Участник
Сообщений: 51
Репутация: 0 ±
Замечаний: 20% ±

https://docs.google.com/spreads....1150569
На листе Список Спусков оператор вводит дату в столбце Дата спуска
Выбирает из выпадающего списка Заказчик Имя заказчика
Ставит флажок рядом.

Скрипт:
Узнает Номер Заказчика на листе Заказчик по имени выбранного на листе Список Спусков Заказчика.
Значение соответствующего счетчика на листе Заказчик увеличивает на 1. (Изначально все счетчики равны 0).
на листе Список Спусков в выделенной строке с нажатым флажком в колонке Номер Спуска формирует номер:
Номер Заказчика-Счетчик-Дата.

После этого блокирует флажок.

Номера должны быть 3-значными (кроме даты).
001-001-070623


Сообщение отредактировал egorus - Среда, 07.06.2023, 19:40
 
Ответить
Сообщениеhttps://docs.google.com/spreads....1150569
На листе Список Спусков оператор вводит дату в столбце Дата спуска
Выбирает из выпадающего списка Заказчик Имя заказчика
Ставит флажок рядом.

Скрипт:
Узнает Номер Заказчика на листе Заказчик по имени выбранного на листе Список Спусков Заказчика.
Значение соответствующего счетчика на листе Заказчик увеличивает на 1. (Изначально все счетчики равны 0).
на листе Список Спусков в выделенной строке с нажатым флажком в колонке Номер Спуска формирует номер:
Номер Заказчика-Счетчик-Дата.

После этого блокирует флажок.

Номера должны быть 3-значными (кроме даты).
001-001-070623

Автор - egorus
Дата добавления - 07.06.2023 в 10:25
Gustav Дата: Четверг, 08.06.2023, 14:50 | Сообщение № 2
Группа: Админы
Ранг: Участник клуба
Сообщений: 2797
Репутация: 1161 ±
Замечаний: ±

начинал с Excel 4.0, видел 2.1
Предложил свой вариант листа "Заказчик" (см. в своем файле лист "Заказчик (Gustav)"). С нормальными (нетекстовыми) форматами колонок, и с такой саморасширяющейся формулой генерации начала номера монтажа (в ячейке D1):
[vba]
Код
=LET(
заголНЗ;        A1;
столбНЗ;        OFFSET(заголНЗ;1;0;ROWS(INDIRECT("A:A"))-ROW(заголНЗ));
массНЗ;         OFFSET(заголНЗ;1;0;COUNTA(столбНЗ));
массСч;         OFFSET(заголНЗ;1;2;COUNTA(столбНЗ));
массРезультат;  MAP(массНЗ; массСч; LAMBDA(нз; сч; RIGHT(1000+нз;3) & "-" & RIGHT(1000+сч+1;3) & "-"));
{"Начало следующего номера"; массРезультат}
)
[/vba]
Скрипту останется взять начало номера, дописать дату, после чего увеличить на 1 значение в колонке "Счетчик последний использованный" (сейчас, в начале жизненного цикла, там пустые ячейки). Чуть позже займусь самим скриптом.


МОИ: Ник, Tip box: 41001663842605

Сообщение отредактировал Gustav - Четверг, 08.06.2023, 14:54
 
Ответить
СообщениеПредложил свой вариант листа "Заказчик" (см. в своем файле лист "Заказчик (Gustav)"). С нормальными (нетекстовыми) форматами колонок, и с такой саморасширяющейся формулой генерации начала номера монтажа (в ячейке D1):
[vba]
Код
=LET(
заголНЗ;        A1;
столбНЗ;        OFFSET(заголНЗ;1;0;ROWS(INDIRECT("A:A"))-ROW(заголНЗ));
массНЗ;         OFFSET(заголНЗ;1;0;COUNTA(столбНЗ));
массСч;         OFFSET(заголНЗ;1;2;COUNTA(столбНЗ));
массРезультат;  MAP(массНЗ; массСч; LAMBDA(нз; сч; RIGHT(1000+нз;3) & "-" & RIGHT(1000+сч+1;3) & "-"));
{"Начало следующего номера"; массРезультат}
)
[/vba]
Скрипту останется взять начало номера, дописать дату, после чего увеличить на 1 значение в колонке "Счетчик последний использованный" (сейчас, в начале жизненного цикла, там пустые ячейки). Чуть позже займусь самим скриптом.

Автор - Gustav
Дата добавления - 08.06.2023 в 14:50
Gustav Дата: Четверг, 08.06.2023, 21:07 | Сообщение № 3
Группа: Админы
Ранг: Участник клуба
Сообщений: 2797
Репутация: 1161 ±
Замечаний: ±

начинал с Excel 4.0, видел 2.1
Закатил по ссылке такой скриптовый код:
[vba]
Код
function onEdit(e) {

    var range = SpreadsheetApp.getActive().getActiveRange(); // чтобы придать тип Range переменной - для появления списка методов по точке
    range = e.range; // а здесь просто переопределяем
    var sheet = SpreadsheetApp.getActive().getActiveSheet(); // чтобы придать тип Sheet переменной - для появления списка методов по точке
    sheet = range.getSheet(); // а здесь просто переопределяем
  
    switch (sheet.getSheetName()) {
        case 'Список Монтажей':
            if (range.getColumn() == sheet.getRange('E:E').getColumn() &&
                range.getRow() >= 2) {
                // читаем текущую запись  
                var avalCurrRecord = sheet.getRange(range.getRow(),1,1,5).getValues();   
                // определяем поля по отдельности - для удобства дальнейшего програмирования
                var currCustomer = avalCurrRecord[0][0]; // поле Заказчик  
                var currDate     = avalCurrRecord[0][1]; // поле Дата спуска                
                var currNumber   = avalCurrRecord[0][2]; // поле Номер монтажа
                var currCheckbox = avalCurrRecord[0][4]; // поле Установить номер (флажок)
                
                // номер монтажа будет сгенерирован и заполнен по новой, если:
                //   - флажок "Установить номер" устанавливается (если снимается, то ничего не будет), и при этом:
                //   - поле "Номер монтажа" НЕ заполнено (если оно заполнено старым кодом, то очистить вручную)
                //   - поля "Заказчик" и "Дата спуска" заполнены
                if (currCheckbox == true && !currNumber && currDate && currCustomer) {
                    sheet.getRange(range.getRow(),3).setValue(getMountNumber(currCustomer, currDate));
                    SpreadsheetApp.flush();
                } else {
                    Browser.msgBox("Что-то не заполнено или Флажок - снимается или Номер уже существует");    
                }
            }
            break;
    }    
}

function getMountNumber(custName, launchDate) {

// получаем доступ к рабочему листу со справочником
    var ss = SpreadsheetApp.getActive();
    var shtCustomer = ss.getSheetByName('Заказчик (Gustav)');

// читаем данные с него в общий массив  
    var avalCustomer = shtCustomer.getDataRange().getValues();

// и по наимемнованию заказчика находим его позицию в списке (строку)
    var mapCustomer = avalCustomer.map(v => v[1]);
    var idx = mapCustomer.indexOf(custName);
    var counter = avalCustomer[idx][2];

// увеличиваем счетчик на 1 и сохраняем в таблице  
    shtCustomer.getRange(idx+1,3).setValue(Number(counter)+1);
    SpreadsheetApp.flush();

// окончательно формируем номер монтажа для запрошенного заказчика и даты
    return avalCustomer[idx][3]
            + Utilities.formatDate(launchDate, ss.getSpreadsheetTimeZone, "ddMMyy");
}
[/vba]
Пока без каких-либо блокировок. Номер заполняется во время установки флажка, во время снятия - ничего не происходит. Если номер уже заполнен, то новый номер не генерируется (чтобы сгенерировался - нужно сначала очистить вручную). Разумеется, должны быть заполнены поля "Заказчик" и "Дата спуска". Результатом выполнения скрипта является либо заполнение поля "Номер монтажа", либо сообщение о том, что "что-то не так", т.е. какая-то реакция будет всегда.


МОИ: Ник, Tip box: 41001663842605
 
Ответить
СообщениеЗакатил по ссылке такой скриптовый код:
[vba]
Код
function onEdit(e) {

    var range = SpreadsheetApp.getActive().getActiveRange(); // чтобы придать тип Range переменной - для появления списка методов по точке
    range = e.range; // а здесь просто переопределяем
    var sheet = SpreadsheetApp.getActive().getActiveSheet(); // чтобы придать тип Sheet переменной - для появления списка методов по точке
    sheet = range.getSheet(); // а здесь просто переопределяем
  
    switch (sheet.getSheetName()) {
        case 'Список Монтажей':
            if (range.getColumn() == sheet.getRange('E:E').getColumn() &&
                range.getRow() >= 2) {
                // читаем текущую запись  
                var avalCurrRecord = sheet.getRange(range.getRow(),1,1,5).getValues();   
                // определяем поля по отдельности - для удобства дальнейшего програмирования
                var currCustomer = avalCurrRecord[0][0]; // поле Заказчик  
                var currDate     = avalCurrRecord[0][1]; // поле Дата спуска                
                var currNumber   = avalCurrRecord[0][2]; // поле Номер монтажа
                var currCheckbox = avalCurrRecord[0][4]; // поле Установить номер (флажок)
                
                // номер монтажа будет сгенерирован и заполнен по новой, если:
                //   - флажок "Установить номер" устанавливается (если снимается, то ничего не будет), и при этом:
                //   - поле "Номер монтажа" НЕ заполнено (если оно заполнено старым кодом, то очистить вручную)
                //   - поля "Заказчик" и "Дата спуска" заполнены
                if (currCheckbox == true && !currNumber && currDate && currCustomer) {
                    sheet.getRange(range.getRow(),3).setValue(getMountNumber(currCustomer, currDate));
                    SpreadsheetApp.flush();
                } else {
                    Browser.msgBox("Что-то не заполнено или Флажок - снимается или Номер уже существует");    
                }
            }
            break;
    }    
}

function getMountNumber(custName, launchDate) {

// получаем доступ к рабочему листу со справочником
    var ss = SpreadsheetApp.getActive();
    var shtCustomer = ss.getSheetByName('Заказчик (Gustav)');

// читаем данные с него в общий массив  
    var avalCustomer = shtCustomer.getDataRange().getValues();

// и по наимемнованию заказчика находим его позицию в списке (строку)
    var mapCustomer = avalCustomer.map(v => v[1]);
    var idx = mapCustomer.indexOf(custName);
    var counter = avalCustomer[idx][2];

// увеличиваем счетчик на 1 и сохраняем в таблице  
    shtCustomer.getRange(idx+1,3).setValue(Number(counter)+1);
    SpreadsheetApp.flush();

// окончательно формируем номер монтажа для запрошенного заказчика и даты
    return avalCustomer[idx][3]
            + Utilities.formatDate(launchDate, ss.getSpreadsheetTimeZone, "ddMMyy");
}
[/vba]
Пока без каких-либо блокировок. Номер заполняется во время установки флажка, во время снятия - ничего не происходит. Если номер уже заполнен, то новый номер не генерируется (чтобы сгенерировался - нужно сначала очистить вручную). Разумеется, должны быть заполнены поля "Заказчик" и "Дата спуска". Результатом выполнения скрипта является либо заполнение поля "Номер монтажа", либо сообщение о том, что "что-то не так", т.е. какая-то реакция будет всегда.

Автор - Gustav
Дата добавления - 08.06.2023 в 21:07
egorus Дата: Четверг, 08.06.2023, 23:14 | Сообщение № 4
Группа: Пользователи
Ранг: Участник
Сообщений: 51
Репутация: 0 ±
Замечаний: 20% ±

Вы Мастер.
Даже без блокировки работает хорошо


Сообщение отредактировал egorus - Четверг, 08.06.2023, 23:52
 
Ответить
СообщениеВы Мастер.
Даже без блокировки работает хорошо

Автор - egorus
Дата добавления - 08.06.2023 в 23:14
  • Страница 1 из 1
  • 1
Поиск:

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