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

Вход

Регистрация

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

 

= Мир MS Excel/Автоматическая подстановка даты изменения ячейки - Мир MS Excel

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

Google Docs
Странно, была тема про это моя, но я не нашел ее... печаль. Создадим похожую, но про другую проблему.

Есть скрипт:

[vba]
Код
function onEdit(e) {

  var sheetToWatch= 'таблица',
        columnToWatch = 7,
        columnToStamp = 8;            

    if (e.range.columnStart !== columnToWatch
    || e.source.getActiveSheet().getName() !== sheetToWatch
    || !e.value)
        return;
    e.source.getActiveSheet()
        .getRange(e.range.rowStart, columnToStamp)
    .setValue(new Date());
[/vba]

Он ставит дату в колонку № 8 при изменении колонки № 7.

ПОнадобилась такая же функция, только в другом листе документа. Я создал новый script file и скопировал туда этот код. поменял номера колонок и все ок. Спустя 10 минут выяснилось, что перестал работать код в первой таблице, а в новом месте - этот же код работает (с другим именем вкладки, само собой). Если скрипт удалить, то первоначальный код на вкладке "таблица" снова заработал.

Как соединить два кода в один (или один за одним), или как то еще, чтобы они работали в 2 разных вкладках одного документа? пробовал просто дублировать код, но нет. также пробовал через запятую перечислять нужные мне вкладки - тоже нет.


Сообщение отредактировал Dimansh - Среда, 24.01.2018, 02:23
 
Ответить
СообщениеСтранно, была тема про это моя, но я не нашел ее... печаль. Создадим похожую, но про другую проблему.

Есть скрипт:

[vba]
Код
function onEdit(e) {

  var sheetToWatch= 'таблица',
        columnToWatch = 7,
        columnToStamp = 8;            

    if (e.range.columnStart !== columnToWatch
    || e.source.getActiveSheet().getName() !== sheetToWatch
    || !e.value)
        return;
    e.source.getActiveSheet()
        .getRange(e.range.rowStart, columnToStamp)
    .setValue(new Date());
[/vba]

Он ставит дату в колонку № 8 при изменении колонки № 7.

ПОнадобилась такая же функция, только в другом листе документа. Я создал новый script file и скопировал туда этот код. поменял номера колонок и все ок. Спустя 10 минут выяснилось, что перестал работать код в первой таблице, а в новом месте - этот же код работает (с другим именем вкладки, само собой). Если скрипт удалить, то первоначальный код на вкладке "таблица" снова заработал.

Как соединить два кода в один (или один за одним), или как то еще, чтобы они работали в 2 разных вкладках одного документа? пробовал просто дублировать код, но нет. также пробовал через запятую перечислять нужные мне вкладки - тоже нет.

Автор - Dimansh
Дата добавления - 24.01.2018 в 02:20
Gustav Дата: Среда, 24.01.2018, 12:13 | Сообщение № 2
Группа: Админы
Ранг: Участник клуба
Сообщений: 2808
Репутация: 1184 ±
Замечаний: ±

начинал с Excel 4.0, видел 2.1
пробовал через запятую перечислять нужные мне вкладки

Примерно именно так и нужно поступить, перечислив названия НУЖНЫХ листов в МАССИВЕ. По аналогии с соседней темой можно создать массив листов, на которых алгоритм должен будет срабатывать (проверяется во втором измененном условии с indexOf):
[vba]
Код
function onEdit(e) {
  
  var sheetsToWatch= ['таблица', 'Лист 3', 'Лист4'],
      columnToWatch = 7,
      columnToStamp = 8;            
  
  if (e.range.columnStart !== columnToWatch
      || sheetsToWatch.indexOf(e.source.getActiveSheet().getName()) == -1
      || !e.value)
  return;
  
  e.source.getActiveSheet()
  .getRange(e.range.rowStart, columnToStamp)
  .setValue(new Date());
}
[/vba]


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

Примерно именно так и нужно поступить, перечислив названия НУЖНЫХ листов в МАССИВЕ. По аналогии с соседней темой можно создать массив листов, на которых алгоритм должен будет срабатывать (проверяется во втором измененном условии с indexOf):
[vba]
Код
function onEdit(e) {
  
  var sheetsToWatch= ['таблица', 'Лист 3', 'Лист4'],
      columnToWatch = 7,
      columnToStamp = 8;            
  
  if (e.range.columnStart !== columnToWatch
      || sheetsToWatch.indexOf(e.source.getActiveSheet().getName()) == -1
      || !e.value)
  return;
  
  e.source.getActiveSheet()
  .getRange(e.range.rowStart, columnToStamp)
  .setValue(new Date());
}
[/vba]

Автор - Gustav
Дата добавления - 24.01.2018 в 12:13
Dimansh Дата: Среда, 24.01.2018, 12:54 | Сообщение № 3
Группа: Пользователи
Ранг: Участник
Сообщений: 53
Репутация: 0 ±
Замечаний: 0% ±

Google Docs
По аналогии

мне не хватило мозгов поставить квадратный скобки.

Тем не менее возник конфликт какой-то.

при установке Вашего кода, дальнейший код, а именно:
[vba]
Код

var sheet = e.range.getSheet();
if (e.range.getColumn() == columnToWatch &&
    e.range.getNumColumns() == 1 &&
    sheet.getName() == sheetToWatch &&
    e.range.getCell(1, 1).getValue() == "E3") {
    e.range.offset(0,
                sheet.getRange("K:AN").getColumn() - columnToWatch,
                e.range.getNumRows(),
                sheet.getRange("K:AN").getNumColumns()
                ).clearContent();
[/vba]

... перестал работать.
_____________________________________

и вопрос по Вашему коду выше: как быть, если диапазон ячеек другой? не 7 и 8 колонки, а какие-либо другие?
 
Ответить
Сообщение
По аналогии

мне не хватило мозгов поставить квадратный скобки.

Тем не менее возник конфликт какой-то.

при установке Вашего кода, дальнейший код, а именно:
[vba]
Код

var sheet = e.range.getSheet();
if (e.range.getColumn() == columnToWatch &&
    e.range.getNumColumns() == 1 &&
    sheet.getName() == sheetToWatch &&
    e.range.getCell(1, 1).getValue() == "E3") {
    e.range.offset(0,
                sheet.getRange("K:AN").getColumn() - columnToWatch,
                e.range.getNumRows(),
                sheet.getRange("K:AN").getNumColumns()
                ).clearContent();
[/vba]

... перестал работать.
_____________________________________

и вопрос по Вашему коду выше: как быть, если диапазон ячеек другой? не 7 и 8 колонки, а какие-либо другие?

Автор - Dimansh
Дата добавления - 24.01.2018 в 12:54
Gustav Дата: Среда, 24.01.2018, 14:02 | Сообщение № 4
Группа: Админы
Ранг: Участник клуба
Сообщений: 2808
Репутация: 1184 ±
Замечаний: ±

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

Если заметили, я изменил имя переменной с единственного числа sheetToWatch на множественное sheetsToWatch (с s на конце sheets). Наверное, отсюда и сложности (я же не видел всего кода).

По ощущениям для исправления ситуации надо всего лишь заменить старое условие:
[vba]
Код
sheet.getName() == sheetToWatch
[/vba]
на новое - "массивное":
[vba]
Код
sheetsToWatch.indexOf(sheet.getName()) > -1
[/vba]
Это новое условие возвращает True, если проверяемое имя листа присутствует в массиве (перечислении) НУЖНЫХ листов.


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

Если заметили, я изменил имя переменной с единственного числа sheetToWatch на множественное sheetsToWatch (с s на конце sheets). Наверное, отсюда и сложности (я же не видел всего кода).

По ощущениям для исправления ситуации надо всего лишь заменить старое условие:
[vba]
Код
sheet.getName() == sheetToWatch
[/vba]
на новое - "массивное":
[vba]
Код
sheetsToWatch.indexOf(sheet.getName()) > -1
[/vba]
Это новое условие возвращает True, если проверяемое имя листа присутствует в массиве (перечислении) НУЖНЫХ листов.

Автор - Gustav
Дата добавления - 24.01.2018 в 14:02
Gustav Дата: Среда, 24.01.2018, 14:11 | Сообщение № 5
Группа: Админы
Ранг: Участник клуба
Сообщений: 2808
Репутация: 1184 ±
Замечаний: ±

начинал с Excel 4.0, видел 2.1
и вопрос по Вашему коду выше: как быть, если диапазон ячеек другой? не 7 и 8 колонки, а какие-либо другие?

Не льстите мне, это - ВАШ код! yes А если серьезно, то вторая колонка - она выглядит зависимой от первой, т.е. columnToStamp = columnToWatch + 1. Ну а вместо одинокой "7" можно так же организовать массив, например, делать такую операцию в [7, 9, 11, 15] колонках. Соответственно, таймштамп будет появляться в 8, 10, 12, 16 колонках. Естественно, это не только пришпандорить квадратные скобки к последовательности цифр. Придётся еще переиначивать код ниже.


МОИ: Ник, Tip box: 41001663842605
 
Ответить
Сообщение
и вопрос по Вашему коду выше: как быть, если диапазон ячеек другой? не 7 и 8 колонки, а какие-либо другие?

Не льстите мне, это - ВАШ код! yes А если серьезно, то вторая колонка - она выглядит зависимой от первой, т.е. columnToStamp = columnToWatch + 1. Ну а вместо одинокой "7" можно так же организовать массив, например, делать такую операцию в [7, 9, 11, 15] колонках. Соответственно, таймштамп будет появляться в 8, 10, 12, 16 колонках. Естественно, это не только пришпандорить квадратные скобки к последовательности цифр. Придётся еще переиначивать код ниже.

Автор - Gustav
Дата добавления - 24.01.2018 в 14:11
Dimansh Дата: Среда, 24.01.2018, 14:30 | Сообщение № 6
Группа: Пользователи
Ранг: Участник
Сообщений: 53
Репутация: 0 ±
Замечаний: 0% ±

Google Docs
Естественно, это не только пришпандорить квадратные скобки к последовательности цифр. Придётся еще переиначивать код ниже

это трудоемкий для Вас процесс?
 
Ответить
Сообщение
Естественно, это не только пришпандорить квадратные скобки к последовательности цифр. Придётся еще переиначивать код ниже

это трудоемкий для Вас процесс?

Автор - Dimansh
Дата добавления - 24.01.2018 в 14:30
Gustav Дата: Четверг, 25.01.2018, 13:25 | Сообщение № 7
Группа: Админы
Ранг: Участник клуба
Сообщений: 2808
Репутация: 1184 ±
Замечаний: ±

начинал с Excel 4.0, видел 2.1
Dimansh, Подозреваю, что Ваши фрагменты должны выглядеть примерно вот так (кстати, не нашёл у range свойств startColumn и startRow - Вы где их взяли? Я заменил на get...):
[vba]
Код
function onEdit(e) {

var sheetsToWatch = ['таблица', 'Лист 3', 'Лист4'],
    columnsToWatch = [7, 9, 11, 15];

if (columnsToWatch.indexOf(e.range.getColumn()) == -1
    || sheetsToWatch.indexOf(e.source.getActiveSheet().getName()) == -1
    || !e.value)
return;

var columnToStamp = e.range.getColumn() + 1;

e.source.getActiveSheet()
.getRange(e.range.getRow(), columnToStamp)
.setValue(new Date());

...........................

var sheet = e.range.getSheet();
if (columnsToWatch.indexOf(e.range.getColumn()) > -1 &&
    e.range.getNumColumns() == 1 &&
    sheetsToWatch.indexOf(sheet.getName()) > -1 &&
    e.range.getCell(1, 1).getValue() == "E3") {
    e.range.offset(0,
                sheet.getRange("K:AN").getColumn() - e.range.getColumn(),
                e.range.getNumRows(),
                sheet.getRange("K:AN").getNumColumns()
                ).clearContent();
[/vba]


МОИ: Ник, Tip box: 41001663842605
 
Ответить
СообщениеDimansh, Подозреваю, что Ваши фрагменты должны выглядеть примерно вот так (кстати, не нашёл у range свойств startColumn и startRow - Вы где их взяли? Я заменил на get...):
[vba]
Код
function onEdit(e) {

var sheetsToWatch = ['таблица', 'Лист 3', 'Лист4'],
    columnsToWatch = [7, 9, 11, 15];

if (columnsToWatch.indexOf(e.range.getColumn()) == -1
    || sheetsToWatch.indexOf(e.source.getActiveSheet().getName()) == -1
    || !e.value)
return;

var columnToStamp = e.range.getColumn() + 1;

e.source.getActiveSheet()
.getRange(e.range.getRow(), columnToStamp)
.setValue(new Date());

...........................

var sheet = e.range.getSheet();
if (columnsToWatch.indexOf(e.range.getColumn()) > -1 &&
    e.range.getNumColumns() == 1 &&
    sheetsToWatch.indexOf(sheet.getName()) > -1 &&
    e.range.getCell(1, 1).getValue() == "E3") {
    e.range.offset(0,
                sheet.getRange("K:AN").getColumn() - e.range.getColumn(),
                e.range.getNumRows(),
                sheet.getRange("K:AN").getNumColumns()
                ).clearContent();
[/vba]

Автор - Gustav
Дата добавления - 25.01.2018 в 13:25
Dimansh Дата: Четверг, 25.01.2018, 23:18 | Сообщение № 8
Группа: Пользователи
Ранг: Участник
Сообщений: 53
Репутация: 0 ±
Замечаний: 0% ±

Google Docs
Вы где их взяли

я не кодер, не разработчик, не программист, вообще не из этой отрасли. Я все делаю методом чтения справок, мануалов и гугла. а когда совсем трудно - я прихожу сюда.

По Вашему, таки теперь Вашему, коду - изначально казалось, что нормально и именно то, что нужно; но вот смотря на плод трудов Ваших, я понимаю, что это не то, что я видел в голове. Я неправильно пояснил, видимо.

Код, указанный выше - делает то, что делает и что мы обсуждали выше. Только вот теперь возникает коллапс:

Лист "таблица" нуждается ТОЛЬКО в подстановке даты в колонке 8 при изменении колонки 7, а 9,11 и 15 и пр.. содержат кардинально другие данные, при изменении которых не надо никакой даты
а вот лист "таблица2", например, нуждается в подстановке даты в колонку 8 при изменении 7 и даты в колонку 10, при изменении 9.

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

и еще один вопрос:
Почему нельзя создать несколько файлов скриптов, где в каждом будет одинаковая функция и код, а только разные колонки (их номера) и имена листов?
 
Ответить
Сообщение
Вы где их взяли

я не кодер, не разработчик, не программист, вообще не из этой отрасли. Я все делаю методом чтения справок, мануалов и гугла. а когда совсем трудно - я прихожу сюда.

По Вашему, таки теперь Вашему, коду - изначально казалось, что нормально и именно то, что нужно; но вот смотря на плод трудов Ваших, я понимаю, что это не то, что я видел в голове. Я неправильно пояснил, видимо.

Код, указанный выше - делает то, что делает и что мы обсуждали выше. Только вот теперь возникает коллапс:

Лист "таблица" нуждается ТОЛЬКО в подстановке даты в колонке 8 при изменении колонки 7, а 9,11 и 15 и пр.. содержат кардинально другие данные, при изменении которых не надо никакой даты
а вот лист "таблица2", например, нуждается в подстановке даты в колонку 8 при изменении 7 и даты в колонку 10, при изменении 9.

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

и еще один вопрос:
Почему нельзя создать несколько файлов скриптов, где в каждом будет одинаковая функция и код, а только разные колонки (их номера) и имена листов?

Автор - Dimansh
Дата добавления - 25.01.2018 в 23:18
Gustav Дата: Пятница, 26.01.2018, 12:49 | Сообщение № 9
Группа: Админы
Ранг: Участник клуба
Сообщений: 2808
Репутация: 1184 ±
Замечаний: ±

начинал с Excel 4.0, видел 2.1
По Вашему, таки теперь Вашему, коду - изначально казалось, что нормально и именно то, что нужно; но вот смотря на плод трудов Ваших, я понимаю, что это не то, что я видел в голове. Я неправильно пояснил, видимо.

Именно видимо! Я создал массив columnsToWatch = [7, 9, 11, 15] только для того, чтобы продемонстрировать саму возможность обработки нескольких колонок одновременно. Вы же не ставили никакой конкретной задачи, а просто привели несколько фрагментов кода. Я со своей стороны попытался на этих обрывках что-то оптимизировать, не видя остального кода. Поэтому вряд ли меня можно винить в том, что у Вас теперь что-то не так. Решение - зеркало постановки, а постановки как таковой не было.

Ну, да Бог с этими нюансами. Показываю ПРИМЕРНО как можно обрабатывать разные наборы колонок на разных листах в единственной на весь файл функции onEdit:

[vba]
Код
function onEdit(e) {
  
  // массив листов, на которых надо что-то делать
  var sheetsToWatch = ['таблица', 'таблица2'];
  
  var sheetName = e.range.getSheet().getSheetName();   
  // если текущий лист - не в массиве, то и сразу выходим
  if (sheetsToWatch.indexOf(sheetName) == -1) return;
  
  // сюда попадаем тольк если мы на листе, на котором нужно что-то сделать
  
  switch (sheetName) {
    case 'таблица':
      setDateToNextColumn(e, [7]); // на этом листе - только для 7-й колонки
      break;
      
    case 'таблица2':
      setDateToNextColumn(e, [7, 9]); // а на этом - для 7-й и для 9-й
      break;
  }
}

function setDateToNextColumn(e, columnsToWatch) {
  // функция проставляет дату в соседнюю колонку справа
  
  var column = e.range.getColumn(); // текущая колонка (первая колонка текущего диапазона)
  
  // если текущая колонка - НЕ в массиве (+ некоторое другое условие), выходим
  if (columnsToWatch.indexOf(column) == -1 || !e.value) return;
  
  // иначе - проставляем дату
  var columnToStamp = column + 1;   // соседняя справа колонка  
  var sheet = e.range.getSheet(); // текущий лист
  sheet.getRange(e.range.getRow(), columnToStamp).setValue(new Date());
}  
[/vba]


МОИ: Ник, Tip box: 41001663842605
 
Ответить
Сообщение
По Вашему, таки теперь Вашему, коду - изначально казалось, что нормально и именно то, что нужно; но вот смотря на плод трудов Ваших, я понимаю, что это не то, что я видел в голове. Я неправильно пояснил, видимо.

Именно видимо! Я создал массив columnsToWatch = [7, 9, 11, 15] только для того, чтобы продемонстрировать саму возможность обработки нескольких колонок одновременно. Вы же не ставили никакой конкретной задачи, а просто привели несколько фрагментов кода. Я со своей стороны попытался на этих обрывках что-то оптимизировать, не видя остального кода. Поэтому вряд ли меня можно винить в том, что у Вас теперь что-то не так. Решение - зеркало постановки, а постановки как таковой не было.

Ну, да Бог с этими нюансами. Показываю ПРИМЕРНО как можно обрабатывать разные наборы колонок на разных листах в единственной на весь файл функции onEdit:

[vba]
Код
function onEdit(e) {
  
  // массив листов, на которых надо что-то делать
  var sheetsToWatch = ['таблица', 'таблица2'];
  
  var sheetName = e.range.getSheet().getSheetName();   
  // если текущий лист - не в массиве, то и сразу выходим
  if (sheetsToWatch.indexOf(sheetName) == -1) return;
  
  // сюда попадаем тольк если мы на листе, на котором нужно что-то сделать
  
  switch (sheetName) {
    case 'таблица':
      setDateToNextColumn(e, [7]); // на этом листе - только для 7-й колонки
      break;
      
    case 'таблица2':
      setDateToNextColumn(e, [7, 9]); // а на этом - для 7-й и для 9-й
      break;
  }
}

function setDateToNextColumn(e, columnsToWatch) {
  // функция проставляет дату в соседнюю колонку справа
  
  var column = e.range.getColumn(); // текущая колонка (первая колонка текущего диапазона)
  
  // если текущая колонка - НЕ в массиве (+ некоторое другое условие), выходим
  if (columnsToWatch.indexOf(column) == -1 || !e.value) return;
  
  // иначе - проставляем дату
  var columnToStamp = column + 1;   // соседняя справа колонка  
  var sheet = e.range.getSheet(); // текущий лист
  sheet.getRange(e.range.getRow(), columnToStamp).setValue(new Date());
}  
[/vba]

Автор - Gustav
Дата добавления - 26.01.2018 в 12:49
Dimansh Дата: Пятница, 26.01.2018, 13:41 | Сообщение № 10
Группа: Пользователи
Ранг: Участник
Сообщений: 53
Репутация: 0 ±
Замечаний: 0% ±

Google Docs
обрабатывать разные наборы колонок на разных листах

да, теперь я понял, где собака порылась. спасибо, буду пробовать.
 
Ответить
Сообщение
обрабатывать разные наборы колонок на разных листах

да, теперь я понял, где собака порылась. спасибо, буду пробовать.

Автор - Dimansh
Дата добавления - 26.01.2018 в 13:41
  • Страница 1 из 1
  • 1
Поиск:

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