Есть файл xlsx с pq (Power Query) скриптами внутри. Они доставали с гос.сайта инфу и добавляли ее к локальным данным. Все это дело отрабатывало где-то за 15 +/- пару минут Внезапно для меня формат данных с гос.сайта поменялся. Теперь ту часть кода pq, что доставала данные, пришлось засунуть в VBA (не умеет pq делать такие штуки). То есть получился такой код:
Код
Sub ProcessAndDownloadExchangeRates()
...
тут код, который достает данные
...
а затем вызывается выполнение pq-скриптов
RefreshAllAndWait
End Sub
Sub RefreshAllAndWait()
' Запускаем обновление всех запросов Power Query
ThisWorkbook.RefreshAll
' Ждем завершения обновления
Dim conn As WorkbookConnection
Dim allDone As Boolean
Do
DoEvents ' Позволяет Excel обновить интерфейс
allDone = True
For Each conn In ThisWorkbook.Connections
On Error Resume Next ' Игнорируем ошибки, если свойство Refreshing недоступно
If conn.Type = xlConnectionTypeOLEDB Or conn.Type = xlConnectionTypeModel Then
If conn.Refreshing Then
allDone = False
Exit For
End If
End If
On Error GoTo 0
Next conn
Loop Until
allDone
MsgBox "Все запросы Power Query успешно обновлены!", vbInformation
End Sub
[CODE][/CODE]
VBA-код без вызова обновления pq-скриптов выполняется около минуты. За то с вызовом обновления - около часа. То есть, грубо говоря, pq выполняется этот самый час.
У меня возник вот такой вопрос - почему так происходит? Почему время работы просто pq-запросов и их же, но вызванных через VBA так сильно различается? Машина та же (да, барахло, но работает), скрипты те же (более того, часть кода убрал потому как VBA ее теперь делает), данные те же. А время выполнения столь разительно различается - в 3-4 раза медленнее из-под VBA.
есть подписка на Office 365, есть учетная запись Microsoft, под которой я в него захожу (user@company.com), есть десктопный Excel, который открывает файлы с sharepoint. при этом локальный пользователь никак не связан user@company.com, его просто как-то зовут (User02, Admin или еще как-то)
Дело в том, что я хочу чтобы скрипт в автозагрузке книги работал только если ее открыли из-под определенной учетной записи Microsoft - user@company.com. Как мне это реализовать?
самое близкое к искомому это Application.UserName но это выдает всего лишь "Имя пользователя" из "Настройки" -> "Основные параметры для работы с Excel", но это близко не то
Upd:
Великий GPTChat (а то еще решите что это я такой умный) мне подсказал решение, оно работает если помимо Excel установлен Outlook с той же умолчальной учеткой в умолчальном профиле:
Код
Function GetUserEmail() As String
On Error Resume Next
Dim olApp As Object
Dim olNs As Object
Set olApp = CreateObject("Outlook.Application")
Set olNs = olApp.GetNamespace("MAPI")
' Получаем email текущего пользователя
GetUserEmail = olNs.CurrentUser.AddressEntry.GetExchangeUser().PrimarySmtpAddress
' Обработка ошибки, если Outlook не настроен или нет доступа к email
If Err.Number <> 0 Then
GetUserEmail = "Email не найден"
End If
On Error GoTo 0
End Function
а вызывается:
Код
Dim userAccount As String
userAccount = GetUserEmail() ' Получаем email текущего пользователя через Outlook
Нужна идея по созданию длинной формы (много столбцов) с разным уровнем доступа на заполнение, Файл в sharepoint-е. В нем много (под сотню) столбцов, столбцы объединены в группы но несколько, на каждую группу хочу иметь разные уровни доступа для разных пользователей (RW, RO, No access)
Есть список товаров - "Номенклатура", он постоянно пополняется. Товары из списка неким образом попадают в Город "А" (там изготавлтиваются либо по почте приходят), дальше через Город "Б", Город "В" и тд попадают с конечную точку - Город "Я". Неожиданно для меня появилась такая задача - собрать движение товара по всей цепочке в одной таблице по строке из "Номенклатуры". Что-то вроде такого: Номерклатура: Название товара Код товара Цена Номер партии Фасовка ... (может еще какие-то данные, которые я сейчас не включил) Город "А": Количество произведено/получено Дата производства/получения Количество отправлено Дата отправки ... (может еще какие-то данные, которые я сейчас не включил) Город "Б": Количество пришло Дата прихода Количество Дата отправки Количество ушло ... (может еще какие-то данные, которые я сейчас не включил) ...Город "В": ...
При этом, условно, данные для Город "А" заполняет User01, для Город "Б" User02 и тд. Более того, пользователи имеют разные права на разные группы. Например, User01 может писать-читать в Город "А", только читать Город "Б", а все остальное просто не видит. Номенклатуру заполняет вообще UserBuch, а все остальные могут ее только читать. И так далее. Фактически, для каждой группы столбцов (колонок) есть список по пользователям с правами - RW, RO, No access. Разумеется, есть некие "супер-пользователи" (директор, начальник продаж и тд), которые могут видеть эту всю простыню полностью Изначально я думал, что Excel Online (sharepoint и иже с ними) умеют такое делать - определять доступ по столбцам. Но, похоже, не умеют.
Какая-то смутная неоформившаяся идея есть - для каждой группы (Номенклатура, Город "А", Город "Б", ...) сделать отдельный лист, сами листы вроде бы уже можно делить по пользователям. Но ясной картины пока не вырисовывается. Например, как это потом объединять для создания неких отчетов, типа "сколько времени проводит товар Х на складе Город Ц по пути в Город Я" (руководство любит такого рода отчеты чтобы вздрючить транстпортников Город Ц за нерасторопность) Может кто-то подобное делал? Поделитесь опытом пожалуйста.
Да, согласен, больше всего похоже на очередную попытку "написать 1с в экселе". Но пока я не отбрехался от этой задачи, она надо мной висит. Возможно, во всех этих Город "*" просто нет общей 1с-ки и приходится [мне] изобретать велосипед.
Файл приложить не могу. Я пока его сам не придумал
Использование UDF в Условном форматировании, Условное форматирование нормально работает на первых ячейках, а после добавления N-й, вся раскраска видна пару секунд, потом гаснет
Есть книга с VBA.на листе книги текстовый столбец, заполняется CAS-номерами (идентифицирует химические соединения и имеет вид, если через regex, ^\d{2,7}-\d{2}-\d$, а если на пальцах, то сперва от 2-х до 7-ми цифр, затем минус (тире), затем две цифры, затем минус (тире), затем еще одна и имеет вид 1234-56-7 или 1234567-89-0 или 12-34-5).CAS-номер не любая последовательность, которая попадает в regex. Там есть что-то вроде контрольной суммы, которая легко рассчитывается. Процедура расчета лежит в VBA этой же книги:
Код
Function ПроверкаCAS(CASNumber As String) As Boolean
Dim regex As Object
Dim match As Object
Dim parts() As String
Dim digits As String
Dim checkDigit As Integer
Dim calculatedDigit As Integer
Dim i As Integer
' Создаем объект регулярного выражения
Set regex = CreateObject("VBScript.RegExp")
' Определяем шаблон регулярного выражения для CAS-номера
' Шаблон: от 2 до 7 цифр, затем дефис, 2 цифры, дефис, 1 цифра
regex.Pattern = "^\d{2,7}-\d{2}-\d{1}$"
regex.IgnoreCase = True
regex.Global = False
' Проверка на соответствие шаблону
If Not regex.Test(CASNumber) Then
ПроверкаCAS = False
Exit Function
End If
' Если формат правильный, проверяем контрольную цифру
parts = Split(CASNumber, "-")
digits = parts(0) & parts(1)
checkDigit = Val(parts(2))
calculatedDigit = 0
For i = Len(digits) To 1 Step -1
calculatedDigit = calculatedDigit + Val(Mid(digits, i, 1)) * (Len(digits) - i + 1)
Next i
calculatedDigit = calculatedDigit Mod 10
' Сравниваем рассчитанную контрольную цифру с той, что введена
ПроверкаCAS = (calculatedDigit = checkDigit)
End Function
Теперь делаю условное форматирование ячейки:
Код
=НЕ(ПроверкаCAS(C6))
"если ячейка не пустая и не содержит CAS-номер, окрасить ее в желтый цвет"
к примеру, 106-93-4 это правильный CAS-номер, или 702-79-4, или 100-00-2 а что угодно с буквами уже неправильный
прекрасно работает для первых четырх строк, а именно, я ввел неправильный CAS-номер, он светится желтым пока не удалю или не введу правильный
как только делаю условное форматирование для пятой строки, желтый цвет для всех ячеек с условным форматированием держится, может, пару секунд, потом сменяется обычным цветом фона. если что-то сделать с каким-то из CAS-номеров, цвета на пару секунд появляются и пропадают.
ну, если дальше добавлять условное форматирование в ячейки, ничего не меняется в лучшую сторону.
при этом, если я делаю вообще простейшее усл.форматирование
Код
=НЕ(ЕПУСТО(C6))
оно прекрасно работает точно на 40 строк вниз, дальше не проверял.
есть у меня подозрение, что это как-то связано в выполнением расчетов функций для усл. форматирования. тогда что, я должен использовать примитивщину вроде ЕПУСТО, которая встроена в Excel? а если нужны более сложные расчеты, как в таком случае поступать?
а мне, к примеру, было бы интересно не только желтым цветом выделить неправильные CAS-ы, но и красным выделить те, что находятся в одном именованном диапазоне, а штриховкой, те что в другом (эти диапазоны могут пересекаться и я хочу это видеть). нет, формулы-то у меня все есть, и диапазоны есть, но смысл это все наворачивать, если оно только пару секунд видно.
машина далеко не монстр: проц Athlon 3050U, 8 Гб оперативки, зато SSD диск (может тут собака порылась? там, мало памяти, проц дохлятина, но на машине при этом открыт только проводник и сам Excel)
и вот вопрос:может я как-то вообще не так подхожу к выполнению моих хотелок? тогда разъясните, как нужно. а если правильно (ну, хотя бы в общих чертах), то почему это форматирование так странно работает?
Изменено: Sanja - 20.09.2024 13:55:55(Темы типа 'что-то там странно работает', в следующий раз будут закрыты без предупреждения)
Всем желаю доброго дня и спокойствия духа Есть текущая версия Excel для Windows И есть проблема с сильно умным Excel-ем (либо с несильно умным мной)
Возможно слышали - есть такая штука, называется CAS-номер (идентифицирует химические соединения и имеет вид, если через regex, ^\d{2,7}-\d{2}-\d$, а если на пальцах, то сперва от 2-х до 7-ми цифр, затем минус (тире), затем две цифры, затем минус (тире), затем еще одна и имеет вид 1234-56-7 или 1234567-89-0 или 12-34-5).
Собственно, у меня и Excel проблема с теми CAS-номерами, что имеют первые 4 цифры (1234-56-7). Не важно, что формат ячейки выставлен в "Текст", он при любой возможности стремится из CAS-номера "1234-56-7" сделать дату "07(день).56(месяц).1234(год)". Специально взял такие числа чтобы была понятна логика Excel-я. Да, самый простой способ это держать CAS-номера в кавычках. Но это сильно усложнит процесс и не всегда получается, потому как в Excel данные попадают из разных источников - где с кавычками, где без. Когда без кавычек, приходится дополнительно лезть и проверять, где эксель напакостил. Хотелось бы как-то без проверок - как со всеми остальными данными.
Как это воспроизвести? Просто: 1. назначаем ячейке свойство "Текст" 2. пишем в ячейку "7719-09-7" (вот так прямо с кавычками пишем) (это реальный CAS-номер тионил хлорида если кому интересно) 3. делаем "найти и заменить" для этой ячейки - заменить двойные кавычки на ничего 4. получаем дату "9/7/19" (ну или в другом виде, как у вас дата настроена) 5. а в свойствах ячейки волшебным образом появляется "Дата"
а я хочу: 4. получаем 7719-09-7 5. в свойствах по-прежнему "Текст"
это работает как на виндовом экселе, так и на маковском в "настройках" "данные" "Автоматическое преобразование данных" выключал/включал - никакой реакции.
я подозреваю что это часть "ИИ от Excel". но этот тот случай, когда горе от ума.
При объединении двух таблиц с помощью Table.NestedJoin и JoinKind.LeftOuter через общий для них столбец в левую таблицу добавляются записи. Разве так должно быть?
есть две таблицы Query01 и Query02. В каждой есть столбец Key_1 (текстовый, в нем только маленькие буквы и цифры, хорошая штука если надо сравнивать строки, где могут оказаться лишние пробелы, всякие знаки и разный регистр букв). Хочу в Query01 добавить столбец Invoice из Query02. Казалось бы все просто:
Все хорошо, столбец добавился. Но почему в Query01 вдруг добавляются строки? Не было же такого. Я считал, что объединение двух таблиц с помощью Table.NestedJoin и JoinKind.LeftOuter через общий для них столбец это полный аналог VCONNECT из Excel-я. То есть, столбцы/колонки добавляются, а строки - нет. А тут вдруг начали добавляться. Даже не знаю в какую сторону смотреть... Key_1 неуникальный - ну и ладно, берется первое встреченное значение. Меня это устраивает. Query01 ничего криминального (в смысле Error-ов) не содержит. В Query02 может где-то null и быть. Хорошо, я попробовал добавить не "Invoice", а тот же самый "Key_1", по которому связываю таблицы.
Как через power query выделить Error? В данном контексте Error это значение ячейки., Нужно выделить строки именно с Error, потому что null и прочее является допустимым.
есть таблица с колонками: Column1, text; Column2, number; Column3, date. Заполнены соответственно - где нужно текст, числа и даты, кое-где могут быть null - это нормально. Каким-то образом получилось несколько строк, где в каждом поле стоит Error.
Как мне по любому из 3-х столбцов - по которому проще - выделить этот Error?
Что пробовал:
Код
// ловит Error в датах
#"Добавлен пользовательский объект5" = Table.AddColumn(#"Измененный тип1", "TryDate1", each try if [Column3] is null then false else true otherwise false, type logical),
// ловит неправильный формат в датах
#"Добавлен пользовательский объект7" = Table.AddColumn(#"Добавлен пользовательский объект5", "TryDate2", each
let
DateTry = try DateTime.FromText([Column3]),
Result = if DateTry[HasError] then true else false
in
Result, type logical),
// ловит Error в описаниях
#"Добавлен пользовательский объект6" = Table.AddColumn(#"Добавлен пользовательский объект7", "TryText", each try if [Column1] is null then false else true otherwise false, type logical),
// ловит Error в номерах
#"Добавлен пользовательский объект5" = Table.AddColumn(#"Добавлен пользовательский объект7", "TryNumber", each try if [Column2] is null then false else true otherwise false, type logical),
все это в лучшем случае отлавливает null, а в случае с Error само становится Error-ом
Самое интересное, что раньше по крайней мере для "даты" эта штука работала. Либо я что-то напутал. Гугль радостно вываливает тонны информации на тему "какие ошибки бывают в power query". В смысле, в формулах, данных, доступах и прочем. А про конкретно поиск Error-ов ... Ну, или я ищу плохо.
З.Ы. Не могу я ничего приложить потому что это промежуточный результат одного из запросов.
Видимо, что-то "не то" прочитал из какого-то файла. Или не прочитал. Хочу просто сделать столбец с формулой, которая даст мне False для Error и True для все остального, включая null
в Power Query пытаюсь заменить содержимое одного столбца на содержимое соседнего через Table.ReplaceValue. Вместо данных получаю List, в Power Query пытаюсь заменить содержимое одного столбца на содержимое соседнего через Table.ReplaceValue. Вместо данных получаю List
Неожиданно судьба свела меня с Power Query У нас был штатный специалист по Excel и Power Query, но он нас покинул (нет-нет, жив-здоров-свободен, но недоступен). Поэтому мне пришлось - "пионер, ты в ответе за все" ... Какие-то вещи я понял исходя из предыдущих работ нашего специалиста. Но некоторые нет. Либо голова у меня не так работает, либо логику не понимаю.
Вот простейшая, казалось бы, задача: В таблице две колонки (их больше, но интересуют только две). Обе текстовые. В одной есть часть записей со значением null, в другой все правильные. Для определенности, "Счет №1" с "null", "Счет №2" - правильный
Из текстов (запросов Power Query) нашего потерявшегося спеца я понял, что просто так с "null" работать нехорошо. Окей, заменю "null" на что-то более приличное:
не особо понимая разницу между {"#Счет №2"} и {"Счет №2"}. Снова "List" вместо значений.
Хелп от Microsoft ничего на эту тему не говорит... Словом, прошу помощи - как мне заменить текст "Empty" на значение из соседней ячейки именно в Power Query, потому что мне дальше надо ковыряться именно в нем. (в самом экселе это элементарная задача).