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

Страницы: 1
VBA список переменных/процедур/функций/параметров
 
Всем привет!
Надо получить списки имён всех переменных в модуле "Module1" (глобальных, локальных, массивов), имен всех процедур, функций, а так же имена параметров процедур/функций.
Списки вывести на лист.
Я могу конечно перелопачивать вручную все строки модуля, разбирать текст, и городить вручную кусок компилятора.
Но наверняка есть какие-то методы, основанные на объектной модели VBProject.VBComponents и это можно сделать менее трудоёмко и более изящно?
На худой конец может ткнёте где по-русски почитать про VBComponents ?
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 выделить нижнюю строку на каждой странице
 
Интересная задачка - на каждой странице листа выделить нижнюю строку и установить нижнюю границу.
Маркорекордер не поможет - в разных файлах по-разному располагаются границы страниц.
К тому же в процессе редактирования границы переношу (в страничном режиме)
Надо ловить именно установленную мной или автоматическую нижнюю границу печатной страницы.
Нужен макрос.
Пример:
Изменено: A-Soft - 21.06.2014 09:42:26
Объединить ячейки выделенного диапазона по столбцам
 
Ребят, накидайте макрос или ткните в тему:
Надо объединить ячейки выделенного диапазона по столбцам (аналог объединения по строкам),
Но с таким условием - в объединяемом столбце если несколько непустых ячеек, то данные этих ячеек
в новой объединенной расположить типа через <Enter>

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

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