Добавить в корзинуПозвонить
Найти в Дзене

Мои ошибки. Чего я раньше не делал, при написании макросов.

Почему именно VBA? Да, я изучаю и C#, и python, но есть нюанс) Не на всех работах и не во всех компаниях есть возможность на компьютере устанавливать свой софт и аддоны. Редактор VBA есть по умолчанию, код макроса не требует компиляции. Его можно сразу запускать. Я стараюсь не делать большие и сложные макросы - так мне проще быстро вносить изменения под новые задачи. Когда я только начинал, я не углублялся в теорию и оптимизацию. Я просто брал куски кода из интернета и пытался их как-то состыковать методом тыка. Мой макрос был похож на одну длинную портянку и через некоторое время я даже не мог понять что он делает. У меня он работал, я знал, что надо сделать перед запуском макроса. Но при передаче коллегам макрос мог глючить, не исполняться или еще что-то. Option Explicit 'обязательное декларирование переменных Dim swApp As SldWorks.SldWorks Dim swModel As SldWorks.ModelDoc2 Dim swPart As SldWorks.PartDoc Dim boolstatus As Boolean Dim longstatus As Long, longwarnings As Long Sub mai
Оглавление

Почему именно VBA? Да, я изучаю и C#, и python, но есть нюанс)

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

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

Когда я только начинал, я не углублялся в теорию и оптимизацию. Я просто брал куски кода из интернета и пытался их как-то состыковать методом тыка.

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

У меня он работал, я знал, что надо сделать перед запуском макроса. Но при передаче коллегам макрос мог глючить, не исполняться или еще что-то.

Что я делал нерационально или не делал вообще:

  • Непонятное название макроса, спустя время я не помнил что он делает.
  • Не комментировал строчки кода
  • Не объявлял название переменных и констант, теперь использую принудительное объявление переменных. Дублировал переменные из разных кусков кода.
  • Не проверял активность и тип документа (деталь/сборка/чертеж)
  • Не проверял наличие объектов, чтобы передать данные дальше
  • Редко делал "говорящий макрос": нет сообщений пользователю, не понятен статус выполнения, не записывается лог. Обычно использовал при отладке в редакторе Debug.Print
  • Писал все сплошняком, редко использовал функции и методы.
  • Не обрабатывал ошибки

Что я делал и продолжаю делать:

  • Тестирую на простых моделях
  • Использую хелп по API Solidworks
  • Использую встроенную запись макросов
  • Искал информацию в зарубежном интернете
  • Старался разобраться в скачанном макросе что и как он делает
  • Узнавал у коллег об их методах и алгоритмах работы в Solidworks
  • Теперь использую нейросети

Как бы я писал макрос сейчас (общая суть). Сам код (вставить в редактор):

Option Explicit 'обязательное декларирование переменных
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swPart As SldWorks.PartDoc
Dim boolstatus As Boolean
Dim longstatus As Long, longwarnings As Long
Sub main()
WriteToLog "Макрос запущен" ' Процедура записи лога
Set swApp = Application.SldWorks ' Подключаемся к активному экземпляру
Set swModel = swApp.ActiveDoc ' Получаем активный документ
If swModel Is Nothing Then ' Проверяем, открыт ли документ
'стандартный месседжбокс
MsgBox "Пожалуйста, откройте документ (деталь, сборку или чертеж)"
Exit Sub
End If
' Вариант. Если нет активного документа, создаем новый
'If swModel Is Nothing Then
' Set swModel = swApp.NewDocument("C:\ProgramData\SOLIDWORKS\SOLIDWORKS 2024\templates\gost-part.prtdot", 0, 0, 0) 'путь к шаблону детали
'End If
If swModel.GetType <> swDocPART Then ' проверяем, что это деталь, а не чертеж
MsgBox "Макрос предназначен только для деталей."
Exit Sub
End If
On Error GoTo ErrorHandler ' Обработка ошибок тупой вариант
'вот тут уже сам код основной
swApp.SendMsgToUser ("Тут что-то делается. Сейчас функцию выполним")
CreateSketch ("спереди") 'функция создания эскиза, задаем аргумент. Сама функция внизу
'еще код какой-то
' Завершение работы
swApp.SendMsgToUser ("Макрос успешно выполнен!") 'Солидовские сообщения 'SendMsgToUser2 более продвинутое
WriteToLog "Макрос успешно выполнен!"
Exit Sub
ErrorHandler:
' Обработка ошибок
MsgBox "Ошибка в макросе: " & Err.Description
WriteToLog "КРИТИЧЕСКАЯ ОШИБКА: " & Err.Number & " - " & Err.Description
End Sub
' Вспомогательные функции
Function CreateSketch(plane As String) As Sketch
' Код создания эскиза
MsgBox ("Тут эскиз делается")
End Function
'процедура пользователя, запись в лог файл
Sub WriteToLog(message As String)
Dim filePath As String
filePath = "C:\Users\user\Desktop\Log.txt" 'тут укажите путь где будет создаваться файл лога
Dim f As Integer
f = FreeFile()
Open filePath For Append As #f
Print #f, Now() & " : " & message
Close #f
End Sub

Не код)

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

Обычно 90% моих макросов не связаны с построением геометрии, а больше с работой в сборках, с деревом, со свойствами, взаимодействие с другими программами. Там, где нужно пакетное рутинное взаимодействие с компонентами и файлами.

Напишите в комментариях интересующие темы— разберём их в следующих постах.

#SolidWorks #VBA #Макросы #Автоматизация #Инженерия #Конструирование