Посоветуйте книгу
По vba именно для corel draw. Для чайников) или любые обучающие материалы на эту тему. Спасибо)
По vba именно для corel draw. Для чайников) или любые обучающие материалы на эту тему. Спасибо)
Помогите решить задачу, спецы.
Дано: N-ое количество таблиц "калькуляторов" со сводными данными. Все таблицы одинаковы по своей структуре (положения ячеек и подписи), лежат в одной папке вместе.
Требуется: в новой ексель таблице собрать все сводные данные из других. Есть функция консолидации, но это получается костыль неудобный, все равно нужно ручками показать ему, что и откуда брать...
Вопрос: можно ли сделать пустую шаблонную таблицу с каким то макросом, который будет сам указывать данные для консолидации при запуске.
Я вижу это так: я беру шаблон, закидываю в папку с таблицами, открываю, запускаю макрос, он берет пути и имена к таблицам из папки в которой лежит и дает эти данные для консолидации.
Готов оплатить реализацию, если она возможна.
П.С.: может есть другие методы?
Доброго времени суток.
Появилась такая задачка с данными:
Есть сетевые принтеры. Есть SnmpB. Есть Excel.
Мне нужна помощь в релизации с помощью макросов, засунуть в Excel счётчик с принтеров. Через SnmpB нашёл нужные данные с цифрами счётчика распечатанных/сканированных документов.
Сначала наткнулся на данный пост https://pikabu.ru/story/schyotchik_raspechatannyikh_stranits_setevogo_printera__snmp_v_excel_8170785
Сделал всё как там расписано, однако не смог разобраться с настройкой макроса в самой эксельке. То-есть, по сути, исходные данные имеются, а собрать.. не смог
Помогите с решением!(
Не зря говорят, что лучше один раз увидеть, чем сто раз услышать. Так что приглашаем прогуляться по проекту Level Селигерская и собственными глазами посмотреть на благоустройство дворов и редкие форматы квартир.
В конце экскурсии вас ждет подарок от застройщика, не пропустите!
Level Селигерская расположен в южной части района Западное Дегунино, в пешей доступности от станций метро и в окружении пяти парковых зон.
Развитая инфраструктура подойдет и молодежи, и семьям с детьми, и пожилым людям. А редкие форматы квартир — на три стороны света, с угловым остеклением и большим окном в ванной — удивят даже самых требовательных жильцов.
Специально для пикабушников застройщик Level Group дарит промокод на скидку 1%! Все подробности смотрите здесь.
Выбирайте квартиру мечты в Level Селигерская и наслаждайтесь комфортом на новом уровне.
Реклама ООО СЗ «Селигерский»
В VBA Excel есть недодокументированный, но очень мощный и полезный метод Application.Match(). Есть метод-близнец WorksheetFunction.Match(). Работают они похожим образом, но возвращают разные результаты.
В VBA-коде лучше использовать именно Application.Match().
С помощью этого метода можно:
искать элементы (один или сразу несколько) в одномерных диапазонах и массивах;
сравнивать массивы и диапазоны на предмет наличия одинаковых элементов;
осуществлять точный и неточный поиск.
Скорость работы Application.Match() значительно выше, чем у циклов, перебирающих элементы массивов или, тем более, ячейки листов Excel.
Отдельно необходимо отметить, что метод этот довольно известный, но, как правило, не используемый на полную мощность. Так, многим неизвестно - и в официальной справке этого нет - что можно искать не одно значение, а массив значений. Также многие продолжают использовать неудобный вариант WorksheetFunction.Match() вместо удобного Application.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 независимо от установки Option Base { 0 | 1 }.
Данный код ищет строки «qqq» (три q или Q подряд) и «a?b» (строка из трех символов, начинающаяся на a или A, заканчивающаяся на b или B с любым символом посередине) в массиве arr, содержащем строки «AAA», «A5A», «Abb».
В результате работы кода в окне Immediate будет напечатано:
Error 2042
3
Этот результат означает, что строка "qqq" не найдена в массиве arr, а "a?b" соответствует третьему элементу "Abb".
Этот код ищет значения из ячеек колонки A листа Excel в колонке C листа Excel. Результат выводится в цикле с предварительной проверкой, найден ли очередной элемент или нет. Эта проверка производится с помощью функции IsNumeric(), которая возвращает Истину в том случае, если аргумент - число. В том случае, если значение не найдено, в результирующем массиве будет находиться значение ошибки (Error), и IsNumeric() вернет Ложь. Также это можно проверить с помощью функции IsError(), которая возвращает Истину, если аргумент является значением ошибки.
Element 1 is found at index 9
Element 8888 not found (Error 2042)
Element 3 not found (Error 2042)
Element 4 not found (Error 2042)
Element 5 is found at index 4
Element 6 not found (Error 2042)
Element 7 is found at index 10
Element aaa is found at index 6
Element 9 not found (Error 2042)
Element 06.09.2022 is found at index 8
Сам не программист, пробовал переиначить примеры с макросами из интернетов - не вышло. Гештальт не закрыт(
Наткнулся на лигу, подумал: почему нет?
Дано: книга excel с множеством листов. Пусть будет 50.
Начиная с 4 или 5 листа, в столбце B со строки 2 и ниже вписано 7-значное число (идентификатор). На всех листах числа разные. На одном листе есть список всех этих значений по возрастанию. При реализации поиска планировал его убрать или скрыть, это для себя.
Планировал на первой странице сделать окно поиска по всем листам книги с точным вводом значения - ввел значение, рядом в окошке отобразился результат и при нажатии на него происходил переход на эту ячейку. Как инструмент "Найти и заменить", только встроенный в первый лист книги.
Если такое возможно сделать, прошу помощи, как реализовать.
Методом тыка у меня подобное получилось, но с оговоркой - некоторые значения строк задублировались по всем листам книги. После экспериментов удалил свои вирши
Представим себе такую задачу:
Есть две экселевские таблицы. Это могут быть и два разных листа одной книги и две отдельные книги. Их может быть и больше. И вам надо сопоставить ячейки одной таблицы с ячейками другой, чтоб получить значения из её строки. За пределами экселя это делается с помощью SQL. В самом экселе с каких-то пор появилась некая химера под названием PowerQuery, но ну её нафиг.
В составе офиса у нас уже есть DAO. Это ядро баз данных, используемое MS Access-ом - Jet. Его и будем использовать.
Сохраняем область ячеек одной из из исходных таблиц в xls-файл. Например это от A1 до B100
Dim wt As Workbook, sht As Worksheet 'временная книга
Dim sh1 As Worksheet 'первый лист-источник
Dim cStart As String, cEnd As String
Set sh1 = ThisWorkbook.Worksheets(1)
Set wt = Application.Workbooks.Add
Set sht = wt.Worksheets(1)
cStart ="A1" 'первая ячейка
cEnd = "B100" 'сотая строка в столбце B
sh1.Range(cStart & ":" & cEnd).Copy sht.Range("A1")
Application.DisplayAlerts = False
Set WShell = CreateObject("WScript.shell")
strFile1 = WShell.ExpandEnvironmentStrings("%temp%") & "\file1.xls"
wt.SaveAs strFile1, XlFileFormat.xlExcel8
wt.Close
Application.DisplayAlerts = True
Всё то же самое делаем с другой таблицей. Главное, чтоб выходной файл имел другое название.
2. Создаём MDB-файл
Dim strSQL As String
Dim dbs As DAO.Database, rst As DAO.Recordset, qdf As DAO.QueryDef
Dim strMDB As String
Dim WShell
Set WShell = CreateObject("WScript.shell")
strMDB = WShell.ExpandEnvironmentStrings("%temp%") & "\mdb.mdb"
If FileExists(strMDB) Then Kill strMDB
If CreateDataBaseDAO(strMDB) Then
Set dbs = DAO.OpenDatabase(strMDB)
'создаём таблицу и поля
Set tdf = dbs.CreateTableDef("t1")
Set fld1 = tdf.CreateField("f1", dbText, 255)
tdf.Fields.Append fld1
Set fld1 = tdf.CreateField("f2", dbText, 255)
tdf.Fields.Append fld1
dbs.TableDefs.Append tdf
'создадим запрос на копирование строчек из файла в базу и выполним его
Set qdf = dbs.CreateQueryDef("q1", "insert into t1 SELECT * FROM [Лист1$] AS s_ IN '" & strFile1 & "'[EXCEL 8.0;HDR=no;];")
qdf.Execute
Так же создаём и заполняем столько таблиц, сколько нам надо связать в запросе.
И делаем простенький запрос на выборку со связыванием:
strSQL = "SELECT t1.F1, t1.F2, t2.F1 " & vbCrLf & _
"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, базовые макросы использую активно.
Ссылка на макрос: https://drive.google.com/file/d/18kE_eWY2U4k_VqIsUC9E6YgdcSd...