Выбрать дату в календареВыбрать дату в календаре

Страницы: 1
VBA список переменных/процедур/функций/параметров
 
dhead, спасибо.
Опыт есть, но подключаться к Excel'ю я ещё не умею.
Пока изучал обфускацию, видел что есть возможность работы с dll, но реальных примеров не встретил.
В будущем конечно надо будет изучить это направление, а то как-то медленно VBA работает, по сравнению с C/C++ проектами, которые могут использовать многопоточность, указатели и другие плюшки.
VBA список переменных/процедур/функций/параметров
 
Цитата
sokol92 написал:
vba obfuscation
Огонь!
Я даже слов таких не знал!
нагуглил MACRO Tools VBA Excel - всё уже давно решено и красиво сделано!
А я тут свой колхоз горожу...
Спасибо, sokol92!

Вопрос решен. Тему можно закрыть.
Изменено: A-Soft - 06.03.2024 14:32:34
VBA список переменных/процедур/функций/параметров
 
Защита кода.
Пароль-то снимать только ленивый не умеет.
Обычно пишем код, и имена переменных/процедур/функций пишем по назначению - чтобы самому легко разобраться.
А вот когда я все свои имена переименую в абракадабру, то в этом вряд ли кто захочет разбираться.
Последний мини-проектик был на 985 строк и 165 имён.
На листе делаю список имен, рядом набор случайных английских слов, затем макросом заменяю у себя все имена на другие слова.
Ну и комментарии конечно удаляю.
Код получается очень-трудно-читаемый для программиста.
У меня в комапании редко кто занимается VBA, а вот выдать мои труды за свои - таких персонажей везде хватает.
И мне это не нравится. Вот защищаюсь.
Пример:
Код
For preestablish = musquashroot + 1 To UBound(portmanteaux)
If portmanteaux(preestablish).oversecurely = phentolamine Then
rumpelstiltskin = rumpelstiltskin + portmanteaux(preestablish).sheepsteal
redemptive = redemptive + portmanteaux(preestablish).liableness
nonprevalence = nonprevalence + portmanteaux(preestablish).waldgravine
portmanteaux(preestablish).picturesquely = 1
При этом код работает правильно, но голову сломаешь разбираться как это устроено. ;)  
Изменено: A-Soft - 05.03.2024 20:18:06
VBA список переменных/процедур/функций/параметров
 
Да, конечно.
и Type тоже имеются.
Так-то я свой код перебирать буду, эти моменты помню.
Просто каждый раз поштучно копировать эти имена на лист - долго и нудно выходит.
Надо бы автоматизировать.
VBA список переменных/процедур/функций/параметров
 
Да, похоже изящных решений нет.
Порылся в .CodeModule - не разбежишься.
остаётся построчный перебор
ThisWorkbook.VBProject.VBComponents("Module1").CodeModule.Lines(i, 1)
выделять Dim/Sub/Function и разбирать их на токены...

И не вижу как в VBA можно подобраться к компилятору чтобы он выдавал списки имён.
VBA список переменных/процедур/функций/параметров
 
Всем привет!
Надо получить списки имён всех переменных в модуле "Module1" (глобальных, локальных, массивов), имен всех процедур, функций, а так же имена параметров процедур/функций.
Списки вывести на лист.
Я могу конечно перелопачивать вручную все строки модуля, разбирать текст, и городить вручную кусок компилятора.
Но наверняка есть какие-то методы, основанные на объектной модели VBProject.VBComponents и это можно сделать менее трудоёмко и более изящно?
На худой конец может ткнёте где по-русски почитать про VBComponents ?
Excel глюки с макросом, макрос в режиме пошаговой отладки работает, а в real-time ведет себя ненормально.
 
Sanja, вы помогли мне решить проблему.
благодарностью ответил.
Спорить с вами, и чего-то пыжиться доказывать я не хочу и не буду.
Безусловно до вашего уровня в Excel VBA мне очень далеко.
Если чем обидел - извините. Злого умысла не имел.
Изменено: A-Soft - 04.12.2023 18:07:54
Excel глюки с макросом, макрос в режиме пошаговой отладки работает, а в real-time ведет себя ненормально.
 
