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

Страницы: 1 2 3 4 5 6 7 След.
Кривой путь. Создание папки и сохранение файла
 
Приветствую.
Имеем фрагменты кода
Код
Dim x: x = Dir(sSavePath, 16)
500             If Dir(sSavePath, 16) = "" Then
510                 MkDir sSavePath
520             End If
Debug.Print Err.Number
Debug.Print Dir(sSavePath, 16)

и
Код
530             .ExportAsFixedFormat Type:=0, _
                                     FileName:=sSavePath & "Акт " & Replace_symbols(nmr) & ".pdf", _
                                     Quality:=0, IncludeDocProperties:=True, _
                                     IgnorePrintAreas:=False, OpenAfterPublish:=False
Debug.Print Err.Number

Запустил макрос с параметром
Код
sSavePath = "dsfdfsfd"

При этом ни один из фрагментов не выдал ошибки (типа папка создана, файл сохранен)
Вопрос, где эта папка, где этот файл, и почему нет ошибки?
Debug.Print=
0
dsfdfsfd
0

PS Не думаю, что критично, но работаю из Access.
PPS C правильным путем работает правильно.
Изменено: RAN - 13.12.2022 14:59:13
Символ ₽ создает ошибку в SubMatch VBA
 
Приветствую
Пытаюсь обработать строку
   <div style="color: #AFAFAF; display: inline-block;">35 ₽/ пог.м</div>
Pattern = "inline-block;">(?=\d)([ \s\S$]+?)<"

regex101.com выдает
Match = inline-block;">35 ₽/ пог.м<
SubMatch = 35 ₽/ пог.м<

VBA выдает
Match = inline-block;">35 ?/ пог.м<
SubMatch = м

Как нибудь возможно забороть проблему?
Буква "М" в формате даты. Баг Excel?
 
Мяв.
Навеяно ответом Дмитрий(The_Prist) Щербаков в этой теме
Имеем дату 22.05.2022  15:30:24
Пытаемся ее вывести в формате "ДД ММ мм сс"
До формата "ДД ММ мм" все штатно, но стоит добавить секунды, Excel тут же превращает формат в "ДД мм мм сс", и вместо месяца показывает секунды минуты.
Функция Format идет на поводу у Excel, что, правда не очень удивительно, ибо "mm" для минут не ее родной формат, хотя иногда и прокатывает, a вот Application.Text как-то умудряется их различить.
Код
Sub qq()
   '[a1].NumberFormat = "ДД мм мм сс"
    [e1] = Format([a1], [a1].NumberFormat)    'Return "22 05 05 24"
    [f1] = Application.Text([a1].Value, [a1].NumberFormat)    'Return "22 05 30 24"
End Sub
Изменено: RAN - 05.09.2022 13:56:17
MSForms.Control в модуле класса. Что за зверь?
 
Мяв!
MSForms.Control(s) - это все, что вы напихали в форму.
Код
TextBox =  Control = True

vbYes?
Пытаюсь засунуть TextBox в Control модуля класса и получаю по всей морде
Перестали грузится картинки
 
Приветствую.
Несколько дней назад функция
Скрытый текст

вместо картинок стала грузить файлы с расширением jpg, но с таким содержимым
<html><head><script>function set_cookie(){var now = new Date();var time = now.getTime();time += 19360000 * 1000;now.setTime(time);document.cookie='beget=begetok'+'; expires='+now.toGMTString()+'; path=/';}set_cookie();location.reload();;</script></head><body></body></html>
Что за беда, и как забороть?

URL картинок правильный, в браузере открываются.
Изменено: RAN - 16.03.2022 06:37:07
Сообщение "Публикация" при экспорте файла в PDF
 
Приветствую.
При экспорте файла в PDF макросом (ExportAsFixedFormat Type:=xlTypePDF) вылетает сообщение "Публикация".
Application.DisplayAlerts не помогает.
Как его забороть?
Разметка печатных страниц на разных компах
 
