Не обязательно использовать платные приложения. Сторонняя программа нужна, да, - но есть и бесплатный вариант: exiftool.exe (программа для извлечения метаданных из файлов десятков разных форматов)
Код
Sub test()
MsgBox GetMetadata(ThisWorkbook.Path & "\Раздел 5. Подраздел 4.3.pdf", "Modify Date*")
' выводит результат 2024:06:20 22:18:58+03:00
End Sub
Function GetMetadata(ByVal filename$, ByVal meta$)
On Error Resume Next: Dim cmd$
AppPath$ = ThisWorkbook.Path & "\exiftool.exe"
cmd$ = """" & AppPath$ & """ -""" & meta$ & """ -charset Cyrillic """ & filename$ & """"
GetMetadata = ShellRun(cmd$)
GetMetadata = Trim(Replace(Split(GetMetadata, ":", 2)(1), vbNewLine, " "))
End Function
Public Function ShellRun(sCmd As String) As String
On Error Resume Next: Dim oShell: Set oShell = CreateObject("WScript.Shell")
ShellRun = oShell.Exec(sCmd).StdOut.ReadAll
End Function
Нужно только скачать exiftool с официального сайта, и положить в папку с макросом файл exiftool.exe и подпапку exiftool_files
Изменено: Игорь - 27.12.2024 00:59:55(исправил код)
Здравствуйте Вы используете вызов функции OnMouseOver из формулы. Этот вызов работает как пользовательская функция (UDF). У пользовательских функций есть ограничения - они не всё могут (часть кода не отрабатывает). В частности, не срабатывает вызов метода OnTime (то есть вызов макроса через время не планируется)
Попытки запланировать запуск макроса через ExecuteExcel4Macro у меня тоже успехом не увенчались. Простого решения я не придумал. В интернетах предлагают решение этой проблемы через WinAPI (вызов SetTimer): https://www.mrexcel.com/board/threads/udf-and-ontime-macro.327530/ Лично я бы не использовал такое, - может работать со сбоями
Можно было проще. Для начала, нужно убрать слово Private в обработчиках событий формы Т.е. меняем Private Sub CommandButton1_Click() на Sub CommandButton1_Click() И в стандартный модуль (module1) файла ФОРМА.xls добавляем функцию для подключения к форме:
Код
Public Function GetForm()
Set GetForm = UserForm1
End Function
и тогда начнут работать вызовы из другого файла вроде такого:
Код
Sub test3234()
Set form = Run("Форма.xls!GetForm")
form.Show
form.Controls("textbox1") = 444
form.CommandButton1_Click
End Sub
я пробовал и Repaint (но он тут не в тему, - тут все перерисовывается и без того) тут задача, скорее, отключать repaint этот (а такой возможности нет) Можно ещё попробовать картинку другого формата (типа BMP под нужный размер), чтобы перерисовка выполнялась быстрее.
Пока писал ответ, придумал решение (Hugo подсказал словом фрейм) — стал пробовать вместо Image другие контролы (картинку-то вставить можно во что угодно, в Label например) И внезапно решение нашлось — вместо элемента Image используем Frame (отключив рамку и очистив Caption, с виду всё будет как у контрола Image) У Frame перерисовка не глючит, картинка плавно выплывает
Код будет такой: (поменять Image2 на Frame1, и тайминги с шагом)
Код
Private Sub CommandButton4_Click()
Frame1.Left = -204
For i = -204 To 200 Step 2
Frame1.Left = i
For j = 1 To 1000: DoEvents: Next
Next
End Sub
Мигания полностью никак не избежать - так криво сделана перерисовка картинки в Excel Ради интереса потратил полчаса, что только не пробовал, мерцание полностью не убирается (и картинку менял, и все её свойства) Иногда (с другой картинкой) помогает незначительное изменение высоты картинки, например, с 558 до 550 px
Код замените на такой:
Код
Private Sub CommandButton4_Click()
Image2.Left = -204
For i = -204 To 12 Step 3
Image2.Left = i
For j = 1 To 4000: DoEvents: Next
Next
End Sub
Обновление PQ с помощью макроса с ProgressBar, Имеется два кода на VBA, один из них на обновление баз данных из PQ, другой на отображение и работу ProgressBar. Нужно их объединить, но не понимаю как это сделать
Не понятно, зачем в вашей формуле вставлена функция СЦЕПИТЬ Формула должна выглядеть примерно так: =ГИПЕРССЫЛКА ("https://google.com/" & D4; D4)
Код
Sub FollowFormulaHyperlink()
' макрос открытия формульной гиперссылки из активной ячейки
URL$ = GetCellHyperlinkAddress(ActiveCell) ' получаем ссылку
CreateObject("WScript.Shell").Run URL$ ' открываем её
End Sub
Function GetCellHyperlinkAddress(ByRef cell As Range, Optional AllowInactiveURL As Boolean = False) As String
On Error Resume Next
Dim v$
With cell.MergeArea.Hyperlinks(1)
GetCellHyperlinkAddress = .Address
If Len(GetCellHyperlinkAddress) Then
If Len(.SubAddress) Then GetCellHyperlinkAddress = GetCellHyperlinkAddress & "#" & .SubAddress
If GetCellHyperlinkAddress Like "..*" Then GetCellHyperlinkAddress = cell.Worksheet.Parent.Path & "\" & Replace(GetCellHyperlinkAddress, "/", "\")
Exit Function
End If
End With
Dim txt$, Brackets&, Quotes&, i&
If GetCellHyperlinkAddress = "" Then
If cell.Formula Like "=HYPERLINK*" Then
txt$ = Mid$(cell.Formula, 12)
txt$ = Left(txt, Len(txt) - 1)
For i& = 1 To Len(txt)
Select Case Mid(txt, i, 1)
Case "(": Brackets& = Brackets& + 1
Case ")": Brackets& = Brackets& - 1
Case """": Quotes& = Quotes& + 1
Case ","
If (Brackets& = 0) And (Quotes& Mod 2 = 0) Then
txt = Left(txt, i - 1)
Exit For
End If
End Select
Next
GetCellHyperlinkAddress = Evaluate(txt)
End If
End If
Err.Clear
End Function
А вот если ненадолго забыть про существование макросов, то проблема решается элементарно: Нажимаем Пуск - Программы - Excel И запускается новый экземпляр Excel со всеми подключенными надстройками
Дело в том, что архив, в моём случае — это "*.xlsx.zip",
я прекрасно понял, для чего этот код я использую его для извлечения картинок из файла Excel, и работает все чётко и сравнительно быстро даже на больших файлах (но я в основном через WinRAR это делаю) мой код проверен на сотнях разных компов, везде работает И получение всех файлов с просмотром подпапок там есть - см. последний вариант кода в статье
У вас не файл загружается, а текст с сообщением об ошибке / какой-то HTML код Вот этот скачанный файл размером 2кБ откройте в Блокноте, и посмотрите что там написано.
Сейчас вы не можете просматривать и скачивать этот файл.
В последнее время этот файл слишком часто просматривался или скачивался. Повторите попытку позже. Если файл очень большой или доступен большому числу пользователей, возможен отказ в доступе к нему в течение ближайших суток. Если через 24 часа ситуация не изменится, обратитесь к администратору домена.
Если нужен IE - зачем используете компонент "MSXML2.ServerXMLHTTP.6.0" ?
XMLHTTP60 использует WinInet HTTP стек (вместе с Internet Explorer) ServerXMLHTTP60 использует WinHttp стек (как и компонент WinHttpRequest)
Вам нужно использовать либо CreateObject("MSXML2.XMLHTTP"), либо запускать IE А вы сейчас прописываете прокси для IE, а потом используете компонент, не связанный с IE Ну или не знаю какой код вы там используете (вы даете куски кода, да еще и с IE не связанные, — гадать что там у вас нет желания)
Если использовать браузер IE - то недостаточно проверять только .readyState = 4, надо ещё .Busy проверять Например, ждем готовности браузера IE, но не более 2 секунд:
Код
TimeStamp = Timer
Do While (.Busy = True) Or (.readyState <> 4)
DoEvents
If Abs(Timer - TimeStamp) >= 2 Then Exit Do
Loop
Если же работаем БЕЗ браузера (как у вас, компонент MSXML2.ServerXMLHTTP.6.0), то ничего вы не дождётесь Ибо тут скрипты не отрабатывают, и, соответственно, ничего не догружают, — сколько сайт выдал данных, столько и выведется.
Вы решили совместить 2 принципиально разных кода (взяли рабочий код для MSXML2.ServerXMLHTTP.6.0, и засунули туда кусок кода от работы с браузером), — так не прокатит.
Возможно, проблема в прокси (который обрезает часть данных / выдаёт их не совсем корректно)
Microsoft Web Browser не корректно отображает сайты., Форма с объектом Microsoft Web Browser не корректно отображает сайты (нет картинок или не грузит)
возможно по одному нажатию этого не получится реализовать
получится, если всё правильно сделать
Selenium управляет браузером, там есть возможность одной командой снять скриншот в файл (формата Png, Jpeg, Gif, Tiff или Bmp)
Код
WebDriver.GetScreenshot.SaveAsFile filename$, 1
Причем, либо всей страницы, либо заданной области (конкретного тега типа DIV или SECTION) К тому же, можно один раз (предварительно) задать вручную размеры окна браузера, и для каждого сайта масштаб страницы.
Microsoft Web Browser не корректно отображает сайты., Форма с объектом Microsoft Web Browser не корректно отображает сайты (нет картинок или не грузит)
Здравствуйте. Microsoft Web Browser = Internet Explorer Этот браузер устарел, и не все сайты в нём отображаются как надо. К сожалению, среди компонентов на форме, других вариантов нет (либо IE, либо ничего)
Есть 2 варианта создания скриншотов для ваших сайтов: 1) использовать запросы к веб-сервису типа s-shot 2) открывать страницы в браузере Chrome через Selenium (там есть возможность снять скриншот страницы)
И то и другое делается макросами (готового кода нет для примера)
PS: заказ свободен изначально заказчик хотел РЕЗУЛЬТАТ (я мог его предоставить), сейчас же он хочет макрос Но упорно не хочет понять, что для задачи нужно подбирать подходящий инструмент (в данном случае ГЕОКОДЕР), а не первый попавшийся с большим числом бесплатных запросов в сутки.
Короче, я могу сделать, но повторю вопросы: 1) вам это надо сделать разово, или часто хотите делать? 2) сколько готовы заплатить? 3) вам нужен результат (в файле Excel) или макрос?
Так вы поэтому хотите использовать именно JavaScript API, — чтобы обойти лимит на 1000 бесплатных запросов с одного АПИ ключа?
PS: вы вообще понимаете, что такое JavaScript API, где и как он работает? Почему вы противопоставляете это HTTP запросам? В вашем случае нужен именно HTTP геокодер