Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.82/11: Рейтинг темы: голосов - 11, средняя оценка - 4.82
1 / 1 / 0
Регистрация: 28.09.2022
Сообщений: 29

Написание кода в VBA Excel

28.09.2022, 09:35. Показов 3153. Ответов 50

Студворк — интернет-сервис помощи студентам
Извиняйте может за глупупый вопрос, но я нуб.

Изучая большое количество информации выявил следующее, что повергло меня в некое замешательство, так как не компетентен в отношении VBA:
1) Многие статьи рекомендуют в параметрах программы Excel установить настройку безопасности макроса «Отключить все макросы с уведомлением» и активировать галочку «Доверять доступ к объектной модели проектов VBA».
2) Так же некоторые статьи советуют редакторе Visual Basic в пункте Tools-Options на вкладке Editor установить галочку на параметр «Require Variable Declaration» и изменить зхначение «Tab Width» на 2.
Уточните пожалуйста, нужно ли проводить данные настройки, либо использовать какие-либо другие манипуляции по настройке табличного редактора Excel и редактора Visual Basic?

Далее о проблеме, по которой и попал сюда.
Имеется таблица Excel, созданная в версии 2003 и редактируемая, на сегодняшний день, в версии 2016. Таблица имеет несколько тысяч строк с десятками примечаний в каждой строке. Спустя много лет использования файла, большая часть примечания при открытии для редактирования оказывается на 2-5 тысяч строк ниже материнской ячейки. В ручную это все перетаскивать ну очень не удобно, вследствие чего решил написать макрос, который восстановит стандартное положение примечаний.

Задача. Создать отдельную книгу Excel с макросом, которую можно будет переместить на другой компьютер и с помощью которой можно восcтановить расположение примечаний в проблемном файле.

Здесь возникло огромное количество вопросов. Опишу процесс поэтапно и прошу поправить, если где-то что-то делаю некорректно.
1) Создаю модуль insert-Module
2) Двойной клик на Module1, в пункте Insert-Procedure выбираю Sub + Public, и тут не знаю, нужно ли устанавливать галочку «All local variables as Static»
3) Далее в правом окне пишу код. Здесь в смятении, что писать, так как нашел много разных вариантов восстановления расположения примечаний.
У меня получилось вот такие варианты кода, в которых сомневаюсь.

Первый:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Option Explicit ' не знаю надо писать эту строку или нет '
 
Public Sub Fix()
 Dim comm As Comment ' иногда эту строку советуют написать так: Dim iComment As Comment, A_Size As Boolean '
 
    For Each comm In ActiveSheet.Comments
        With comm 
' иногда эти 2 строки советуют написать так: For Each iComment In ActiveSheet.Comments / With iComment.Parent.Cells '
            .Shape.Top = .Parent.Top 
            .Shape.Left = .Parent.Offset(, 1).Left    
' иногда эти 2 строки советуют написать так: iComment.Shape.Top = .Top - 10 / iComment.Shape.Left = .Left + .Width + 10 '     
        End With
    Next comm
    MsgBox "Положения примечаний исправлены" ' иногда эту строку советуют написать так: MsgBox "Положения примечаний исправлены", vbInformation, "" '
End Sub
Второй (без выполнения п.2):

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
Sub Fix()
    Dim oComm As Comment
 
    For Each oComm In ActiveSheet.Comments
        With oComm
            .Shape.Top = .Parent.Cells.Top - 10
            .Shape.Left = .Parent.Cells.Left + .Parent.Cells.Width + 10
        End With
    Next oComm
    MsgBox "Положения примечаний исправлены"
End Sub
4) Закрываю редактор VBA.
5) Закрываю файл Excel. здесь подтверждаю сохранение и соглашаюсь с политикой конфиденциальности.
6) Переношу файл с макросом на другой компьютер, запускаю его.
7) Запускаю проблемную книгу, перехожу на лист со сместившимися примечаниями, запускаю макрос.
Правильно ли выбран порядок действий и как правильнее оформить код, на Ваш взгляд?