Sanja, , благодарю за оперативный ответ. Помогло.
С массивами индексов красиво.
Я все искал константные массивы, не нашел, и наваял кучу констант и много букв кода.
Копирование через массив решило проблему открывания файла макросом.
Хоть помедленнее, зато гарантировано работает!

Цитата
Sanja,  написал:
Забирайте данные из Базы данных в Массив, отбирайте нужные данные кодом
Рад бы, но не умею делать массиву "настраиваемую сортировку" по нескольким столбцам. Мне кажется что Excel сортирует на листе быстрее чем если я нагорожу свой огород с сортировкой массива.

Цитата
Sanja, написал:
Application.ScreenUpdating = False       ' эти "ускорения" не влияют на результат
Ну и этим не принебрегайте. Еще как влияют
Безусловно влияют на скорость работы макроса. Я имел ввиду что результат работы был одинаково плачевный когда мой макрос сам открывал файл базы данных.


Option Base 1 не принял. Наверное потому что Excel 2016 у меня древний. Лично мне привычнее что первый индекс 0.
Немножко причесал
newArr = Application.Index(arr, 0, J)
переписал
newArr = Application.Index(arr, , J)  ' чтобы забирал все строки
и цикл "For J" убрал. Он там лишний.

Осталось непонятным почему после
Workbooks.Open s, 0, True
как-то неполноценно работает файл.
В crows значение правильное читает, а Copy-Paste кастрирует...
Excel глюки с макросом, макрос в режиме пошаговой отладки работает, а в real-time ведет себя ненормально.
 

Мой макрос долго работает (самое быстрое 15 секунд)

Макрос использует другой xlsb-файл с огромной базой данных.

если файл базы данных открыт, то подключается к нему, из умной таблицы копирует себе на лист нужные столбцы, затем идет длительная построчная обработка этих данных. Здесь проблем нет.

если файл базы данных не открыт, то открываем его, также копируем нужные столбцы, закрываем, потом обрабатываем свою выборку на своем листе.

Вот здесь если в пошаговой отладке VBA-кода, тогда все делается нормально. Но если просто запускаю макрос, то выкопировку столбцов он делает всего по 66 строк (в базе данных 25500 строк). И "думает" при этом целых 6 минут. Такое впечатление что пока копируются ячейки столбца, программа  уже запрашивает новые, и поэтому не полностью копируется столбец. Хотя все столбцы одинаково по 66 строк от первого до последнего.

Ну вот как так-то?

Такое впечатление что запускается несколько параллельных процессов, и у них рассинхрон.

Код
Public Sub анализ2()

On Error Resume Next

Dim t As Single ' таймер для замера времени работы макроса
t = Timer

'Application.ScreenUpdating = False             ' эти "ускорения" не влияют на результат
'Application.Calculation = xlCalculationManual

progress 0, " очистить V_list"   ' прогресс работы в Application.StatusBar

V_list5.Cells.Clear      ' V_list5 - это имя листа в модуле VBA

Dim i As Integer
Dim s As String
Dim s1 As String

s1 = Analiz2.Cells(2, 3).Value & ".xlsb"     ' Получили имя файла базы данных
s = Application.ThisWorkbook.Path & "\" & s1  ' добавили к нему путь (в одной папке с этой книгой)

If Not IsEmpty(Analiz2.ListObjects("Таблица3").DataBodyRange) Then Analiz2.ListObjects("Таблица3").DataBodyRange.Delete

If Dir(s) = "" Then   ' если файл не существует, то сообщение об ошибке
  MsgBox "Файл " & Chr(10) & Analiz2.Cells(2, 3).Value & ".xlsb" & Chr(10) & "не существует.", 0, "Ошибка"
Else