Приветствую!
Сейчас озадачили. Файл создается на 1 компьютере, а печатается на другом. На том компе, на котором он создается последний разрыв страницы установлен правильно, а на том, где печатают он сдвинулся. Почему такое происходит? И как с этим бороться?
Проблемы с открытием файлов в Excel 2010
 
Мяв!
Не так давно (возможно после обновления винды)появилось - при открытии файла даблкликом с какого-то перепуга создается новый экземпляр Excel. При этом он создается очень хитро - открытый файл есть, но в диспетчере его нет. В этом файле  можно перемещаться по ячейкам, но лента не доступна. Причем это происходит как-то весьма выборочно. Т.е. один файл открывается нормально, а другой - так. Или во втором экземпляре вдруг оказывается копия открытого файла.
Win 10, Excel 2010.
Что такое могло приключиться?
К вопросу подбора высоты строки с объединенной ячейкой, или ColumnWidth = ????? ColumnWidth
 
Мяв.
Знаю, что вопрос изъезжен, но все же.
Пошел проторенным путем - создаю копию листа, удаляю объединение и далее по тексту.
Но, столкнулся с непонятками.
в то же время ширина объединенной ячейки, и столбца той же ширины не совпадают.
Где собака порылась, и что же делать, как же быть?
Не создается HTMLDocument
 
Мяв.
Вчера хотел поглядеть файлик из этой темы. И возникла проблема - Excel вылетает без каких либо сообщений. Методом научного тыка выяснил, что это происходит на строке
Код
Set objHTMLDoc = New HTMLDocument

При этом ссылка на библиотеку в наличии. Файлик C:\Windows\SysWOW64\mshtml.tlb тоже.
Где собака порылась?
Win10, Ofis2010/32
Изменено: RAN - 13.12.2021 12:34:36
Программно снять пароль с VBAProject без SendKeys (пароль известен)
 
Мяв!
Имеется код, выполняющий определенную обработку группы файлов в папке. По каким-то причинам этот код работает не стабильно, и может в любой момент выдать ошибку. Причем, после нажатия F5 он совершенно спокойно продолжает работать. Проблема в том, что сей код расположен в надстройке, проект которой закрыт паролем (обычным, без ухищрений). Запуск кода выполняет VBS скрипт. Ручками снимать пароль с надстройки перед запуском, и вновь ставить, как-то грустно.
Тут есть фраза
Цитата
Я лично знаю два способа снять пароль программно: через метод SendKeys и использовании функций API. Т.к. второй способ довольно громоздкий и сложный для понимания - я в данной статье опишу лишь первый способ.
Но, применять глючный метод для лечения глючного кода, это только плодить глюки, а найти решение через API, к сожалению, не удалось.
Люди добрые, поможите, чем можите..
Function isBoolean
 
Мяв!
Вдруг! Обнаружил! Что в VBA функции isBoolean НЕТ!
Сочинил костыль, но дюже не глянется. Может есть варианты лучше?
Код
Function isBoolean(R As Range) As Boolean
    If CStr(R) = "True" Or CStr(R) = "False" Then isBoolean = True
End Function
Изменено: RAN - 12.03.2021 18:18:52
Ошибка формирования диапазона в цикле.
 
Мяв!
Имеется код для создания КП. Из книги с расчетами копируется 4 листа, удаляются лишние формулы, строки и т.д.
При запуске этого кода в цикле, первая итерация отрабатывает без проблем, а вот далее код встает на строке 2260
При нажатии F5 код совершенно спокойно, и корректно продолжает выполняться.
Пр нажатии F8 delRange из Nothing превращается в Range
Адрес собран правильно, до этой строки аналогичные команды на других листах выполняются не однократно. Нужный лист активен.
В какую сторону покопать?
PS Код расположен в надстройке.

Код
Sub KomPred(wbold As Workbook, load_pic As String)
 ....
                        ', vbc As VBComponent
190 Set wbKP = ActiveWorkbook