Как написать правильный код. И прошу добавить строку, при условии ошибки операции выравнивания примечаний, чтобы тоже выходило уведомление.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
28.09.2022, 09:35
Ответы с готовыми решениями:

Написание сметной программы в среде VBA Excel
Привет друзья!) Нужен программист VBA... Есть сметная программа реализована в Exel с применением VBA, нужно её переделать и доработать...

Оптимизация кода VBA при работе с ячейками листа Excel
Оптимизация кода VBA при работе с ячейками листа Excel https://youtu.be/Xjeu7FP88w4

XLL хранение и выполнение VBA кода, или защита VBA кода от просмотра
Мое почтение, джентльмены... Делал для себя инструмент позволяющий хранить уже наработанный VBA код и его исполнять из XLL. Немного...

50
1 / 1 / 0
Регистрация: 28.09.2022
Сообщений: 29
05.10.2022, 08:12  [ТС]
Студворк — интернет-сервис помощи студентам
Zeag,
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
Option Explicit
 
 
Public Sub FixComments()
Dim tStart As Single
tStart = Timer
Application.ScreenUpdating = False
Application.EnableEvents = False
On Error GoTo blin
    Dim oComm As Comment
    For Each oComm In ActiveSheet.Comments
        With oComm
            .Shape.Top = .Parent.Cells.Top - 10
            .Shape.Left = .Parent.Cells.Left + .Parent.Cells.Width + 10
            .Shape.TextFrame.AutoSize = True
        End With
    Next oComm
    Application.ScreenUpdating = True
    Application.EnableEvents = True
    MsgBox "Готово"
    Exit Sub
blin:
MsgBox "Ошибка" & Err
Application.StatusBar = "Выполнено за " & Round(Timer - tStart, 2) & " сек"
End Sub
Не работает. Или не туда порписал?
Куда уже только не устанавливал Ваши строки.
0
860 / 510 / 187
Регистрация: 09.03.2009
Сообщений: 1,731
05.10.2022, 08:35
В msgbox поставьте, а в обработчике ошибок уберите. Поток управления туда штатно не дойдет.
1
ᴁ ©
Эксперт MS Access
 Аватар для АЕ
4181 / 2466 / 513
Регистрация: 13.12.2016
Сообщений: 8,389
Записей в блоге: 5
05.10.2022, 08:52
Цитата Сообщение от trarater Посмотреть сообщение
Не работает. Или не туда порписал?
Ведь очевидно, что таймер будет показан только в случае возникновения ошибки.
Поставьте вместо "Готово" или объедените
1
933 / 366 / 43
Регистрация: 10.05.2021
Сообщений: 1,564
Записей в блоге: 10
05.10.2022, 09:08
OFF
Название темы такое, что сюда можно писать все вопросы ветки…
0
1 / 1 / 0
Регистрация: 28.09.2022
Сообщений: 29
05.10.2022, 09:14  [ТС]
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Option Explicit
 
 
Public Sub FixComments()
Dim tStart As Single
tStart = Timer
Application.ScreenUpdating = False
Application.EnableEvents = False
    Dim oComm As Comment
    For Each oComm In ActiveSheet.Comments
        With oComm
            .Shape.Top = .Parent.Cells.Top - 10
            .Shape.Left = .Parent.Cells.Left + .Parent.Cells.Width + 10
            .Shape.TextFrame.AutoSize = True
        End With
    Next oComm
    Application.ScreenUpdating = True
    Application.EnableEvents = True
    MsgBox Application.StatusBar = "Выполнено за " & Round(Timer - tStart, 2) & " сек"
End Sub
Zeag, Макрос работает, но в конце выходит уведомление "False"
Цитата Сообщение от АЕ Посмотреть сообщение
Ведь очевидно
Это Вам, а для меня пока это дремучий лес
0
ᴁ ©
Эксперт MS Access
 Аватар для АЕ
