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

Страницы: 1 2 3 4 5 6 След.
Системное сообщение "Книга содержит внешние данные"
 
Мяв.
Возникла проблема.
Имеется код, который перезаписывает кучу книг из  папки. И в процессе работы кода вываливается окно с этим сообщением

И все бы ничего, 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
Как размножаются ёжики (именованные диапазоны)?
 
Мяв.
С тем, что к диапазону уровня книги добавляется диапазон уровня листа, на котором он расположен, встречаться доводилось.
Но что могло привести к такому демографическому взрыву?
Поиск позиции даты методом Evaluate
 
Мяв!
Имеем 2 формулы
Код
=ПОИСКПОЗ(D1;A:A)
=ПОИСКПОЗ(ДАТАЗНАЧ("05.01.2019");A:A)

на листе работают обе
Пытаюсь втиснуть в макрос - первая работает, а вторая нет.
В чем проблема?
Крутил уже всяко.
Код
Sub qq()
    x = Evaluate("MATCH(D1,A:A)")
    xx = Evaluate("MATCH(DATEVALUE(""05.01.2019""),A:A)")
    Debug.Print x
    Debug.Print xx
End Sub
Для чего у CommandButton свойство OnAction?
 
Мяв!
Ковыряясь с кнопками, обнаружил, что CommandButton имеет свойство OnAction.
Правда добраться до него не удается.
Вопрос - для чего это свойство у данного элемента?
Application.Trim и 256 символов в ячейке.
 
Мяв!
Давненько столкнулся с особенностью использования Application.Trim при обработке массива. А сегодня понадобилось применить к ячейке. И я с удивлением обнаружил, что при работе с массивом и работе с ячейкой поведение Application.Trim диаметрально противоположное.
С чем такое связано, и как это объяснить?
Код
Sub Test_A_Trim()
' в A1 и A2 текст 256 символов min
On Error Resume Next
x1 = Application.Trim(Range("a1")) ' Error 2015
x2 = Application.Trim(Range("a1").Value) ' работает

ar1 = Application.Trim(Range("a1:a2")) ' работает
ar2 = Application.Trim(Range("a1:a2").Value) ' empty

y = Len(ar1(1, 1))
End Sub
Показать в папке (открыть папку с выделенным файлом)
 
Мяв.
Для "открыть расположение файла" нашел 3 способа
Код
Sub Макрос1()
    Set oShell = CreateObject("Wscript.Shell")
    oShell.Run ("""" & ThisWorkbook.Path & """")
    Set objShellApp = CreateObject("Shell.Application")
    objShellApp.Explore ("" & ThisWorkbook.Path & "")
    objShellApp.Open ("" & ThisWorkbook.Path & "")
End Sub

А как выполнить "показать в папке"? Т.е. открыть папку с выделенным файлом?

PS И, ежели можно, чем отличается "Wscript.Shell" и "Shell.Application" (в пределах данной задачи), и что предпочтительней?
Изменено: RAN - 17 июл 2018 23:04:20
Скрытые "Имена" со странными именами.
 
Мяв!
Совершенно случайно в книге были обнаружены скрытые имена вида
Z_64DF9718_D801_4FDB_9C65_402B3701E3FD_.wvu.Rows
Z_64DF9718_D801_4FDB_9C65_402B3701E3FD_.wvu.Cols
Откуда они появились, и для чего служат?
В формулах ссылок на них нет.
Страницы: 1 2 3 4 5 6 След.
Наверх