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

Вход

Регистрация

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

 

= Мир MS Excel/Копирование строки таблицы на другой лист по значению ячейки - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: _Boroda_, китин  
Копирование строки таблицы на другой лист по значению ячейки
Светл Дата: Четверг, 29.06.2017, 12:46 | Сообщение № 1
Группа: Пользователи
Ранг: Прохожий
Сообщений: 7
Репутация: 0 ±
Замечаний: 0% ±

Excel 2010
Здравствуйте!
Проблема следующая: нужно в Гугль-Эксель таблицах прописать код, который:
- Если в 22 столбце в ячейке стоит слово "оформлен", то вся строка копируется на другой лист.
 
Ответить
СообщениеЗдравствуйте!
Проблема следующая: нужно в Гугль-Эксель таблицах прописать код, который:
- Если в 22 столбце в ячейке стоит слово "оформлен", то вся строка копируется на другой лист.

Автор - Светл
Дата добавления - 29.06.2017 в 12:46
Manyasha Дата: Четверг, 29.06.2017, 14:05 | Сообщение № 2
Группа: Модераторы
Ранг: Старожил
Сообщений: 2198
Репутация: 901 ±
Замечаний: 0% ±

Excel 2010, 2016
Светл, Здравствуйте, так попробуйте:
[vba]
Код
function onEdit(e) {
    /*
    sh1 - Активный лист
    sh2  - лист с именени Лист2
    iCol - номер столбца изменяемой ячейки
    iRow - номер строки изменяемой ячейки
    */
    var sh1 = e.source.getActiveSheet(),
        sh2 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Лист2"),
        iCol = e.range.getColumn(),
        iRow = e.range.getRow(),
        lc1, lr2;
    //lc1 - номер последнего столбца на первом листе
    //lr2 - номер последней строки на 2-м листе
    lc1 = sh1.getDataRange().getLastColumn(),
    lr2 = sh2.getDataRange().getLastRow();
    //Если номер активного листа равен 1
    if (SpreadsheetApp.getActiveSheet().getIndex() == 1){
        //Если номер активного столбца равен 22
        if ( iCol == 22 ) {
            //Если значение активной ячейки = оформлен
            if (sh1.getActiveCell().getValue() == "оформлен"){
                //Копируем строку на 2-й лист (contentsOnly:true - копируем только значения)
                sh1.getRange(iRow, 1, 1, lc1).copyTo(sh2.getRange(lr2+1, 1), {contentsOnly:true});
            }
        }
    }
}
[/vba]

Срабатывает на изменение 22-го столбца 1-го листа, копирует на Лист2.


ЯД: 410013299366744 WM: R193491431804

Сообщение отредактировал Manyasha - Четверг, 29.06.2017, 14:39
 
Ответить
СообщениеСветл, Здравствуйте, так попробуйте:
[vba]
Код
function onEdit(e) {
    /*
    sh1 - Активный лист
    sh2  - лист с именени Лист2
    iCol - номер столбца изменяемой ячейки
    iRow - номер строки изменяемой ячейки
    */
    var sh1 = e.source.getActiveSheet(),
        sh2 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Лист2"),
        iCol = e.range.getColumn(),
        iRow = e.range.getRow(),
        lc1, lr2;
    //lc1 - номер последнего столбца на первом листе
    //lr2 - номер последней строки на 2-м листе
    lc1 = sh1.getDataRange().getLastColumn(),
    lr2 = sh2.getDataRange().getLastRow();
    //Если номер активного листа равен 1
    if (SpreadsheetApp.getActiveSheet().getIndex() == 1){
        //Если номер активного столбца равен 22
        if ( iCol == 22 ) {
            //Если значение активной ячейки = оформлен
            if (sh1.getActiveCell().getValue() == "оформлен"){
                //Копируем строку на 2-й лист (contentsOnly:true - копируем только значения)
                sh1.getRange(iRow, 1, 1, lc1).copyTo(sh2.getRange(lr2+1, 1), {contentsOnly:true});
            }
        }
    }
}
[/vba]

