Выбрать дату в календареВыбрать дату в календаре

Страницы: 1
Может ли запуск PQ-скриптов из VBA увеличить их время выполнения против обычного запуска?, Теоретический вопрос
 
Добрый день, уважаемые

Есть файл 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.

Изменено: AlexDen - 28.01.2025 09:02:14 (форматирование съехало - поправил)
VBA. Получить имя учетной записи Microsoft Office 365, под которой Excel открывает файлы с sharepoint? (решено)
 
Добрый день

есть подписка на Office 365, есть учетная запись Microsoft, под которой я в него захожу (user@company.com), есть десктопный Excel, который открывает файлы с sharepoint.
при этом локальный пользователь никак не связан user@company.com, его просто как-то зовут (User02, Admin или еще как-то)

Как мне прочитать этот user@company.com через VBA?

Дело в том, что я хочу чтобы скрипт в автозагрузке книги работал только если ее открыли из-под определенной учетной записи 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


Оставлю тут, вдруг пригодится кому
Изменено: AlexDen - 01.11.2024 09:19:10 (решил уточнить)
Нужна идея по созданию длинной формы (много столбцов) с разным уровнем доступа на заполнение, Файл в 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 преобразовывать текст в дату или горе от ума
 
Всем желаю доброго дня и спокойствия духа
Есть текущая версия 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. Казалось бы все просто:
Код
    #"Объединенные запросы" = Table.NestedJoin(#"Added Custom", {"Key_1"}, Query02, {"Key_1"}, "Query02", JoinKind.LeftOuter),
    #"Развернутый элемент" = Table.ExpandTableColumn(#"Объединенные запросы", "Query02", {"Invoice"}, {"Query02.Invoice"}),
Все хорошо, столбец добавился. Но почему в  Query01 вдруг добавляются строки? Не было же такого. Я считал, что объединение двух таблиц с помощью Table.NestedJoin и JoinKind.LeftOuter через общий для них столбец это полный аналог VCONNECT из Excel-я. То есть, столбцы/колонки добавляются, а строки - нет. А тут вдруг начали добавляться.
Даже не знаю в какую сторону смотреть... Key_1 неуникальный - ну и ладно, берется первое встреченное значение. Меня это устраивает. Query01 ничего криминального (в смысле Error-ов) не содержит. В Query02 может где-то null и быть.
Хорошо, я попробовал добавить не "Invoice", а тот же самый "Key_1", по которому связываю таблицы.  
Код
  #"Объединенные запросы" = Table.NestedJoin(#"Added Custom", {"Key_1"}, Query02, {"Key_1"}, "Query02", JoinKind.LeftOuter),     
  #"Развернутый элемент" = Table.ExpandTableColumn(#"Объединенные запросы", "Query02", {"Key_1"}, {"Query02.Key_1"}),

Тот же результат.

Вот вопрос к грамотным товарищам - почему такое может происходить?
Изменено: AlexDen - 06.05.2024 17:24:32
Как через power query выделить Error? В данном контексте Error это значение ячейки., Нужно выделить строки именно с Error, потому что null и прочее является допустимым.
 
Доброго всем дня.

Продолжаю неравный бой с power query

есть таблица с колонками:
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" = Table.ReplaceValue(#"Замененное значение1",null,"Empty",Replacer.ReplaceValue,{"Счет №1"}),

Отлично работает, все "null" стали "Empty". Теперь хочу все, где "Empty" заменить на аналогичные (из той же строки) из колонки "Счет №2":    
 
Код
 #"Замененное значение3" = Table.ReplaceValue(#"Замененное значение2","Empty",{"Счет №2"},Replacer.ReplaceValue,{"Счет №1"})

А вместо значений вижу "List" во всех замененных ячейках. Пробовал так же:
   
Код
#"Замененное значение3" = Table.ReplaceValue(#"Замененное значение2","Empty",{"#Счет №2"},Replacer.ReplaceValue,{"Счет №1"})
не особо понимая разницу между {"#Счет №2"} и {"Счет №2"}. Снова "List" вместо значений.

Хелп от Microsoft ничего на эту тему не говорит... Словом, прошу помощи - как мне заменить текст "Empty" на значение из соседней ячейки именно в Power Query, потому что мне дальше надо ковыряться именно в нем. (в самом экселе это элементарная задача).
Страницы: 1
Наверх