200 With wbKP
220     With .Worksheets(gsMAIN_NAME)            '!!!
.....
280     End With
290     With .Worksheets(gsABOUT_NAME)           ' О НАС
...
430     End With
440     With .Worksheets(gsSMETA_NAME)           ' СМЕТА

 большая куча кода, в том числе удаление строк и столбцов
 
2100    End With

2110    With .Worksheets(gsOPTION_NAME)          ' ОПЦИИ
собираем адреса удаляемых строк
2250        s = Mid(s, 2)
на строке 2260 ошибка, диапазон Nothing
2260        Set delRange = .Range(s).EntireRow 
2261        delRange.Delete
....
2330    End With
2340    With .Worksheets(gsMAIN_NAME)           
...
2630    End With
2640 End With                                    'wbKP
 ...
End Sub
Изменено: RAN - 03.01.2021 14:09:14
Массив для ВПР() в Application.VLookup
 
Мяв.
Имеем нехитрую формулу
=ВПР(I20;{0;5:13;3};2;1)
При попытке вставить аргументы в Application.VLookup VBA вгоняется в краску, и работать отказывается.
Сей массив в метод напрямую воткнуть можно?
Утки (альтернатива) не интересно.
Excel 2019 при копировании листа убивает УФ со ссылкой на другой лист.
 
Мав!
Клиент пожаловался на работу макроса. Однако, когда стали разбираться, выяснилось, что Excel 2019 при копировании листа полностью убивает правила УФ, содержащие ссылки на другой лист.
Т.е. в новой книге создаем правило, и копируем этот лист в новую книгу. И все, правила нет. Как корова языком слизнула. В 2010 все нормально, в 2016 у клиента тоже было нормально, но ему захотелось 2019. И приплыли.
Это глюк его сборки, или в 2019 корова поселилась? Или, может, где то в настройках поковыряться?
Системное сообщение "Книга содержит внешние данные" и событийная процедура
 
Мяв.
Имеем файл xltm, который пересохраяется в том же формате. При сохранении вылетает системное сообщение.
подробности в этой теме

При работе из кода надстройки DisplayAlerts подавляет это сообщение, и, соответственно удалось достигнуть массового пересохранения без тычков в кнопку..
Но осталась проблема, которая висит, оказывается, уже много лет (я в свое время решения не нашел, согласились на "пущай ругается", а после и вовсе забыл) - при обычном сохранении от этого сообщения избавится не удается. Такое ощущение, что DisplayAlerts в процедуре Workbook_BeforeSave просто игнорируется. Есть ли способ решить проблему?
Системное сообщение "Книга содержит внешние данные"
 
Мяв.
Возникла проблема.
Имеется код, который перезаписывает кучу книг из  папки. И в процессе работы кода вываливается окно с этим сообщением

И все бы ничего, Application.DisplayAlerts его глушит, одна беда, при этом получается ответ "ДА", а требуется получить "НЕТ".
Как сию беду побороть?
Повторный вопрос о замене файла
 
Мяв.
Сохраняю таблицу из Солида в файл Excel.
Выводится вопрос о замене файла. Я соглашаюсь. Ничего необычного.

но, чуть позже вываливается новое окно с тем-же вопросом и строкой в шапке Microsoft Excel.

Стало дюже любопытно, кто, и зачем задает вопрос второй раз?
Отображение окон Excel
 
Мяв!
После перехода на 10 винду стали странно открываться окна Excel. Имеем 4 открытых файла, а при наведении мыша на значек Excel в трее видим только 2. увидеть остальные, чтобы переключиться между файлами, можно только выключив полноразмерное отображение. Уж дюже достало.
Excel стоит все тот-же, 10/32.
Где тут собака порылась?
RefersToR1C1:=Range("a1:a2"). Почему оно работает?
 
Приветствую.
В теме наткнулся на строку кода
Код
Names.Add Name:="qqq", RefersToR1C1:=Range("a1:a2")

Не поленился, залез в справку.
Цитата
Returns or sets the formula that the name refers to. The formula is in the language of the macro, and it's in R1C1-style notation, beginning with an equal sign. Read/write String.
И задался вопросом, а почему оно работает?
PQ как запрос вернуть на лист
 