Срабатывает на изменение 22-го столбца 1-го листа, копирует на Лист2.

Автор - Manyasha
Дата добавления - 29.06.2017 в 14:05
Светл Дата: Четверг, 29.06.2017, 14:20 | Сообщение № 3
Группа: Пользователи
Ранг: Прохожий
Сообщений: 7
Репутация: 0 ±
Замечаний: 0% ±

Excel 2010
Manyasha, большое спасибо :)
А можно пояснения приписать? Хотелось бы понимать процесс :)
 
Ответить
СообщениеManyasha, большое спасибо :)
А можно пояснения приписать? Хотелось бы понимать процесс :)

Автор - Светл
Дата добавления - 29.06.2017 в 14:20
Manyasha Дата: Четверг, 29.06.2017, 14:42 | Сообщение № 4
Группа: Модераторы
Ранг: Старожил
Сообщений: 2198
Репутация: 901 ±
Замечаний: 0% ±

Excel 2010, 2016
Добавила комменты в предыдущий пост. Здесь они сливаются с текстом скрипта, но в редакторе скриптов гугл-таблиц нормально все видно.)


ЯД: 410013299366744 WM: R193491431804
 
Ответить
СообщениеДобавила комменты в предыдущий пост. Здесь они сливаются с текстом скрипта, но в редакторе скриптов гугл-таблиц нормально все видно.)

Автор - Manyasha
Дата добавления - 29.06.2017 в 14:42
Светл Дата: Четверг, 29.06.2017, 14:51 | Сообщение № 5
Группа: Пользователи
Ранг: Прохожий
Сообщений: 7
Репутация: 0 ±
Замечаний: 0% ±

Excel 2010
Manyasha, спасибо. Но тут немного не то, что нужно. Нужно, чтобы не на изменение активной ячейки срабатывал код, а в общем просматривал 22 столбец и , где в ячейке стоит слово "оформлен", копировал всю строку на другой лист .
 
Ответить
СообщениеManyasha, спасибо. Но тут немного не то, что нужно. Нужно, чтобы не на изменение активной ячейки срабатывал код, а в общем просматривал 22 столбец и , где в ячейке стоит слово "оформлен", копировал всю строку на другой лист .

Автор - Светл
Дата добавления - 29.06.2017 в 14:51
Светл Дата: Четверг, 29.06.2017, 14:55 | Сообщение № 6
Группа: Пользователи
Ранг: Прохожий
Сообщений: 7
Репутация: 0 ±
Замечаний: 0% ±

Excel 2010
И еще вопрос: как этот код активируется? Можно ли активирующую кнопочку?
 
Ответить
СообщениеИ еще вопрос: как этот код активируется? Можно ли активирующую кнопочку?

Автор - Светл
Дата добавления - 29.06.2017 в 14:55
Manyasha Дата: Четверг, 29.06.2017, 16:24 | Сообщение № 7
Группа: Модераторы
Ранг: Старожил
Сообщений: 2198
Репутация: 901 ±
Замечаний: 0% ±

Excel 2010, 2016
Светл, тогда так:
[vba]
Код
//'Создаем вкладку с кнопкой для вызова скрипта
function onOpen() {
    var menuEntries = [];
    menuEntries.push({name: "Скопировать строки", functionName: "copyRows"});
    
    SpreadsheetApp.getActiveSpreadsheet().addMenu("Мои скрипты", menuEntries);
}

function copyRows() {
    /*
    'sh1 - лист с именени Лист1 (с него копируем)
    'sh2 - лист с именени Лист2 (на него копируем)
    */
    var sh1 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Лист1"),
        sh2 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Лист2"),
        lr1, lc1, n;
    //'lr1 - номер последней строки на 1-м листе
    //'lc1 - номер последнего столбца на 1-м листе
    lr1 = sh1.getDataRange().getLastRow();
    lc1 = sh1.getDataRange().getLastColumn();
    //'Очищаем 2-й лист
    sh2.clear();
    //'Номер строки на 2-м листе, куда будем копировать
    n =1;
    //'Идем по всем строкам листа 1
    for (var i = 1; i <= lr1; i++){
        //'Если ячейка в 22-м столбце = оформлен
        if (sh1.getRange(i, 22).getValue() == "оформлен"){
            //'Копируем строку
            sh1.getRange(i, 1, 1, lc1).copyTo(sh2.getRange(n, 1), {contentsOnly:true});
            n++;
        }
    }
}
[/vba]

