ADN Club > VBA
Видеоуроки AutoCAD VBA
Александр Корнев:
Не не не, я не про одновременную работу человека и программы из экселя. Есть файл эксель, у которого есть "лист 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."
Прочитаны не будут.
Александр Ривилис:
1. Прочитай у меня в подписи как следует форматировать код для форума и соблюдай это правило.
2. Почему не сделать так:
--- Код - Visual Basic [Выбрать] ---Dim WS1 As Excel.WorksheetDim WS2 As Excel.WorksheetDim WS3 As Excel.WorksheetSet WS1 = WB.Worksheets("Лист1")Set WS2 = WB.Worksheets("Лист2")Set WS3 = WB.Worksheets("Лист3")
?
Это конечно если листы 2 и 3 есть - если их нет, то их нужно предварительно создать.
Александр Корнев:
Я понял свою ошибку! Меня смутило то, что в уроке у нас один лист использовался и можно было опускать некоторую часть кода, а когда стало несколько листов, необходимо обращаться более полной командой:
я к ним обоим обращался:
--- Код - vb.net [Выбрать] ---Set WS1 = WB.Worksheets("Лист1")m1 = Cells(1, 1)Set WS2 = WB.Worksheets("Лист2")m2 = Cells(1, 1)
Ожидая, что переключение между листами происходит в этот момент:
--- Код - vb.net [Выбрать] ---Set WS2 = WB.Worksheets("Лист2")
А нужно было просто вначале объявить листы и затем полной командой обращаться к каждому из листов:
--- Код - vb.net [Выбрать] ---Set WS1 = WB.Worksheets("Лист1")Set WS2 = WB.Worksheets("Лист2")m1=WS1.Cells(1, 1)m2=WS2.Cells(1, 1)
Спасибо! Теперь все стало намного проще.)
sharypovroman:
--- Цитата: Максим Маркевич от 16-11-2016, 02:04:46 ---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 перебор элементов (блоков) происходил слева-направо или сверху-вниз? Насколько я понял, перебор элементов в данном коде происходит по тому, что раньше было создано в чертеже.
Александр Ривилис:
--- Цитата: sharypovroman от 16-06-2020, 15:01:53 ---Как сделать так, чтобы в SelectionSets перебор элементов (блоков) происходил слева-направо или сверху-вниз?
--- Конец цитаты ---
Это можно сделать единственным образом - получить их все и затем выполнить сортировку по их GetBoundingBox.
Или (так как там возможен ручной выбор) - выбирать по одному в том порядке, который нужен.
Навигация
Перейти к полной версии