Мне нужна помощь в релизации с помощью макросов, засунуть в Excel счётчик с принтеров. Через SnmpB нашёл нужные данные с цифрами счётчика распечатанных/сканированных документов.
Сделал всё как там расписано, однако не смог разобраться с настройкой макроса в самой эксельке. То-есть, по сути, исходные данные имеются, а собрать.. не смог
В VBA Excel есть недодокументированный, но очень мощный и полезный метод Application.Match(). Есть метод-близнец WorksheetFunction.Match(). Работают они похожим образом, но возвращают разные результаты.
В VBA-коде лучше использовать именно Application.Match().
С помощью этого метода можно:
искать элементы (один или сразу несколько) в одномерных диапазонах и массивах;
сравнивать массивы и диапазоны на предмет наличия одинаковых элементов;
осуществлять точный и неточный поиск.
Скорость работы Application.Match() значительно выше, чем у циклов, перебирающих элементы массивов или, тем более, ячейки листов Excel.
Отдельно необходимо отметить, что метод этот довольно известный, но, как правило, не используемый на полную мощность. Так, многим неизвестно - и в официальной справке этого нет - что можно искать не одно значение, а массив значений. Также многие продолжают использовать неудобный вариант WorksheetFunction.Match() вместо удобного Application.Match().
С помощью Application.Match() можно, например, организовать, эффективный поиск множества подразделов на листе за одну операцию при обработке таблиц. Это позволяет сильно экономить по времени поиска и по количеству строчек кода. Также довольно просто можно применить этот метод для операций пересечения и сравнения множеств.
одно значение - переменная или константа, например «aaa», 123 или ValueToFind, причем различных типов - строка, число, дата, логическое.
текстовые значения могут содержать подстановочные знаки * (0+ любых символов),? (один любой символ). Их можно экранировать тильдой ~, если нужно найти именно * или ?
одномерный массив Array(«aaa», 123)
диапазон листа Excel (строка или столбец) Range("A1:A10"), Range("A1:F1")
<Где ищем> может быть:
одномерный массив, содержащий значения различных типов, например, Array(«aaa», 123)
диапазон листа Excel (строка или столбец) Range("A1:A10"), Range("A1:F1")
<Как ищем>:
0 - точно. Массив <Где ищем> может быть неупорядоченным (неотсортированным)
-1 - поиск наименьшего значения. Массив <Где ищем> должен быть отсортирован по убыванию
1 - поиск наибольшего значения. Массив <Где ищем> должен быть отсортирован по возрастанию
Application.Match() возвращает:
если <что ищем>– одно значение, то возвращается одно значение типа Double (индекс найденного значения в массиве, начиная с 1) или значение типа Error (если значение не найдено);
если <что ищем> – массив из N элементов, то возвращается массив, содержащий N значений типа Double (индекс найденного значения в массиве, начиная с 1) или значений типа Error (если значение не найдено).
Особенности:
если значение не найдено, возвращается значение ошибки #N/A [Error 2042] (метод WorksheetFunction.Match() в этом случае генерирует исключение)
поиск текста производится всегда регистронезависимо, т.е. прописные и строчные буквы А и а считаются одинаковыми, и не зависит от установки Option Compare { Binary | Text }
при успешном поиске Application.Match() возвращает для каждого искомого значения только первый индекс найденного элемента в <где ищем>. Т.е. если <что ищем> = 2,2 а в <где ищем> находится 2,1,2,2, то результатом будет массив 1,1 - обе двойки найдется в первом индексе.
1. Ищем несколько текстов, в т.ч. по маске, в массиве:
Данный код ищет строки «qqq» (три q или Q подряд) и «a?b» (строка из трех символов, начинающаяся на a или A, заканчивающаяся на b или B с любым символом посередине) в массиве arr, содержащем строки «AAA», «A5A», «Abb».
В результате работы кода в окне Immediate будет напечатано:
Error 2042
3
Этот результат означает, что строка "qqq" не найдена в массиве arr, а "a?b" соответствует третьему элементу "Abb".
2. Ищем значения из столбца A в столбце C:
Этот код ищет значения из ячеек колонки A листа Excel в колонке C листа Excel. Результат выводится в цикле с предварительной проверкой, найден ли очередной элемент или нет. Эта проверка производится с помощью функции IsNumeric(), которая возвращает Истину в том случае, если аргумент - число. В том случае, если значение не найдено, в результирующем массиве будет находиться значение ошибки (Error), и IsNumeric() вернет Ложь. Также это можно проверить с помощью функции IsError(), которая возвращает Истину, если аргумент является значением ошибки.
Сам не программист, пробовал переиначить примеры с макросами из интернетов - не вышло. Гештальт не закрыт( Наткнулся на лигу, подумал: почему нет?
Дано: книга excel с множеством листов. Пусть будет 50. Начиная с 4 или 5 листа, в столбце B со строки 2 и ниже вписано 7-значное число (идентификатор). На всех листах числа разные. На одном листе есть список всех этих значений по возрастанию. При реализации поиска планировал его убрать или скрыть, это для себя.
Планировал на первой странице сделать окно поиска по всем листам книги с точным вводом значения - ввел значение, рядом в окошке отобразился результат и при нажатии на него происходил переход на эту ячейку. Как инструмент "Найти и заменить", только встроенный в первый лист книги. Если такое возможно сделать, прошу помощи, как реализовать. Методом тыка у меня подобное получилось, но с оговоркой - некоторые значения строк задублировались по всем листам книги. После экспериментов удалил свои вирши
Выкручивайте остроумие на максимум и придумайте надпись для стикера из шаблонов ниже. Лучшие идеи войдут в стикерпак, а их авторы получат полугодовую подписку на сервис «Пакет».
Кто сделал и отправил мемас на конкурс — молодец! Результаты конкурса мы объявим уже 3 мая, поделимся лучшими шутками по мнению жюри и ссылкой на стикерпак в телеграме. Полные правила конкурса.
А пока предлагаем посмотреть видео, из которых мы сделали шаблоны для мемов. В главной роли Валентин Выгодный и «Пакет» от Х5 — сервис для выгодных покупок в «Пятёрочке» и «Перекрёстке».
Реклама ООО «Корпоративный центр ИКС 5», ИНН: 7728632689
Есть две экселевские таблицы. Это могут быть и два разных листа одной книги и две отдельные книги. Их может быть и больше. И вам надо сопоставить ячейки одной таблицы с ячейками другой, чтоб получить значения из её строки. За пределами экселя это делается с помощью SQL. В самом экселе с каких-то пор появилась некая химера под названием PowerQuery, но ну её нафиг.
В составе офиса у нас уже есть DAO. Это ядро баз данных, используемое MS Access-ом - Jet. Его и будем использовать.
Сохраняем область ячеек одной из из исходных таблиц в xls-файл. Например это от A1 до B100
Dim wt As Workbook, sht As Worksheet 'временная книга
"FROM t1 LEFT JOIN dst ON t1.F1 = t2.F1 " & vbCrLf & _
"WHERE t1.F1 Is Not Null AND t2.F1 Is Null;"
Set qdf = dbs.CreateQueryDef("qCompare", strSQL)
Set rst = dbs.OpenRecordset("qCompare")
If Not rst.EOF Then
While Not rst.EOF
'Debug.Print rst.Fields(0), rst.Fields(1)
rst.MoveNext
Wend
End If
Таким образом формируется запрос, в котором вывелись записи из первой таблицы, для которых не нашлось сопоставление во второй. Можем в цикле вывести эти записи в нашу книгу, например.
В коде встречаются две функции. Вот их код:
Function FileExists(strFile As String) As Boolean
On Error GoTo erro
If FileLen(strFile) <> 0 Then FileExists = True
Exit Function
erro:
If Err.Number = 53 Then FileExists = False
End Function
Function CreateDataBaseDAO(newDB As String, Optional sLocate As String = dbLangCyrillic, Optional iVersion As Integer = dbVersion40) As Boolean
Dim dbNew As Database
On Error GoTo Proc_Err
Set dbNew = DBEngine.CreateDatabase(newDB, sLocate, iVersion)
CreateDataBaseDAO = True
Proc_Exit:
Exit Function
Proc_Err:
MsgBox Err.Description, , Err.Number
CreateDataBaseDAO = False
Resume Proc_Exit
End Function
Самая затратная по времени выполнения часть - это копирование записей из файлов в базу. Это приходится делать, т.к. Jet не считает экселевские файлы полноценным источником данных, не может работать с ними непосредственно через связь, и не может по ним строить индексы и вести нормальный поиск. Может только последовательный перебор от начала до конца файла, что нам совсем не удобно. А вот работа с объектами самого акцесса имеет вполне вменяемое быстродействие. В принципе самое быстрое на данный момент среди файловых баз данных.
Полдня бился за то, чтобы найти работающий макрос для SOLIDWORKS, который сохранял чертеж в PDF. Но добился своего (Save Drawing as PDF, если интересно).
А теперь задачка. Как сохранять файл в подпапку, в которой лежит чертёж? Прошерстил всё, что можно (подборка макросов Sw_Plus не помогла), не нашёл готового варианта.
К примеру, чертеж лежит в папке "C://Пупа", а надо сохранить PDF в папку "С://Пупа/PDF". Ну или чтоб макрос сам создавал эту подпапку, тогда ваще идеальный вариант.
В написании макросов не силён, закидайте тапками.
Для информации, SOLIDWORKS 2020, базовые макросы использую активно.