Видеоуроки AutoCAD VBA

Автор Тема: Видеоуроки AutoCAD VBA  (Прочитано 178943 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Александр Корнев

  • ADN OPEN
  • Сообщений: 4
  • Карма: 0
Re: Видеоуроки AutoCAD VBA
« Ответ #90 : 08-06-2020, 06:37:27 »
Не не не, я не про одновременную работу человека и программы из экселя. Есть файл эксель, у которого есть "лист 1" из которого мы читаем значения из ячеек при помощи VBA, есть "лист 2" из которого нам тоже нужно читать значения.
Почему-то, даже с учетом того, что мы объявляем в начале программы конкретный лист, с которым мы будем работать т.е. "лист 1", то программа смотрит только тот лист, который был открыт при сохранении и закрытии.
Я это представлял таким образом:

Объявляем Set WS = WB.Worksheets("Лист1")
читаем переменные из Листа 1.
Set WS = WB.Worksheets("Лист2")
Читаем переменные из Листа 2
Set WS = WB.Worksheets("Лист3")
Записываем какие-то результаты на Лист 3.


А фактически получается обмениваться данными только с тем листом, который был выбран и сохранен перед закрытием файла эксель.
Таким образом выбрали в экселе Лист 2 -> нажали кнопку сохранить-> закрыли эксель.
В результате программа прочитает только :
"Set WS = WB.Worksheets("Лист2")
Читаем переменные из Листа 2"

А переменные из этих листов:
"Объявляем Set WS = WB.Worksheets("Лист1")
читаем переменные из Листа 1.
Set WS = WB.Worksheets("Лист3")
Записываем какие-то результаты на Лист 3."
Прочитаны не будут.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13886
  • Карма: 1788
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Видеоуроки AutoCAD VBA
« Ответ #91 : 08-06-2020, 13:52:52 »
1. Прочитай у меня в подписи как следует форматировать код для форума и соблюдай это правило.
2. Почему не сделать так:
Код - Visual Basic [Выбрать]
  1. Dim WS1 As Excel.Worksheet
  2. Dim WS2 As Excel.Worksheet
  3. Dim WS3 As Excel.Worksheet
  4. Set WS1 = WB.Worksheets("Лист1")
  5. Set WS2 = WB.Worksheets("Лист2")
  6. Set WS3 = WB.Worksheets("Лист3")

?

Это конечно если листы 2 и 3 есть - если их нет, то их нужно предварительно создать.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Александр Корнев

  • ADN OPEN
  • Сообщений: 4
  • Карма: 0
Re: Видеоуроки AutoCAD VBA
« Ответ #92 : 08-06-2020, 14:38:21 »
Я понял свою ошибку! Меня смутило то, что в уроке у нас один лист использовался и можно было опускать некоторую часть кода, а когда стало несколько листов, необходимо обращаться более полной командой:

я к ним обоим обращался:
Код - vb.net [Выбрать]
  1. Set WS1 = WB.Worksheets("Лист1")
  2. m1 = Cells(1, 1)
  3. Set WS2 = WB.Worksheets("Лист2")
  4. m2 = Cells(1, 1)

Ожидая, что переключение между листами происходит в этот момент:
Код - vb.net [Выбрать]
  1. Set WS2 = WB.Worksheets("Лист2")

А нужно было просто вначале объявить листы и затем полной командой обращаться к каждому из листов:

Код - vb.net [Выбрать]
  1. Set WS1 = WB.Worksheets("Лист1")
  2. Set WS2 = WB.Worksheets("Лист2")
  3. m1=WS1.Cells(1, 1)
  4. m2=WS2.Cells(1, 1)

Спасибо! Теперь все стало намного проще.)

Оффлайн sharypovroman

  • ADN OPEN
  • Сообщений: 1
  • Карма: 0
Re: Видеоуроки AutoCAD VBA
« Ответ #93 : 16-06-2020, 15:01:53 »
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 перебор элементов (блоков) происходил слева-направо или сверху-вниз? Насколько я понял, перебор элементов в данном коде происходит по тому, что раньше было создано в чертеже.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13886
  • Карма: 1788
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Видеоуроки AutoCAD VBA
« Ответ #94 : 16-06-2020, 15:06:45 »
Как сделать так, чтобы в SelectionSets перебор элементов (блоков) происходил слева-направо или сверху-вниз?
Это можно сделать единственным образом - получить их все и затем выполнить сортировку по их GetBoundingBox.
Или (так как там возможен ручной выбор) - выбирать по одному в том порядке, который нужен.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение