Поиск  Пользователи  Правила 
Закрыть
Логин:
Пароль:
Забыли свой пароль?
Регистрация
Войти
 
Выбрать дату в календареВыбрать дату в календаре

Страницы: 1 2 3 4 5 6 След.
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 мар 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 - 3 янв 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 окт 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 окт 2019 19:52:41
Access и WinAPI
 
Мяв.
Народ, подскажите, почему из Excel код работает, а из Access нет?
Код
Declare Function SHCreateDirectoryEx Lib "shell32" Alias "SHCreateDirectoryExA" _
                                     (ByVal hwnd As Long, ByVal pszPath As String, _
                                      ByVal psa As Any) As Long
 
Sub CreateFolderWithSubfolders(ByVal ПутьСоздаваемойПапки$)
    ' функция получает в качестве параметра путь к папке
    ' если такой папки ещё нет - она создаётся
    ' может создаваться сразу несколько подпапок
    If Len(Dir(ПутьСоздаваемойПапки$, vbDirectory)) = 0 Then    ' если папка отсутствует
        SHCreateDirectoryEx Application.hwnd, ПутьСоздаваемойПапки$, ByVal 0&    ' создаём путь
    End If
End Sub
Изменено: RAN - 19 сен 2019 11:07:38
Подсчет по трем критериям, если третий критерий массив.
 
Мяв!
Нужно подсчитать количество записей, попадающих в диапазон дат по исполнителю.
Но есть один нюанс - этих исполнителей много.
Нашел решение через БСЧЁТ(), но она работает только в пределах листа, а у меня таблица и отчет на разных.
Как выкрутится?
Как формулой отследить, какая возникла ошибка?
 
Мяв.
Как формулой отследить, какая возникла ошибка?
аналогично
Код
?ActiveCell.Value
Error 2029
Error 2015
Открыт ли файл в Excel?
 
Мяв!
Возник вопрос, как определить, открыт ли файл xlsx в Excel, или открыт чем-то другим?
Пока нашли два костыля
1. Не Excel'ы не знают формулу ЕСЛИОШИБКА()
=ЕСЛИ(ЕОШ(ЕСЛИОШИБКА(2/0;0));"Это не MS Excel";"OK")
2. Не Excel'ы на защищеном листе не отображают примечания.
А есть ли какой более правильный способ?

PS выяснилось, что вариант 2 не срабатывает на телефоне
Изменено: RAN - 25 май 2019 19:03:23
Ошибка есть, а ошибки нет
 
Мяв.
Стал глючить макрос.
Фрагмент с проблемой
               
Код
If Len(cl.Value) Then
                    If .Names(cl.Value).RefersTo = wbDonor.Names(cl.Value).RefersTo Then
                        If Err Then
                        Stop
                        aa = Err.Number
                        Debug.Print Err.Number

Условие If Err Then выполняется, однако номер ошибки остается Empty
При замене условия на If Err.Number <> 0 Then картина та же. Лист Immadiate девственно чист.
Как такое вообще быть может?
RegExp. Pattern из массива. Возможные ограничения
 
Мяв!
Планирую использовать макрос типа
Код
Sub test()
    Dim ar, s, t
    Dim cl, m, mm
    
    ar = [h1:h4].Value
    s = Join(Application.Transpose(ar), "|")
    
    Dim RExp As Object
    Set RExp = CreateObject("VBScript.RegExp")
    RExp.Global = True: RExp.IgnoreCase = True
    
    RExp.Pattern = "(" & s & ")" & ",? ?"
    
    For Each cl In [a1:a5]
        If RExp.test(cl.Value) Then
            Set m = RExp.Execute(cl)
            mm = m(0).SubMatches(0)
            t = RExp.Replace(cl.Value, "")
            cl.Next = mm
            cl.Next.Next = t
        End If
    Next
End Sub

Есть ли какие подводные камни с длиной строки, или количествам элементов "или" (элементов массива)?
Ограничения Application.Transpose не в счет.
Если нет, напишите, буду использовать, если есть, напишите, буду думать.

Пока планируемый размер массива ~ 300 элементов (слов)

Альтернативные решения не интересуют.
ЧебурГена
 
Представляю игрушку под кодовым названием Чебургена.
Для игры архивы с картинками распаковать в папку с файлом
Изменено: RAN - 26 фев 2019 19:40:59
Вставить список в комбобокс
 
Мяв!
Нужно в комбо (OLEObject) вставить список "1,2,3" без использования диапазона листа (и макросов).
Я сильно туплю, или это сделать нельзя?
Оператор AND и преобразование типа, 10 AND 4 =0??
 
Мяв
Практически никогда не использую AND, а тут вдруг случилось.
И неожиданно всплыло, что строка
Код
Len(Me.TextBox5) And Len(Me.ComboBox1)

работает совершенно не так, как от нее ожидается.
Результаты теста такой конструкции в файле.
Вопрос - как это работает?
With или не With?, Почему возникает ошибка?
 
Мяв.
Имеем 2 кода вызова календаря.
На мой взгляд, коды идентичны, однако при закрытии календаря крестом первый код выдает ошибку, а второй - нет.
В чем причина такого поведения?
Код
Sub test1()
    Dim d#
    With slancalendar
        .StartUpPosition = 1
        .Show
        d = .Value
    End With
    Unload slancalendar
    MsgBox d
End Sub
Sub test2()
    Dim d#
    With slancalendar
        .StartUpPosition = 1
        .Show
    End With
    d = slancalendar.Value
    Unload slancalendar
    MsgBox d
End Sub
Изменено: RAN - 27 янв 2019 12:06:37
Как размножаются ёжики (именованные диапазоны)?
 
Мяв.
С тем, что к диапазону уровня книги добавляется диапазон уровня листа, на котором он расположен, встречаться доводилось.
Но что могло привести к такому демографическому взрыву?
Страницы: 1 2 3 4 5 6 След.
Наверх