Новости:

Название темы должно отражать суть задачи.
Темы типа "ПОМОГИТЕ!!!", "Срочно!" и т.п. будут удаляться без объяснения причин

Главное меню

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

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

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

Сообщения - McConst

#16
Надо подумать. Наверное это выход.
Чем принципиально надстройка отличается от книги эксель? Кажется кроме расширения ничем. Присутствуют те же листы, как и у обычной книги. Бухгалтерия каждое утро файл новый готовит, но по шаблону. Можно его пересохранять перед началом работы со стандартным именем для надстройки. Это можно даже делать макросом. Отключать старую надстройку/пересохранять/подключать новую.
Спасибо за подсказку. Попробую.
#17
Проблема видоизменилась.
Я все свои проекты в Excel открываю в разных процессах, так как  Excel не умеет выполнять параллельные вычисления из разных книг одновременно внутри одного процесса.
У меня два разных проекта в разных процессах открывают один и тот же файл в режиме "Только для чтения". Вспомогательный файл - это расчетная таблица, которую я использую как пользовательскую функцию.
Экспериментально выяснил, что если вспомогательный файл открыт одни приложением Excel и одновременно делать попытку получить к нему доступ по GetObject другим приложением Excel, то второе приложение валится по ошибке. Т.е для двух приложений допустимо открывать вспомогательный файл в двух самостоятельных процессах. Это не проблема - через CreateObject.
Теперь самое сложное. Если какой-то из процессов вспомогательного файла в одном из приложений отваливается (теряется ссылка на него, допустим по кнопке стоп в режиме отладки), его уже сложно подключить через  GetObject(FileName).Application обратно. Подключается первый попавшийся экземпляр из двух. И чаще всего не тот что надо.
Вопрос следующий, можно ли получить доступ к ActiveX методам и свойствам экземпляра Excel по его хэндлу?
#18
Кажется нашел.

Set xlApp = GetObject("Book2").Application

Дальше уже с ним можно делать что угодно.
#19
Здравствуйте.
Я в своём проекте использую сторонние книги Excel, которые открываю в самостоятельном процессе таким кодом:

Set app = CreateObject("Excel.Application")
app.Visible = False
Set PriceWB = app.Workbooks.Open(FileName:=FilePath & CalcFile, ReadOnly:=True)


