Горячее
Лучшее
Свежее
Подписки
Сообщества
Блоги
Эксперты
Войти
Забыли пароль?
или продолжите с
Создать аккаунт
Я хочу получать рассылки с лучшими постами за неделю
или
Восстановление пароля
Восстановление пароля
Получить код в Telegram
Войти с Яндекс ID Войти через VK ID
Создавая аккаунт, я соглашаюсь с правилами Пикабу и даю согласие на обработку персональных данных.
ПромокодыРаботаКурсыРекламаИгрыПополнение Steam
Пикабу Игры +1000 бесплатных онлайн игр
Игра рыбалка представляет собой полноценный симулятор рыбалки и дает возможность порыбачить в реально существующих местах из жизни и поймать рыбу, которая там обитает.

Рыбный дождь

Спорт, Симуляторы, Рыбалка

Играть

Топ прошлой недели

  • Oskanov Oskanov 8 постов
  • AlexKud AlexKud 26 постов
  • StariiZoldatt StariiZoldatt 3 поста
Посмотреть весь топ

Лучшие посты недели

Рассылка Пикабу: отправляем самые рейтинговые материалы за 7 дней 🔥

Нажимая кнопку «Подписаться на рассылку», я соглашаюсь с Правилами Пикабу и даю согласие на обработку персональных данных.

Спасибо, что подписались!
Пожалуйста, проверьте почту 😊

Новости Пикабу Помощь Кодекс Пикабу Реклама О компании
Команда Пикабу Награды Контакты О проекте Зал славы
Промокоды Скидки Работа Курсы Блоги
Купоны Biggeek Купоны AliExpress Купоны М.Видео Купоны YandexTravel Купоны Lamoda
Мобильное приложение

Vba

С этим тегом используют

Microsoft Excel Excel Макрос Программирование Помощь Microsoft Word Без рейтинга Все
164 поста сначала свежее
16
Sverlichok
Sverlichok
1 год назад
Лига помощи Excel

Волшебный метод Match⁠⁠

В 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 }.

Примеры применения Application.Match()

1. Ищем несколько текстов, в т.ч. по маске, в массиве:

Волшебный метод Match Microsoft Excel, Vba, Длиннопост, Проба пера

Данный код ищет строки «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:

Волшебный метод Match Microsoft Excel, Vba, Длиннопост, Проба пера

Этот код ищет значения из ячеек колонки 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

Показать полностью 2
[моё] Microsoft Excel Vba Длиннопост Проба пера
6
pentarhh
pentarhh
1 год назад
Лига помощи Excel

Прошу помощи с внедрением поиска⁠⁠

Сам не программист, пробовал переиначить примеры с макросами из интернетов - не вышло. Гештальт не закрыт(
Наткнулся на лигу, подумал: почему нет?

Дано: книга excel с множеством листов. Пусть будет 50.
Начиная с 4 или 5 листа, в столбце B со строки 2 и ниже вписано 7-значное число (идентификатор). На всех листах числа разные. На одном листе есть список всех этих значений по возрастанию. При реализации поиска планировал его убрать или скрыть, это для себя.

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

[моё] Поиск Microsoft Excel Vba Макрос Текст
11
Castielanddean
1 год назад
MS, Libreoffice & Google docs

Задачи по VBA⁠⁠

Здравствуйте, ребята! Прошу помощи с решением задач, в долгу не останусь)

Задачи по VBA Vba, Microsoft Excel, Задача
Задачи по VBA Vba, Microsoft Excel, Задача
Задачи по VBA Vba, Microsoft Excel, Задача
Vba Microsoft Excel Задача
12
1
asdfqwerzxc
1 год назад

Создание запроса на связывание двух таблиц в Excel с помощью VBA и DAO⁠⁠

Представим себе такую задачу:

Есть две экселевские таблицы. Это могут быть и два разных листа одной книги и две отдельные книги. Их может быть и больше. И вам надо сопоставить ячейки одной таблицы с ячейками другой, чтоб получить значения из её строки. За пределами экселя это делается с помощью SQL. В самом экселе с каких-то пор появилась некая химера под названием PowerQuery, но ну её нафиг.

В составе офиса у нас уже есть DAO. Это ядро баз данных, используемое MS Access-ом - Jet. Его и будем использовать.

  1. Сохраняем область ячеек одной из из исходных таблиц в 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-файл

Создание запроса на связывание двух таблиц в Excel с помощью VBA и DAO Гайд, Vba, SQL, Microsoft Excel, Длиннопост

предварительно подключим библиотеку DAO 3.6

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 не считает экселевские файлы полноценным источником данных, не может работать с ними непосредственно через связь, и не может по ним строить индексы и вести нормальный поиск. Может только последовательный перебор от начала до конца файла, что нам совсем не удобно. А вот работа с объектами самого акцесса имеет вполне вменяемое быстродействие. В принципе самое быстрое на данный момент среди файловых баз данных.

Показать полностью 1
Гайд Vba SQL Microsoft Excel Длиннопост
35
8
AlberTikys
AlberTikys
1 год назад
Конструкторский отдел

Макрос для сохранения чертежа в PDF⁠⁠

Друзья конструктора, доброго субботнего дня.

Полдня бился за то, чтобы найти работающий макрос для SOLIDWORKS, который сохранял чертеж в PDF. Но добился своего (Save Drawing as PDF, если интересно).

А теперь задачка. Как сохранять файл в подпапку, в которой лежит чертёж? Прошерстил всё, что можно (подборка макросов Sw_Plus не помогла), не нашёл готового варианта.