Приветствую.
Играясь с PQ, удалил с листа запрос. Теперь он "только подключение".
Как его вернуть на лист?
Как кодом определить диапазон чистой страницы
 
Приветствую.
Имеем чистый лист Excel с установленными параметрами - ориентация, поля.
При переходе в режим разметки видим диапазон страницы.
Вопрос - как кодом определить этот диапазон? Куда порыть?
Итоговая задача - вставить картинки (1 картинка на 1 страницу).
UBound ParamArray
 
Приветствую всех.
Решил написать UDF с использованием ParamArray. Несколько неожиданно оказалось, что ParamArray является массивом массивов. Решил пошариться по этому вопросу. Нашарил использование цикла по массиву первого уровня. Раз это написано, то, наверное, кому-нибудь нужно. Но у меня не получилось создать массив первого уровня с числом элементов больше 1.
Вопрос - в какой ситуации массив первого уровня может содержать  более 1 элемента?
Код
Sub test()
    [a1:b2] = Array(1, 2)
    a = "2"
    Debug.Print fTest(a)
    a = Array(1, 2)
    Debug.Print fTest(a)
    a = [a1:b2].Value
    Debug.Print fTest(a)
    a = [a1:b2]
    Debug.Print fTest(a)
End Sub
Function fTest(ParamArray args())
    fTest = UBound(args)
    ' в какой ситуации этот цикл нужен?
    For Each arg In args
    Next
End Function
Аналог Application.Trim
 
Мяв.
Для работы кода требуется функционал Application.Trim, но Application.Trim использовать нельзя.
Я написал аналог, но, мне кажется, что получилась пушка слишком крупного калибра. Может в закутках VBA найдется калибр поменьше?
Код
Sub test()
    txt = "   aa  bb    dd ee   "
    t = AccTrim(txt)
    tt = Application.Trim(txt)
    Debug.Print t
    Debug.Print tt
End Sub
Function AccTrim(txt)
    With CreateObject("VBScript.RegExp")
        .Global = True
        .Pattern = "( {2,})"
        AccTrim = Trim(.Replace(txt, " "))
    End With
End Function
Загрузка данных с листа в Listbox.
 
Мяв.
Имеем Listbox, в который циклом пишем данные с листа.
Код
     ListBox21.List(ListBox21.ListCount - 1, 0) = .Cells(i, 3) 'Наименование материала
     ListBox21.List(ListBox21.ListCount - 1, 1) = .Cells(i, 4) 'ед. изм.
     ListBox21.List(ListBox21.ListCount - 1, 2) = .Cells(i, 7) ' Цена

До обеда числовые данные грузились как Double, в листе отображались с запятой.
Сейчас включил комп, а они в листе с точкой, и типом String.
И это не один Listbox, а все.
При этом, при загрузке через RowSourse, типы распределяются правильно.

В чем причина такого поведения? Как с этим бороться? (Имею в виду не преобразование типа при вычислениях, а при записи)
Ошибка вычисления внутри ЕСЛИ()
 
Мяв!
Имеем 10000 одинаковых формул.
8000 выдают честный 0, а в одном месте - козу. В чем причина?
Работа с Excel разных версий в нескольких процессах
 
Мяв.
Используя ссылки и бесценные советы Doober'a, поиск, и свою фантазию был сочинен код для обработки и сохранения файлов, открытых в отдельных процессах Excel.
По результатам последнего тестирования, получаем следующее
Win7/32 Of 2010/32
Не зависимо от числа файлов, открытых в родительском процессе, число вызовов приложения Set xl = ob.Application колеблется от 1 до общего количества процессов Excel.

Win7/64 of 2016/32
При наличии в родительском процессе 1 файла, количество вызовов 1 шт.
При наличии в родительском процессе 2 и более файлов, вызов приложения попадает в бесконечный цикл. (в коде установлен счетчик для прерывания, очень тупой, на 500 итераций)

