Новости:

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

Главное меню

Просмотр сообщений

В этом разделе можно просмотреть все сообщения, сделанные этим пользователем.

Просмотр сообщений

Сообщения - Дмитрий Щербаков(The_Prist)

#1
Добрый день.
У Вас же даже комментарии приведены :) Обратите внимание:
const specificSheet = "Общие отделы"   // имя листа, на котором будет отслеживание изменения значений ячеекэто именно нужный Вам кусок. Если убрать проверку на specificSheet - то скрипт будет выполняться на всех листах, не глядя на их имя:
function onEdit(e) {
  //const specificSheet = "Общие отделы"   // имя листа, на котором будет отслеживание изменения значений ячеек
  const specificCellColumn = 12   // номер столбца для отслеживания изменений

  //let sheetCheck = (e.range.getSheet().getName() == specificSheet)
  let cellCheck = (e.range.getColumn() == specificCellColumn)

  if (!(cellCheck)) {
    return
  }
  else {
    var cellVal = e.range.getValue();
    if (cellVal == "Закрыта") {
      e.range.getSheet().hideRows(e.range.getRow());}
  }
}

P.S. Для оформления кодов используйте соответствующую кнопку на панели, при создании сообщения.
#2
Вопрос о том, как должна определяться строка NRow так и остался за кадром. Поэтому помочь не представляется возможным.
Опишите конкретную задачу и все условия - тогда можно будет помочь. У меня пока не сложилась картина того, что Вы вообще пытаетесь сделать, какую строку получить и куда что записать.
#3
Application.ThisCell.Row работает только при вызове функции с листа.
Вы что вообще хотите определить? Какую строку?
#4
Цитата: novinky от 28.11.2024, 04:06:32".\101006657.csv"
такая запись не работает в VBA - нужен конкретный путь.
Функция для этого и создана - Вы можете в отдельной ячейке сформировать нужный путь и уже на неё ссылаться в функции. Например, путь в ячейке А1. Тогда функция будет выглядеть так:
=Get_Value_From_Close_Book($A$1&"\101006657.csv";"101006657";"J3")Чтобы путь в А1 менялся на тот же путь, где лежит сам файл с функцией - можно применить функцию ЯЧЕЙКА: Как получить имя листа формулой
Применение этой функции для получения пути можно подсмотреть здесь(если самостоятельно не получится): Относительный путь к данным PowerQuery
Ну а т.к. Вы используете макросы - то проще будет вообще свою функцию написать и использовать её:
'возвращает путь к папке с файлом с этим кодом
Function GetCurFilePath()
    GetCurFilePath = ThisWorkbook.Path
End Function
#5
Насколько я знаю, стандартными функциями(вроде IMPORTHTML) можно получить данные только с общедоступных страниц сайтов, не защищенных авторизацией.
Скриптами можно забрать данные и с авторизацией, но это уже другой немного уровень работы с таблицами.
#6
Если даты идут одна за другой, то можно так решить:
=ЕСЛИ(ЕОШ(ПОИСК("??.??.????";A1));"";СУММ(A2:ИНДЕКС(A2:A100;ПОИСКПОЗ(A1+1;A2:A100;0)-1)))
#7
Выделяете второй столбец -правая кнопка мыши -Добавить как новый запрос.
Смотрите имя этого запроса(например, это будет "Столбец 2"). Далее удаляете этот второй столбец. Затем создаете новый вычисляемый столбец и прописываете ссылку на этот новый запрос(по сути будет выглядеть так: =#"Столбец 2"). И разворачиваете в строки. Все. Пример запроса(за исключением создания нового запроса) ниже:
let
    Источник = Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content],
    #"Удаленные столбцы" = Table.RemoveColumns(Источник,{"Столбец 2"}),
    #"Добавлен пользовательский объект" = Table.AddColumn(#"Удаленные столбцы", "Пользовательский", each #"Столбец 2"),
    #"Развернутый элемент Пользовательский" = Table.ExpandListColumn(#"Добавлен пользовательский объект", "Пользовательский")
in
    #"Развернутый элемент Пользовательский"