К примеру, чертеж лежит в папке "C://Пупа", а надо сохранить PDF в папку "С://Пупа/PDF". Ну или чтоб макрос сам создавал эту подпапку, тогда ваще идеальный вариант.

В написании макросов не силён, закидайте тапками.

Для информации, SOLIDWORKS 2020, базовые макросы использую активно.

Ссылка на макрос: https://drive.google.com/file/d/18kE_eWY2U4k_VqIsUC9E6YgdcSd...

[моё] Solidworks Инженер-конструктор Макрос API Vba Без рейтинга Сила Пикабу Текст
9
81
Pinelab
Pinelab
1 год назад

VBA - скрипт для MS Excel - ищем текст во всех файлах внутри папки⁠⁠

'Скрипт покажет в каких файлах, ячейке и на каком листе найден текст и выдаст результат в виде таблицы Excel

Attribute VB_Name = "search_in_files"

Public Sub SearchFolders()

Dim fso As Object

Dim fld As Object

Dim strSearch As String

Dim strPath As String

Dim strFile As String

Dim wOut As Worksheet

Dim wbk As Workbook

Dim wks As Worksheet

Dim lRow As Long

Dim rFound As Range

Dim strFirstAddress As String

On Error GoTo ErrHandler

Application.ScreenUpdating = False

'Change as desired

strPath = "C:\Components" 'поменять на ваш

strSearch = InputBox("String to search:", "Search a string", "")

If strSearch = "" Then

Exit Sub

End If

Set wOut = Worksheets.Add

lRow = 1

With wOut

.Cells(lRow, 1) = "Workbook"

.Cells(lRow, 2) = "Worksheet"

.Cells(lRow, 3) = "Cell"

.Cells(lRow, 4) = "Text in Cell"

Set fso = CreateObject("Scripting.FileSystemObject")

Set fld = fso.GetFolder(strPath)

strFile = Dir(strPath & "\*.xls*")

Do While strFile <> ""

Set wbk = Workbooks.Open _

(Filename:=strPath & "\" & strFile, _

UpdateLinks:=0, _

ReadOnly:=True, _

AddToMRU:=False)

For Each wks In wbk.Worksheets

Set rFound = wks.UsedRange.Find(strSearch)

If Not rFound Is Nothing Then

strFirstAddress = rFound.Address

End If

Do

If rFound Is Nothing Then

Exit Do

Else

lRow = lRow + 1

.Cells(lRow, 1) = wbk.Name

.Cells(lRow, 2) = wks.Name

.Cells(lRow, 3) = rFound.Address

.Cells(lRow, 4) = rFound.Value

End If

Set rFound = wks.Cells.FindNext(After:=rFound)

Loop While strFirstAddress <> rFound.Address

Next

wbk.Close (False)

strFile = Dir

Loop

.Columns("A:D").EntireColumn.AutoFit

End With

MsgBox "Done"

ExitHandler:

Set wOut = Nothing

Set wks = Nothing

Set wbk = Nothing

Set fld = Nothing

Set fso = Nothing

Application.ScreenUpdating = True

Exit Sub

ErrHandler:

MsgBox Err.Description, vbExclamation

Resume ExitHandler

End Sub

' для использования вам нужно поменять strPath = "C:\Components" на ваш адрес папки

Показать полностью
Vba Microsoft Excel Текст
61
3
DELETED
1 год назад
Лига помощи Excel

VBA. Сортировка⁠⁠

Всем привет.

По разному работает сортировка в таблице и скриптом. Проблема в знаке ":".
Почему такое?

Прошу прощения за всратые фото, с офисного компа не зайду на пикабу

VBA. Сортировка Vba, Сортировка, Microsoft Excel
VBA. Сортировка Vba, Сортировка, Microsoft Excel
Показать полностью 2
Vba Сортировка Microsoft Excel
9
2
DELETED
1 год назад

(?) как сделать в Word'е макрос, который будет…⁠⁠

  1. искать нужную текстовую строку;

  2. удалит всё после этой строки до самого конца файла;

  3. вставит из внешнего файла нужный текст.

UPD. Решено. Ну вот… отвечаю сам себе.
Для решения этой задачи особо глубокое знание Microsoft VBA не нужно. Но… нужен определённый настрой:
1. Нужно продумать последовательность действий;
2. Записать макрос средствами самого Word'а.
3. Единственная строка, вызвавшая сложность — это вставка из внешнего файла. Вот она:

Selection.InsertFile "d:\2023_test.docx" ' вставка из файла test.docx в текущую позицию

пришлось погуглить и слегка повникать…

Microsoft Word Vba Макрос Нужен совет Microsoft office Текст
6
Посты не найдены
О Нас
О Пикабу
Контакты
Реклама
Сообщить об ошибке
Сообщить о нарушении законодательства
Отзывы и предложения
Новости Пикабу
RSS
Информация
Помощь
Кодекс Пикабу
Награды
Команда Пикабу
Бан-лист
Конфиденциальность
Правила соцсети
О рекомендациях
Наши проекты
Блоги
Работа
Промокоды
Игры
Скидки
Курсы
Зал славы
Mobile
Мобильное приложение
Партнёры
Промокоды Biggeek
Промокоды Маркет Деливери
Промокоды Яндекс Путешествия
Промокоды М.Видео
Промокоды в Ленте Онлайн
Промокоды Тефаль
Промокоды Сбермаркет
Промокоды Спортмастер
Постила
Футбол сегодня
На информационном ресурсе Pikabu.ru применяются рекомендательные технологии