Можно ли активирующую кнопочку
На ленте вкладка "Мои скрипты" - нажать на "Скопировать строки".


ЯД: 410013299366744 WM: R193491431804
 
Ответить
СообщениеСветл, тогда так:
[vba]
Код
//'Создаем вкладку с кнопкой для вызова скрипта
function onOpen() {
    var menuEntries = [];
    menuEntries.push({name: "Скопировать строки", functionName: "copyRows"});
    
    SpreadsheetApp.getActiveSpreadsheet().addMenu("Мои скрипты", menuEntries);
}

function copyRows() {
    /*
    'sh1 - лист с именени Лист1 (с него копируем)
    'sh2 - лист с именени Лист2 (на него копируем)
    */
    var sh1 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Лист1"),
        sh2 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Лист2"),
        lr1, lc1, n;
    //'lr1 - номер последней строки на 1-м листе
    //'lc1 - номер последнего столбца на 1-м листе
    lr1 = sh1.getDataRange().getLastRow();
    lc1 = sh1.getDataRange().getLastColumn();
    //'Очищаем 2-й лист
    sh2.clear();
    //'Номер строки на 2-м листе, куда будем копировать
    n =1;
    //'Идем по всем строкам листа 1
    for (var i = 1; i <= lr1; i++){
        //'Если ячейка в 22-м столбце = оформлен
        if (sh1.getRange(i, 22).getValue() == "оформлен"){
            //'Копируем строку
            sh1.getRange(i, 1, 1, lc1).copyTo(sh2.getRange(n, 1), {contentsOnly:true});
            n++;
        }
    }
}
[/vba]

Можно ли активирующую кнопочку
На ленте вкладка "Мои скрипты" - нажать на "Скопировать строки".

Автор - Manyasha
Дата добавления - 29.06.2017 в 16:24
Светл Дата: Четверг, 29.06.2017, 19:26 | Сообщение № 8
Группа: Пользователи
Ранг: Прохожий
Сообщений: 7
Репутация: 0 ±
Замечаний: 0% ±

Excel 2010
Manyasha, спасибо большое! Завтра попробую :)
 
Ответить
СообщениеManyasha, спасибо большое! Завтра попробую :)

Автор - Светл
Дата добавления - 29.06.2017 в 19:26
Светл Дата: Пятница, 30.06.2017, 12:16 | Сообщение № 9
Группа: Пользователи
Ранг: Прохожий
Сообщений: 7
Репутация: 0 ±
Замечаний: 0% ±

Excel 2010
Разобралась со вкладкой. :)
Еще вопрос: там в программе стирается весь лист, а нужно чтобы шапка (она находится в первой строке) оставалась нетронутой. Можно это прописать? :)


Сообщение отредактировал Светл - Пятница, 30.06.2017, 13:20
 
Ответить
СообщениеРазобралась со вкладкой. :)
Еще вопрос: там в программе стирается весь лист, а нужно чтобы шапка (она находится в первой строке) оставалась нетронутой. Можно это прописать? :)

Автор - Светл
Дата добавления - 30.06.2017 в 12:16
Светл Дата: Пятница, 30.06.2017, 13:26 | Сообщение № 10
Группа: Пользователи
Ранг: Прохожий
Сообщений: 7
Репутация: 0 ±
Замечаний: 0% ±

Excel 2010
Опробовала код - не работает. Только очищает лист, а строки не копирует.
 
Ответить
СообщениеОпробовала код - не работает. Только очищает лист, а строки не копирует.

Автор - Светл
Дата добавления - 30.06.2017 в 13:26
Gustav Дата: Пятница, 30.06.2017, 18:46 | Сообщение № 11
Группа: Админы
Ранг: Участник клуба
Сообщений: 2797
Репутация: 1161 ±
Замечаний: ±