progress 1, " Открываю файл " & Chr(171) & Analiz2.Cells(2, 3).Value & ".xlsb" & Chr(187)
Dim myBook As Workbook
Dim filo As Boolean   ' флаг, показывает что база данных сейчас не открыта, надо открывать файл

Set myBook = Workbooks(s1)
filo = myBook Is Nothing
If filo Then
Workbooks.Open s, 0, True
End If

progress 3, " Копирую из файла " & Chr(171) & Analiz2.Cells(2, 3).Value & ".xlsb" & Chr(187)

Dim ws As Worksheet
Dim crows As Integer
Set ws = Workbooks(s1).Sheets("RH_BaseAll")    ' получаю доступ к листу базы данных
crows = ws.ListObjects("Таблица1").ListRows.Count- 1   ' получаю число строк умной таблицы базы данных
V_list5.Range("B1").Value = crows         ' вывожу себе в ячейку для проверки

' Далее идет выкопировка данных
ws.ListObjects("Таблица1").Range.Columns(IsxNumLine).Copy            ' здесь используются константы с номерами нужных столбцов
V_list5.Cells(4, TarNumLine).PasteSpecial (xlPasteValuesAndNumberFormats)  ' Isx-исходники из базы данных, Tar-номер столбца на моем листе V_list5
ws.ListObjects("Таблица1").Range.Columns(IsxNumIzometr).Copy
V_list5.Cells(4, TarNumIzometr).PasteSpecial (xlPasteValuesAndNumberFormats)
ws.ListObjects("Таблица1").Range.Columns(IsxNumYarus).Copy
V_list5.Cells(4, TarNumYarus).PasteSpecial (xlPasteValuesAndNumberFormats)
'  ....... Копирую 27 столбцов .......

Application.CutCopyMode = False  ' выйти из режима копирования

progress 4, " Закрываю файл " & Chr(171) & Analiz2.Cells(2, 3).Value & ".xlsb" & Chr(187)

If filo Then    ' если файл базы данных был открыт моим макросом, тогда закрываю его
  Workbooks(s1).Close False    ' без сохранения
End If

Файлы приложить не могу - нельзя распространять базу данных.

Excel2016 на Windows 7x64 (Тапками не кидайтесь - тоже вынужденная мера)

Есть ещё один вопрос, похоже по той же причине у меня прогресс не весь отображается.

То есть первые этапы отображаются, а когда работает цикл For то отображается старый прогресс.

Я подумал что слишком часто требую отображения прогресса и форма просто не успевает его отрисовывать, сделал через 1000 строк, но не помогло.

Код
Sub progress(x As Integer, s As String)
Application.StatusBar = " --- " & x & "% --- " & s
DoEvents
End Sub

‘…….. в макросе: 
For i = 5 To (crows + 5)
If ((i Mod 1000) = 0) Then progress ((i - 5) * (90) / 25500), "Обрабатываю строку № " & i

‘…… далее идет сложная обработка 

И в отладке он 2 сообщения progress из цикла показывает, а потом как будто работает в обход процедуры progress (там точка останова)

Я думаю что у меня что-то не так с настройками самого самого Excel'я.
Либо я недостаточно правильно открываю файл базы данных, и не понимаю работу Application.StatusBar
Прошу помочь советом - что надо изучить/понять/добавить чтобы справиться с такой бедой?
PS Отключал в настройках "многопоточные вычисления" - не помогло. Вообще это для формул в ячейках, но вдруг и на макросы влияет? Попробовал.
Изменено: A-Soft - 04.12.2023 03:47:52
VBA выделить нижнюю строку на каждой странице
 
Во как!!! Есть что комментировать!
Мне-то надо это сделать только на активном листе, а не на всех.
Листы у меня есть несколько для печати, а есть служебные - с формулами.
Просто уже давно все так скомпоновано.
Ваши комментарии, кстати ОЧЕНЬ важны! Как новичок - не везде понимаю что где и как,
а так есть отправная точка для понимания этой области.
Лучше любого учебника. :)
VBA выделить нижнюю строку на каждой странице
 