Интересует поведение данного кода в различных версиях Ofis, и различных ОС.
А так же очень интересует более адекватный (?) способ прерывания (гусары, молчать!  :) )

В первой части тестирования уже принимали участие голодный котяра, и обкурившийся ведмедь, за что им отдельная благодарность.

Общий инструктаж
распаковать архив
запустить TEST
нажать кнопку 1 - 4 остальных файла откроются в новых процессах (эмуляция работы "сторонней программы")
Нажать кнопку 2 - запустится рабочий макрос, который сохранит файлы, открытые в других процессах по заданным местам, и закроет все лишнее.

Нужное отобразится в MsgBox и в Debag
Изменено: RAN - 27.10.2019 18:52:41
Как определить CurrentProcess
 
Мяв!
Имеется макрос, работающий с файлами, открытыми в разных процессах.
команда
Код
xl.Quit

закрывает приложение, но в диспетчере продолжают болтаться лишние процессы.
Накропал код, который, вроде, позволяет убить лишние процессы.
Код
Sub Test()

    Dim myPrC, myProg
    Set myProg = GetObject("winmgmts:")
    Set myPrC = myProg.ExecQuery("SELECT * FROM Win32_Process WHERE Name = 'EXCEL.exe'")

    For Each x In myPrC
        Debug.Print x.Name & "    " & x.ProcessID
        ' If x.ProcessID <> 3624 Then x.Terminate
        ' If x.Name = "EXCEL.EXE" Then Stop
    Next
End Sub

Однако, остался вопрос, как определить процесс, из которого запущен макрос?
Эмулятор Гранд-сметы (новый Excel, новый файл, заданное имя)
 
Мяв!
Гранд смета при пакетной выгрузке файлов в Excel выгружает их каждый в своем экземпляре Excel в виде новой книги (путь и расширение отсутствуют).
При этом имена файлов имеют вид "очень длинное имя" (у каждого файла свое)
Наброски кода для обработки всего этого безобразия имеются.
Встал вопрос тестирования.
кодом
Код
Sub tt()
    Dim xl As New Excel.Application
    Set xl = CreateObject("Excel.Application")
    xl.Visible = True
    Set wb = xl.Workbooks.Add
    'wb.Name = "очень длинное имя"
End Sub

попытаться эмулировать выгрузку.
Не работает однако. Создает файлы "Книга1", а дальше затык.
Что делать несчастному коту?
Объект RegExp. Использовать один или два? Плюсы и минусы.
 
Мяв.
Не запариваясь, сочинил код
Код
Sub test1()
txt = "text123"
k1 = r1(txt)
k2 = r2(txt)
End Sub
Function r1$(txt)
Static objRegExp As Object
If objRegExp Is Nothing Then Set objRegExp = CreateObject("VBScript.RegExp")
objRegExp.Pattern = "[a-z]+"
r1 = objRegExp.Execute(txt)(0)
End Function
Function r2$(txt)
Static objRegExp As Object
If objRegExp Is Nothing Then Set objRegExp = CreateObject("VBScript.RegExp")
objRegExp.Pattern = "\d+"
r2 = objRegExp.Execute(txt)(0)
End Function

где каждая функция использует свой RegExp.
После задумался, есть ли смысл переделать на код с одним RegExp?
Код
Sub test2()
Dim objRegExp As Object
txt = "text123"
Set objRegExp = CreateObject("VBScript.RegExp")
k1 = r11(objRegExp, txt)
k2 = r21(objRegExp, txt)
End Sub
Function r11$(objRegExp As Object, txt)
objRegExp.Pattern = "[a-z]+"
r11 = objRegExp.Execute(txt)(0)
End Function
Function r21$(objRegExp As Object, txt)
objRegExp.Pattern = "\d+"
r21 = objRegExp.Execute(txt)(0)
End Function

Что скажете?
Изменено: RAN - 19.10.2019 19:52:41
Страницы: 1 2 3 4 5 6 7 След.
Наверх