начинал с Excel 4.0, видел 2.1
Тоже поучаствую парой вариантов. Всегда хватаюсь за возможность попрактиковаться в скриптах Google Docs :)
[vba]
Код
function copyRows2() {

  var sh1 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Лист1"),
      sh2 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Лист2"),
      col = 22; // в какой колонке ищем "оформлен"
      
  //'Очищаем 2-й лист (кроме 1-й строки заголовков)
  sh2.getDataRange().offset(1, 0).clear();
  
  //'Считываем в массив все данные 1-го листа  
  var values = sh1.getDataRange().getValues();
  
  //'Идем по всем строкам листа 1  
  for (var row in values) {
    if (values[row][col-1] == "оформлен") {
      sh2.appendRow(values[row])
    }
  }
}

function copyRows3() {

  var sh1 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Лист1"),
      sh2 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Лист2"),
      col = 22; // в какой колонке ищем "оформлен"
      
  //'Очищаем 2-й лист (кроме 1-й строки заголовков)
  sh2.getDataRange().offset(1, 0).clear();
  
  //'Считываем в массив только данные нужной колонки 1-го листа  
  var values = sh1.getRange(1, col, sh1.getLastRow()).getValues();
  
  //'Идем по всем значениям ячеек выбранной колонки (22-й)  
  for (var row in values) {
    if (values[row][0] == "оформлен") {
      sh2.appendRow(sh1.getRange(Number(row)+1, 1, 1, sh1.getLastColumn()).getValues()[0])
    }
  }
}
[/vba]


МОИ: Ник, Tip box: 41001663842605
 
Ответить
СообщениеТоже поучаствую парой вариантов. Всегда хватаюсь за возможность попрактиковаться в скриптах Google Docs :)
[vba]
Код
function copyRows2() {

  var sh1 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Лист1"),
      sh2 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Лист2"),
      col = 22; // в какой колонке ищем "оформлен"
      
  //'Очищаем 2-й лист (кроме 1-й строки заголовков)
  sh2.getDataRange().offset(1, 0).clear();
  
  //'Считываем в массив все данные 1-го листа  
  var values = sh1.getDataRange().getValues();
  
  //'Идем по всем строкам листа 1  
  for (var row in values) {
    if (values[row][col-1] == "оформлен") {
      sh2.appendRow(values[row])
    }
  }
}

function copyRows3() {

  var sh1 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Лист1"),
      sh2 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Лист2"),
      col = 22; // в какой колонке ищем "оформлен"
      
  //'Очищаем 2-й лист (кроме 1-й строки заголовков)
  sh2.getDataRange().offset(1, 0).clear();
  
  //'Считываем в массив только данные нужной колонки 1-го листа  
  var values = sh1.getRange(1, col, sh1.getLastRow()).getValues();
  
  //'Идем по всем значениям ячеек выбранной колонки (22-й)  
  for (var row in values) {
    if (values[row][0] == "оформлен") {
      sh2.appendRow(sh1.getRange(Number(row)+1, 1, 1, sh1.getLastColumn()).getValues()[0])
    }
  }
}
[/vba]

Автор - Gustav
Дата добавления - 30.06.2017 в 18:46
Gustav Дата: Пятница, 30.06.2017, 20:02 | Сообщение № 12
Группа: Админы
Ранг: Участник клуба
Сообщений: 2797
Репутация: 1161 ±
Замечаний: ±

начинал с Excel 4.0, видел 2.1
Опробовала код - не работает.

Что-то не так делаете, всё работает. Сделал демонстрашку со всеми тремя способами. Попробуйте! Только я настроил не на 22-й столбец, а на 12-й! Чтобы покороче и нагляднее.


МОИ: Ник, Tip box: 41001663842605
 
Ответить
Сообщение
Опробовала код - не работает.

Что-то не так делаете, всё работает. Сделал демонстрашку со всеми тремя способами. Попробуйте! Только я настроил не на 22-й столбец, а на 12-й! Чтобы покороче и нагляднее.

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

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