Run-time error '1004':
Application-defined or object-defined error.
Вот эта ошибка выскакивает.
(у меня офис 2013, вроде профессиональный)
Изменено: A-Soft - 21.06.2014 11:21:19
VBA выделить нижнюю строку на каждой странице
 
Странно. nc не объявлял, просто в лоб указал количество столбцов (оно у меня везде одинаковое),
макрос вылетел на строке

   ws.Range(ws.PageSetup.PrintArea).Borders(xlEdgeBottom).LineStyle = xlContinuous

При этом границы нарисовал там где надо!!!

Вы не могли бы прокомментровать строки макроса, а то я не очень понимаю
что там происходит. Код профессиональный, а еще новичок.
Может сам что наэкспериментирую?
VBA выделить нижнюю строку на каждой странице
 
Ваш файл работает, но если делаю альбомную ориентацию страницы - макрос вылетает в том же месте и в Вашем файле.
*Я одним маркосом задаю многие параметры страницы, потом немного корректирую границы между страницами (по смыслу),
а потом приходится тупо рисовать нижнюю границу у ячеек. Настройки страницы сбивать никак нельзя.
VBA выделить нижнюю строку на каждой странице
 
Так он мне вид переключил на обычный и поменял параметры страницы. И все равно обругал
   nc = ws.Range(ws.PageSetup.PrintArea).Columns.Count
может объявить переменную nc?
VBA выделить нижнюю строку на каждой странице
 
умеем. У меня вид-страничный режим - область печати белое, за областью печати - серое.
Перезадал область печати - тот же результат.
Или имеется ввиду что каждую страницу отдельно добавлять к области печати?
VBA выделить нижнюю строку на каждой странице
 
ругается на
   nc = ws.Range(ws.PageSetup.PrintArea).Columns.Count
VBA выделить нижнюю строку на каждой странице
 
Интересная задачка - на каждой странице листа выделить нижнюю строку и установить нижнюю границу.
Маркорекордер не поможет - в разных файлах по-разному располагаются границы страниц.
К тому же в процессе редактирования границы переношу (в страничном режиме)
Надо ловить именно установленную мной или автоматическую нижнюю границу печатной страницы.
Нужен макрос.
Пример:
Изменено: A-Soft - 21.06.2014 09:42:26
Объединить ячейки выделенного диапазона по столбцам
 
Супер!!!  :)  
Огромное СПАСИБИЩЕ, ктулху!!!
Объединить ячейки выделенного диапазона по столбцам
 
А с файлом-примером что не так?
Объединить ячейки выделенного диапазона по столбцам
 
Да, правила не читал.
Думаю раньше по-любому обсуждалось и где-то решено.
На поиск уйдет много времени. Если б на Delphi/Pascal'e так моментом бы слепил.
А вот с VBA в Excel проблемы у меня пока. Банальный синтаксис и незнание структур
Excel. Мало еще прочитал теории, просто горит сейчас.
Код-то вроде несложный.
Объединить ячейки выделенного диапазона по столбцам
 
Прицепил вроде.
Объединить ячейки выделенного диапазона по столбцам
 
Ребят, накидайте макрос или ткните в тему:
Надо объединить ячейки выделенного диапазона по столбцам (аналог объединения по строкам),
Но с таким условием - в объединяемом столбце если несколько непустых ячеек, то данные этих ячеек
в новой объединенной расположить типа через <Enter>

например:
вот из этого
1xxxyyy
xx2
bbbss
ccc
ddd
сделать это:
1xxx
xx2
bbb
ccc
ddd
yyy
ss
(косяк - границы таблиц не отображаются) еще косяк - в правила не заглядывали [МОДЕРАТОР]

Проблема очень горит, VBA мало понимаю. Записью такой макрос не могу сделать. А надо срочно.
Изменено: A-Soft - 19.06.2014 17:10:23
Страницы: 1
Наверх