Время от времени в проекте возможны аварийные остановки и невидимые процессы остаются висеть в памяти. Обычно я их удаляю через диспетчер задач.
Можно ли как-то перебрать висящие в памяти процессы Excel, прочитать имена книг, которые в них открыты и позакрывать их макросом или переподключиться к нему по новой?
#20
Решил проблему.
В свойствах обозревателя / дополнительно в разделе "Безопасность" были отключены SSL 2.0, TLS1.1 и TLS 1.2
Поставил, всё заработало.
#21
Не помогло.
Вы скорее всего правы, проблема не в коде.
Этот же объект используется и Internet Explorer ом. У меня сервер по http в IE доступен, по https та же самая ерунда. Тема, похоже, вышла за рамки данного форума. Но за наводку по проверке сертификата спасибо.
#22
Касперский?
Вообще интересно. На прошлой неделе сайт работал по http. В воскресенье в полночь на стороне нацбанка сбойнуло, перестали обрабатываться запросы с php сервера. Потом днём заработало. На сайте нацбанка я прочитал, что с сентября осуществляется переход на https. А сегодня в понедельник c самого утра VBA запрос не может провести ни http, ни https.
В хроме открывается всё отлично.
У меня кстати, в VBA при вызове функции с листа одна странность наблюдается. Сразу в параметр MyDate передается нулевое значение, затем функция отрабатывает повторно и получает уже правильное значение. Т.е. на один пересчет функции почему-то идут два вызова подряд и с разными значениями. Грешил на отладчик, но вроде не должен был так.
Буду думать как найти проблему.
#23
 :(
Такая же ерунда. Метод Send генерирует ошибку. Попробовал скрин приложить.
#24
Добрый день.
Нужно из VBA выполнить https запрос к сайту
https://www.nbrb.by/api/exrates/rates/145?ondate=2020-11-16

Стандартное решение, которое работало через http для объекта MSXML2.XMLHTTP не работает. Request возвращает status=12157, ошибку сертификата и пустой ResponseText

Видел в интернете разные извращения с другими объектами, но конкретно как работать с сертификатами так и не разобрался.
Одна из вариаций кода, которая тоже не работает.

Public Function NBRBCourse2(MyDate As Date) As Single
'Пользовательская функция, возвращает курс выбранной валюты на указанный день
'Коды ошибок:
' -1    такой валюты за такую дату не найдено
' -2    сайт Нацбанка загрузился с ошибкой

Dim http As Object 'Объект для выполнения запроса через XMLHttpRequest
Dim text As Variant 'Получаемый текст со страницы
Dim Pos As Long, lngth As Long 'Позиция в тексте при парсинге
Dim url As String
Dim res

url = "https://www.nbrb.by/api/exrates/rates/145?ondate=" & Format(MyDate, "YYYY-MM-DD")

Set http = CreateObject("WinHttp.WinHttpRequest.5.1")

http.Open "GET", url, False 'False - синхронное соединение
http.SetClientCertificate ("LOCAL_MACHINE\Personal\My Certificate")

On Error Resume Next
res = http.Send


If http.Status <> 200 Then
'Ответ на запрос получен с ошибкой
   NBRBCourse2 = -2
End If
text = http.ResponseText

Pos = InStrRev(text, ":") + 1
If Pos = 0 Then
   NBRBCourse2 = -1 'Валюта не найдена
   Exit Function
End If

lngth = Len(text) - Pos
If lngth < 1 Then
   NBRBCourse2 = -1 'Валюта не найдена
   Exit Function
End If

NBRBCourse2 = CDbl(Replace(Mid(text, Pos, lngth), ".", ","))

End Function


Помогите сделать работающий запрос, чтобы сайт возвращал не пустое значение.
#25
Спасибо, так работает

Dim Ref As String, s$ 
    Ref = "ПользовательскийЛист!R[-1]C" 
    s = Application.ConvertFormula(Ref, xlR1C1, xlA1, True, X) 
msgbox s 
#26

Глобальная задача такая - по разным листам книги разбросаны аргументы, с помощью которых через арифметические действия на итоговом листе в ячейке выдается результат.
Я хочу с помощью своей функции собрать эти аргументы в одну формулу в текстовом виде. Т.е. я как аргумент в свою функцию кидаю ссылку на итоговую ячейку и должен получить что-то типа "=(2.65*3.14-9.33)/6"
Данная формула нужна, чтобы использовать её в SQL команде для пересчета базы данных.
Чтобы собрать формулу, использую ссылки R1C1. Из формул стиля R1C1 я могу получить ссылки на ячейки, откуда берутся аргументы. Но как перейти к самим ячейкам - не знаю.
Теоретически ссылку R1C1 можно распарсить и подставить в offset, но если ячейка на другом листе, тогда парсинг усложняется. Проще тогда сразу парсить адреса в стиле A1, к ним можно получить доступ без всяких offset напрямую.
#27
У меня есть пользовательская функция, в которую в качестве аргумента поступает ссылка на ячейку.
Public Function Formula(X As Range) As String
Так же имеется ссылка вида R1C1 в текстовом виде, указывающая на ячейку относительно объекта X.
Что-то вроде

Dim Ref as string
Ref="ПользовательскийЛист!R[-1]C"

Мне нужно получить с помощью ссылки R1C1 текст в ячейке, на которую указывает данная ссылка.
По аналогии со стилем ссылок A1 просится такая запись

Set NewRng=X.Range(Ref)

Но компилятор на такую запись ругается. Как получить доступ к новой ячейке?
#28
Кажется решил вопрос.
Для офиса 2003 в основном рекомендуют пользоваться заменой ключей в реестре /dde на %1
Какие ветки реестра сейчас не помню и в гугле не искал, так как решение через правку реестра будет действовать для всех файлов без исключения. А параллельная работа макросов в разных книгах одновременно требует запуска в отдельных процессах только избранных книг с макросами. Поэтому решение следующее:

На сайте майкрософта перечислены ключи, с которыми может запускаться приложение Excel. Запуск приложения Excel в отдельном процессе выполняется с ключом /x
Чтобы нужная мне книга запускалась в отдельном процессе, делаю следующее:
1. Создаю ярлык в удобном для меня месте к файлу Excel. У меня он расположен по адресу: "C:\Program Files (x86)\Microsoft Office\OFFICE11\EXCEL.EXE"
2. В свойствах ярлыка в пути к объекту дописываю ключ и путь к книге, которую мне нужно запустить в отдельном процессе. Получается что-то такое:
"C:\Program Files (x86)\Microsoft Office\OFFICE11\EXCEL.EXE" /x "D:\Нейтрализаторы.xls"
Все пути должны быть закавычены, иначе пробел между словами может всё испортить. Без кавычек прописывается только ключ.
3. Переименовываем ярлык в имя книги, которую открываем отдельным процессом. Типа в "Нейтрализаторы(отдельно)"
#29
Добрый день.
Пользуюсь Excel 2003 на Win 10. Предпочитаю старый офис в силу быстродействия при обработке таблиц с большим объемом данных порядка 30-60 тыс. строк. Новые офисы на таком объеме просто виснут.
Проблема следующая. Чтобы иметь возможность независимой параллельной работы VBA в нескольких книгах одновременно, нужно чтобы каждая книга открывалась в отдельном процессе Excel.
В голове помню, что нужно запретить dde и поставить параметр "%1" при запуске Excel.
В Win XP это делалось элементарно в проводнике при выборе приложения по умолчанию, в Win10 нужно править реестр. Постоянно забываю в каких ветках реестра нужно копаться. Просьба, напишите кто помнит, что именно нужно править?

Можно ли параметр "%1" править не для всего реестра, а для конкретных файлов с макросами, например в ярлыках на файлы?  - так было бы наверное корректнее.
#30
Наоборот. Сама база ведется в локалке в Accesse, наполняется результатами измерений и т.д. А в MySQL на сервере просто храним данные, которыми планируем делиться со сторонними людьми по интернету. Т.е. в интернете просто неполная реплика данных из Access.
Впринципе, тех возможностей SQL, которые Access предлагает, совместно с VBA вполне хватает на данный момент.
Яндекс.Метрика Рейтинг@Mail.ru