А зачем здесь умножение на единицу?Код - Visual Basic [Выбрать]
prop.Value = Cells(1, 2) * 1
А зачем здесь умножение на единицу?Потому что Cells(1, 2) получено из Excel - это строка. А prop.Value не присвоишь строку в VBA.
Ох уж этот VBA. Не люблю я такого смешения типов. Я бы предпочел бы использовать Cdbl.Согласен с Вами. Мне тоже очень нравится та культура, которой сейчас меня учит C#.
Потому что Cells(1, 2) получено из Excel - это строка. А prop.Value не присвоишь строку в VBA.А если в ячейки не число? или не только число?
Можно было бы сделать так:Код - Visual Basic [Выбрать]
prop.Value = CDbl(Cells(1, 2))
или вот так:Код - Visual Basic [Выбрать]Или схитрить с умножением на единицу, как сделано в моем примере.
Dim buf As Double buf = Cells(1, 2) prop.Value = buf
Я бы рассказал о методике позднего связывания (вместо раннего, использованного в #2 и неявно указанного в #7, ее преимуществах и недостатках.Опять же я подумал, что лучше сделать вариант, который проще/понятнее.
А также методе отладки и вариантах написания кода.Думаю, до этого дойдет. Буду смотреть по откликам и запросам.
А если в ячейки не число? или не только число?Не ну Val() внутри CDbl() это совсем перестраховка. Ведь человек, который будет это делать ссылается на ячейку, в которой лежит число. Ну не будет там "43 яблока". Вполне можно было обойтись отдельно Val(), если уж на то пошло:
Стоило сразу нормально делать и парой комментариев все прояснить?
Вот по этому VBA и раздражает, пропустил пару команд, а интерпретатор там сам их допишет, по своему разумению конечно, и ищи где косяк вкрался, Хуже только в php...Но ведь именно поэтому с его и проще начинать, потому что он сам немножко додумает. Когда я сейчас перехожу на c# мне кажется, вот на это не обращал внимания, как так?? А потом вспоминаю и понимаю, что, если бы мне тогда пришлось обращать на это внимание, то было бы сложно и не совсем понятно.
Я думаю, что если в этой теме будет обсуждение уроков и предложение более оптимального кода - это будет очень полезно читающим тему и особенно новичкам в программировании.Так уже есть. :) А еще это заставит меня слишком серьезно подходить к записи следующих. :( :D
Я, конечно, прошу прощения, но lisp-код из #19 в русских версиях работать не будет: http://autolisp.ru/2010/03/04/localization/Так! Стоп. Если бы это была другая команда, то да, но не "vbarun".
Я, конечно, прошу прощения, но lisp-код из #19 в русских версиях работать не будет: http://autolisp.ru/2010/03/04/localization/Не проси прощения. VBARUN - он и по-русски VBARUN.
Поле "Макросы": ^C^C-vbarun;InsertBlock;Когда пользовался VBA, то свои макросы в память при старте не грузил, а вызывал по требованию, т.е на кнопку вешал что-то типа: ^C^C-vbarun "C:/VBA Macro/MyMacro.dvb!Module1.Example"
Когда пользовался VBA, то свои макросы в память при старте не грузил, а вызывал по требованию, т.е на кнопку вешал что-то типа: ^C^C-vbarun "C:/VBA Macro/MyMacro.dvb!Module1.Example"Согласен, плюс в том, что макрос не грузится в память при старте. Но вопрос, так ли это существенно?
Жду некоторого отклика, чтобы продолжить записывать уроки.Сейчас еще сезон отпусков. Да и лишь небольшой процент форумчан использует для разработки VBA (этот раздел на девятом месте по популярности). Так что отклик может быть не так быстро.
Сейчас еще сезон отпусков. Да и лишь небольшой процент форумчан использует для разработки VBA (этот раздел на девятом месте по популярности). Так что отклик может быть не так быстро.Ничего страшного, я и не тороплюсь.
Убеди начинающих программировать под AutoCAD, что из всех вариантов API и языков программирования им следует выбирать VBA.Согласен, пожалуй, следовало записать урок, почему следует начинать именно с VBA.
Ну и возможно в чем ты видишь его ограниченность - ведь не зря ты "мигрировал" на C# и AutoCAD .NET API.Про ограниченность VBA только если в видеоуроках по c#. ;)
Максим Маркевич, внести исправления в стартовый пост темы - укажи ссылку на обсуждение.Сделано. Попытался даже немного расклассифицировать, какие вопросы можно поднимать здесь, а какие там.
расскажи про AcFocusCtrl.dllЯ почти не работал с Windows Forms в VBA.
А что тебя, конкретно, интересует? Работа с немодальными окнами?Меня не интересует, просто там ещё то колдунство - новичкам будет полезно и выглядит эффектно
Я почти не работал с Windows Forms в VBA.Странно, по мне - быстрое создание формочек, одно из главных преимуществ VBA
Меня не интересует, просто там ещё то колдунство - новичкам будет полезно и выглядит эффектноМожем с тобой скооперироваться - сделать подобный урок. Если есть желание, то го в скайп/лс обсудим.
Странно, по мне - быстрое создание формочек, одно из главных преимуществ VBAЯ начал создавать окошки сразу при помощи WPF (уже в C#).
Максим Маркевич, спасибо что прикладываете код, а то видео на форуме не очень хорошего качества.На здоровье. Кстати, я не вижу разницы между форумом и ютубом:
Смотреть лучше в Youtube на Вашем канале. Успехов Вам в Вашем труде. Я Вам говорю СПАСИБО!Пожалуйста. Очень приятно!
На здоровье. Кстати, я не вижу разницы между форумом и ютубом:
Странно, по мне - быстрое создание формочек, одно из главных преимуществ VBAЯ правильно понял, что из кода VBA вызывается форма, сделанная в C# WPF, и затем данные введенные в той форме снова возвращаются в VBA?
Я начал создавать окошки сразу при помощи WPF (уже в C#).
Я правильно понял, что из кода VBA вызывается форма, сделанная в C# WPF, и затем данные введенные в той форме снова возвращаются в VBA?На здоровье. :)
Если пишешь на VBA, то и формочки нужно создавать в VBA, при помощи WinForms.Это понятно. Но Вы же понимаете, что формочки WinForms - это очень-очень жиденько по сравнению с WPF. Ситуация у меня такая. Было сделано окно в WPF для надстройки в Ревит. Но с Ревитом незаладилось - руководство охладело к этой затее. Возможно, данное приложение буду переделывать в VBA. Хочется использовать уже сделанную работу в части интерфейса. Повторить в WinForms невозможно. Может есть у кого какие-то решения такой проблемы?
Это понятно. Но Вы же понимаете, что формочки WinForms - это очень-очень жиденько по сравнению с WPF. Ситуация у меня такая. Было сделано окно в WPF для надстройки в Ревит. Но с Ревитом незаладилось - руководство охладело к этой затее. Возможно, данное приложение буду переделывать в VBA. Хочется использовать уже сделанную работу в части интерфейса. Повторить в WinForms невозможно. Может есть у кого какие-то решения такой проблемы?C# - решение твоей проблемы. Ну или VB.NET, что нежелательно, но проще после VBA.
C# - решение твоей проблемы. Ну или VB.NET, что нежелательно, но проще после VBA.Это понятно. Спасибо.
Ну вроде бы весь код открыт... Наверняка можно разобраться (просто я на VBA не пишу). Может быть, дело в настройках виртуального плоттера.Я немного знаю VBA но вот с автокадом совсем не знаком, все больше в екселе приходилось. Спасибо что подсказали направление поиска. Если вдруг кто-то сталкивался с этим вопросом буду благодарен за любую информацию.
17. AutoCAD VBA. Задачка для продвинутыхМаксим, добрый день. Вы привели прекрасный пример со вставкой блоков с атрибутами из Excel. Подскажите пожалуйста, как добавить в Ваш код VBA такой параметр как видимость динамического блока (понятно, что считывание будет происходить с того же файла Excel, где в отдельной колонке будут название "видимости" каждого вставляемого блока). Заранее благодарен за ответ.
Решение конкретной задачи, которая была сформулирована здесь.
Подскажите пожалуйста, как добавить в Ваш код VBA такой параметр как видимость динамического блока (понятно, что считывание будет происходить с того же файла Excel, где в отдельной колонке будут название "видимости" каждого вставляемого блока). Заранее благодарен за ответ.Посмотрите в районе 46-й строки указанного кода, посмотрите в отладчике какие значения есть у параметра видимости и все станет очевидно.
можно ли сделать связь между данными из Excel и AutoCAD для создания и управления таблицами свойств блока?зачем так сложно?
Из найденного видео я так понял, что это связь Autocad с Access?нет, любой ODBC (https://ru.wikipedia.org/wiki/ODBC)-совместимый источник данных, в том числе и Excel
В уроке на 3:27 присутствует фраза - "...первый аргумент это точка, но так как мы ее будем вводить путем прокликивания...", а если путем конкретной координаты как ?Её просто нужно задать или вычислить. Пример есть даже в документации: http://help.autodesk.com/view/OARX/2018/RUS/?guid=GUID-17F86FDD-B7FC-4F43-9F16-B4958F73A66D
16. AutoCAD VBA. Пакетная печать блоков-форматов
Разобран 3-й из выделенных мной способов (пакетная печать блоков). Весь нюанс состоит в "зацикливании" печати.
Код - Visual Basic [Выбрать]
' 3. Пакетная печать конкретных блоков-форматов
Sub PlotByBlocks()
Dim objEnt As AcadEntity
Dim objBRef As AcadBlockReference
Dim pt1 As Variant
Dim pt2(0 To 1) As Double
Dim i As Integer
' Создаем выбор рамкой
On Error Resume Next
ThisDrawing.SelectionSets("SS").Delete
Set ss = ThisDrawing.SelectionSets.Add("SS")
ss.SelectOnScreen
' Работаем, если имя блока А1
i = 0
For Each objEnt In ss
If objEnt.ObjectName = "AcDbBlockReference" Then
Set objBRef = objEnt
If objBRef.EffectiveName = "A1" Then
pt1 = objBRef.insertionPoint
pt1 = ThisDrawing.Utility.TranslateCoordinates(pt1, acWorld, acDisplayDCS, False)
ReDim Preserve pt1(0 To 1)
pt2(0) = pt1(0) + 841
pt2(1) = pt1(1) + 594
i = i + 1
PolyPlot "c:\Users\evthi\Desktop\Тест" + CStr(i), pt1, pt2
End If
End If
Next
End Sub
Sub PolyPlot(strFileName As String, pt1 As Variant, pt2 As Variant)
' Декларируем
Dim Layout As AcadLayout
' Устанавливаем
Set Layout = ThisDrawing.ActiveLayout
Layout.RefreshPlotDeviceInfo
' Настройка печати
Layout.ConfigName = "DWG to PDF.pc3"
Layout.CanonicalMediaName = "ISO_full_bleed_A1_(594.00_x_841.00_MM)"
Layout.CenterPlot = True
Layout.PlotRotation = ac90degrees
Layout.StandardScale = acScaleToFit
Layout.StyleSheet = "acad.ctb"
' Устанавливаем рамки и тип окошка
Layout.SetWindowToPlot pt1, pt2
Layout.PlotType = acWindow
' Отправляем на печать
ThisDrawing.Regen acAllViewports
ThisDrawing.Plot.PlotToFile strFileName
End Sub
Как сделать так, чтобы в SelectionSets перебор элементов (блоков) происходил слева-направо или сверху-вниз?Это можно сделать единственным образом - получить их все и затем выполнить сортировку по их GetBoundingBox.