4181 / 2466 / 513
Регистрация: 13.12.2016
Сообщений: 8,389
Записей в блоге: 5
05.10.2022, 09:20
MsgBox - это окно диалога
Application.StatusBar - строка статуса внизу страницы.
Что вы городите?
Замените на
Visual Basic
1
MsgBox "Выполнено за " & Round(Timer - tStart, 2) & " сек"
или на
Visual Basic
1
Application.StatusBar = "Выполнено за " & Round(Timer - tStart, 2) & " сек"
или оставьте оба варианта в учебных целях
1
1 / 1 / 0
Регистрация: 28.09.2022
Сообщений: 29
05.10.2022, 15:27  [ТС]
Zeag, АЕ, Спасибо. все получилось.
Методом проб и ошибок выяснил, если Application.StatusBar писать после MsgBox, то если не закрыть окно диалога, то в статус баре таймер тикает.
А так с оптимизатором процесс восстановления прошел за 157,43 сек. а без оптимизатора за 304,95 сек.
Спасибо еще раз друзья.
0
1409 / 869 / 93
Регистрация: 08.02.2017
Сообщений: 3,719
Записей в блоге: 2
05.10.2022, 15:39
Насчет оптимизации, так должно быть немного быстрее
Visual Basic
1
2
3
4
5
With oComm.Shape
    .Top = .Parent.Cells.Top - 10
    .Left = .Parent.Cells.Left + .Parent.Cells.Width + 10
    .TextFrame.AutoSize = True
End With
0
1 / 1 / 0
Регистрация: 28.09.2022
Сообщений: 29
05.10.2022, 15:43  [ТС]
Цитата Сообщение от testuser2 Посмотреть сообщение
так должно быть немного быстрее
Объясните опжалуйста почему?
Выше писали, что объединение операторов не желательно
0
ᴁ ©
Эксперт MS Access
 Аватар для АЕ
4181 / 2466 / 513
Регистрация: 13.12.2016
Сообщений: 8,389
Записей в блоге: 5
05.10.2022, 15:59
Цитата Сообщение от trarater Посмотреть сообщение
Выше писали, что объединение операторов не желательно
а его тут и нет
0
1409 / 869 / 93
Регистрация: 08.02.2017
Сообщений: 3,719
Записей в блоге: 2
05.10.2022, 17:06
trarater, вообще у меня ошибка. Правильнее так
Visual Basic
1
2
3
4
5
6
set oCell = oComm.Parent
With oComm.Shape
    .Top = oCell.Top - 10
    .Left = oCell.Left + oCell.Width + 10
    oComm.TextFrame.AutoSize = True
End With
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
05.10.2022, 17:06

Запуск кода из VBA в Excel
Подскажите пожалуйста, знает кто, как запустить с помощью кода в VBA код в VBA только в Excel, то есть у меня 2 кода, один в Visual Studio...

Написание сметной программы в среде VBA Excel
Доброго времени суток! Требуется программист для написание программы на VBA Excel. На данным момент имеется похожая программа, которую...

промблема в написание программы VBA в Excel а то завтра надо сдать курсовую
На оружейном заводе выпускается оружие 6 марок. У каждого оружия есть разный калибр. Оружие выпускается партиями. Цена на каждый вид оружия...

Vba excel windows и vba excel Mac Os - Макинтош корявит шрифт
Всем привет, столкнулся с такой ситуацией. Макросы написаны на Excel 2016 Windows. Когда файл открывается и сохраняется на маке, весь...

Как из С# программно обработать Run-time error '1004' VBA кода книги Excel
Может кто подскажет, как программно в C# завершить работу макроса в книге Excel? Существует книга со встроенными макросами, которая...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
51
Ответ Создать тему
Новые блоги и статьи
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
Нашел вот забавное видео о измерениях. Лучшее что я видел на эту тему
kumehtar 26.08.2026
ILETXiw9bMQ Основная суть и тезисы по измерениям: 0D (Нулевое измерение): точка, не имеющая длины, ширины, высоты или объема. Объект не может перемещаться в 0D. 1D (Первое измерение):. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru