Новости:

Интересные и полезные статьи по работе с Excel и VBA
можно найти в разделе ХИТРОСТИ

Главное меню

Скрипт для скрытия столбцов по условию

Автор Максим Пожарский, 22.05.2024, 15:11:45

« назад - далее »

Максим Пожарский

Всем добрый день! Помогите, пожалуйста, доработать скрипт :-\
Уже была похожая ранее тема, собственно оттуда я и скопировал скрипт, чтобы при заданном значении ячейки столбец скрывался, чтобы не руками его каждый раз скрывать или наоборот добавлять.
Есть график, который разбит по месяцам, количество дней в каждом месяце разное и вот хотелось бы сделать так, чтобы при выборе, к примеру, месяца ИЮНЬ, где не 31 день, а 30 следом идущий столбец со значением 01 был скрыт и не мешался, а если выбираем месяц там, где 31 день, то естественно столбец бы не скрывался. Ну и проблема с февралём, где дней 29, то есть, по логике нужно скрывать два столбца. Хотелось бы, чтобы график при выборе того или иного месяца отображался с корректным значением дней в столбцах.
Таблица: https://docs.google.com/spreadsheets/d/1HmvYn2u4WPHkN4G9nd8_tNWEWWYy9evQqFyRdVy9KX8/edit#gid=1549940855
function onEdit(e) {   
  const specificSheet = "Лист2"   // имя листа, на котором будет отслеживание изменения значений ячеек   
  const specificCellColumn = 31    // номер столбца для отслеживания изменений   
   
  let sheetCheck = (e.range.getSheet().getName() == specificSheet)   
  let cellCheck = (e.range.getColumn() == specificCellColumn)   
   
  if (!(sheetCheck && cellCheck)) {   
    return   
  }   
  else {   
    var cellVal = e.range.getValue();   
    if (cellVal >1) {   
      e.range.getSheet().hideColumns(e.range.getColumn());}   
  }   
}


Я вроде в скрипте поменял на свои данные но он выдаёт ошибку в переменной e.range.getSheet

casag

Добрый вечер! В таком виде макрос работать не будет. Макрос не может отслеживать изменение ячейки формулой. Попробуйте так:

function onEdit(e) {
  const arr = ['Апрель', 'Июнь', 'Сентябрь', 'Ноябрь']
  const specificSheet = "Лист2"
  const specificCell = "A12"
  const sourceSheet = e.source.getActiveSheet().getSheetName()
  const cellIndex = e.range.getA1Notation()
  if (sourceSheet == specificSheet && cellIndex == specificCell) {
    e.range.getSheet().showColumns(29, 3)
    const cellValue = e.range.getValue()
    if (arr.includes(cellValue)) {
      e.range.getSheet().hideColumns(31)
    }
    if (cellValue == 'Февраль') {
      e.range.getSheet().hideColumns(30, 2)
      //e.range.getSheet().hideColumns(29,3)//Для невысокостных годов
    }
  }
}

Максим Пожарский

Добрый день! Спасибо вам огромное Casag!!! :-D
Очень помогли, всё работает просто супер, как и хотелось чтобы работало

Максим Пожарский

Добрый день, Casag! Можете, пожалуйста, подсказать, можно ли данный скрипт дублировать в одном коде, чтобы каждый раз, допустим, не менять название листа внутри скрипта при копировании листа?

Максим Пожарский

У меня в основном рабочем графике каждый новый месяц копируется в новый лист, а там уже правятся рабочие часы и так далее... Вот хотелось бы, чтобы допустим, при копировании в новый лист, скрипт также работал.  :-\

У каждого нового листа соответствующее название новому месяцу (Август_2024/Сентябрь_2024/Октябрь_2024) и так далее. Можно ли так сделать? Пытался сам, но не понимаю, как скрипт можно продублировать.

casag

Добрый день! Не надо ничего дублировать. Замените строку макроса
const specificSheet = "Лист2" на
const specificSheet = "Онлайн табло Мюнхена"  ( указываете название листа на котором макрос НЕ ДОЛЖЕН РАБОТАТЬ)
И строку :          if (sourceSheet == specificSheet && cellIndex == specificCell) {
замените на:      if (sourceSheet != specificSheet && cellIndex == specificCell) {

Макрос будет срабатывать на всех листах книги кроме указаного в строке  const specificSheet

Удачи!

Максим Пожарский

Спасибо огромное за помощь Casag!  :-D Работает скрипт! Вы просто гений 8-)

Яндекс.Метрика Рейтинг@Mail.ru