Все специально сделано только при помощи кнопок.
#8
Вообще перед печатью инициализируется событие Workbook_BeforePrint. Это событие возникает в момент нажатия кнопки Печать(т.е. уже после всех настроек). Но оно должно быть обработано либо внутри той книги, которая отправлена на печать, либо в надстройке(в этом случае оно будет обрабатываться для всех книг).
#9
Цитата: Dmitry_Cheplya от 11.11.2024, 21:38:04много нового
эм...а что именно-то? Единственное новое - это функция API SetCurrentDirectoryA(про функции API можно найти информацию через поисковики - тема далеко не новая).
Все остальное по сути тоже самое, что ChDrive и CHDir - указываем нужный путь. И что там непонятно - мне вообще сложно угадать. Идет просто вызов функции и проверка, что она что-то сделала(это нормальное поведение API функций). Можно и не проверять, если не надо - это лишь пример.

'объявляем функцию задания текущего пути в проводнике
Private Declare PtrSafe Function SetCurrentDirectoryA Lib "kernel32" (ByVal lpPathName As String) As LongPtr

Sub SetPath()
    Dim sPath$
    Dim retval
    'задаем путь к папке, которую хотим сделать текущей
    sPath = "\\111.123.14.15\Some_Drive" 'or ThisWorkbook.Path
    'вызываем API функцию задания текущего пути
    retval = SetCurrentDirectoryA(sPath)
    'если результат не равен 0 - значит путь установлен
    'если 0 - значит произошла ошибка и путь не установлен
    If retval = 0 Then
        MsgBox "Ошибка установки пути"
    End If
End Sub
#10
Цитата: Dmitry_Cheplya от 11.11.2024, 19:13:33но все же
но все же - данный ответ полностью это решает - применять необходимо обе строки(начала ChDrive, затем ChDir). Другой вопрос, что Вы не уточнили, что диск у Вас не поименован и тогда ChDrive не сработает, т.к. допускает по сути только один символ(первый). Вообще здесь есть нюансы. Но как правило API справляет неплохо:
Private Declare PtrSafe Function SetCurrentDirectoryA Lib "kernel32" (ByVal lpPathName As String) As LongPtr

Sub SetPath()
    Dim sPath$
    Dim retval
   
    sPath = "\\111.123.14.15\Some_Drive" 'or ThisWorkbook.Path
    retval = SetCurrentDirectoryA(sPath)
    If retval = 0 Then
        MsgBox "Ошибка установки пути"
    End If
End Sub
#11
Цитата: Dmitry_Cheplya от 11.11.2024, 15:21:30В Application.GetOpenFilename нужного параметра нет, но ведь Excel как-то помнит, ОТКУДА пользователь в последний раз открывал файл
Помнит, но только в текущем сеансе - после перезагрузки Excel этот параметр сбрасывается.
И задается он вот как:
ChDrive Left(ThisWorkbook.Path,1)
ChDir ThisWorkbook.Path
#12
Да в общем-то не так и сложно:
=ПСТР(A1;ПОИСК("/";A1)+1;999)&"/"&ПСТР(A1;1;ПОИСК("/";A1)-1)в А1 - Ваши значения. Записываете формулу в В1 и протягиваете вниз.
#14
Не стал переписывать весь код - добавил только копирование. Но не совсем понятно какого размера таблица(сколько столбцов) и как именно и с какого столбца планируется копировать. Поэтому в коде копируется только три столбца выделенной строки(начиная с 1-го):
function myFunction_Button1() {
    var ss = SpreadsheetApp.getActiveSpreadsheet();
    var sheet = ss.getActiveSheet();
    var range = sheet.getActiveRange();
    var row = range.getRow();
    var col = range.getColumn();
    var rng = sheet.getRange(row,1,1,3)
    sheet.insertRowAfter(row);
    var rng_next = sheet.getRange(row+1,1);
    rng.copyTo(rng_next);
    //Logger.log(row);
    //Logger.log(col);
}
#15
Если статусы не входят в диапазон, которые переносится через IMPORTRANGE(а они скорее всего не входят, т.к. проставляются другим человеком) - то никак от этого не избавиться. Ведь он по сути ни к чему не привязан. Здесь только выдумывать всякие привязки по ID строк или ещё что-то такое. Но для этого надо хорошо понимать специфику задачи. И то не факт, что решение будет найдено. Выше уже написал - механизма такого взаимодействия таблиц нет.
Яндекс.Метрика Рейтинг@Mail.ru