Здравствуйте. Необходимо в данном макросе изменить условие.В ListBox1 выводить листы в которых ячейка А1="НАРЯД...". Для печати выбранного листа нужно вказать диапазоны (как на кнопках).А из листа "АКТ" подтянуть страницу соответствующую выбранному листу (Если лист"11" - из листа "АКТ" диапазон А1:М45) (Если лист"22" - из листа "АКТ" диапазон А46:М90) и т.д. Мне это не под силу .Если не сложно - помогите!
[вложение удалено администратором]
Amator, большие задачи не рассматриваются на форуме.
Форум создан для обсуждения небольших вопросов.
Разбивайте Вашу задачу на части и создавайте тему по этой части.
Как изменить условие.В ListBox1 выводить листы в которых ячейка А1="НАРЯД..."
Private Sub CommandButton1_Click()
Dim shMy As Excel.Worksheet
For Each shMy In Worksheets
If shMy.Range("A1").Value = "НАРЯД" Then
Me.ListBox1.AddItem shMy.Name
End If
Next shMy
End Sub
Спасибо! А еще подскажите как в этот код прописать диапазон для печати (А1:Р35)?
Private Sub CommandButton2_Click()
Dim iloop As Integer
For iloop = 1 To ListBox1.ListCount
If ListBox1.Selected(iloop - 1) = True Then
Sheets(ListBox1.List(iloop - 1, 0)).PrintOut Copies:=TextBox1.Value
ListBox1.Selected(iloop - 1) = False
End If
Next
Unload Me
End Sub
Amator, метод "PrintOut" есть у нескольких объектов. Чтобы посмотреть, у каких объектов есть метод "PrintOut", в VBA, в справке используйте для поиска слово "PrintOut". Вы увидите, что "PrintOut" есть у нескольких объектов, например у Workbook, Worksheets.
Попробуйте использовать метод "PrintOut" для объекта "Range", например:
Sub Макрос1()
'Распечатка ячейки "A1" из первого листа в одном экземпляре.
Worksheets(1).Range("A1").PrintOut Copies:=1
End Sub
Здравствуйте! С Вашей помощью , с двумя первыми заданиями я справился.Как из листа "АКТ" подтянуть соответствующую страницу .Задумка такова: если имя выбранного листа в ListBox1 = ячейке М20 листа "АКТ" то по нажатию CommandButton4 печатать именованный диапазон (Акт_1).
если имя выбранного листа в ListBox1 = ячейке М65 листа "АКТ" то по нажатию CommandButton4 печатать именованный диапазон (Акт_2). Как это реализовать?
[вложение удалено администратором]
Amator, а если пользователь выбрал в ListBox два флажка и оба соответствуют Вашим условиям, что тогда печатать?
печатать оба.
Макрос не тестировал, поэтому может быть какая-нибудь ошибка.
Private Sub CommandButton4_Click()
Dim shAkt As Excel.Worksheet
Dim i As Long
'VBA-наиманование нужного листа, чтобы было удобно делать макрос.
Set shAkt = Worksheets("АКТ")
'Просмотр всех строк в листбоксе.
For i = 0 To Me.ListBox1.ListCount - 1 Step 1
'Если в строке есть флажок.
If Me.ListBox1.Selected(i) = True Then
If Me.ListBox1.List(i, 0) = shAkt.Range("M20").Value Then
shAkt.Range("Акт_1").PrintOut
ElseIf Me.ListBox1.List(i, 0) = shAkt.Range("M65").Value Then
shAkt.Range("Акт_2").PrintOut
End If
End If
Next i
End Sub
Не работает.
[вложение удалено администратором]
Amator, на этом Форуме не рассматриваются большие задания.
Чтобы проверить работу макроса, мне надо изучить Ваш файл и макросы - это сложно.
А как протестировать макрос Private Sub CommandButton4_Click() на работоспособность?
Amator, создайте новый Excel-файл, сделайте в нём форму, на которой будут только необходимые элементы управления, выложите этот файл на Форуме.
Создал файл...
[вложение удалено администратором]
Amator, да была ошибка. Обычно VBA сам приводит числа к одному виду и сравнивает, но почему-то с ListBox это не работает.
Правильный код такой:
Private Sub CommandButton4_Click()
Dim shAkt As Excel.Worksheet
Dim i As Long
'VBA-наиманование нужного листа, чтобы было удобно делать макрос.
Set shAkt = Worksheets("АКТ")
'Просмотр всех строк в листбоксе.
For i = 0 To Me.ListBox1.ListCount - 1 Step 1
'Если в строке есть флажок.
If Me.ListBox1.Selected(i) = True Then
'CStr - для перевода чисел в тип данных "Текст",
'чтобы можно было сравнить текст в ListBox,
'в котором числа представлены текстом.
If Me.ListBox1.List(i, 0) = CStr(shAkt.Range("M20").Value) Then
shAkt.Range("Акт_1").PrintOut Copies:=TextBox1.Value
ElseIf Me.ListBox1.List(i, 0) = CStr(shAkt.Range("M65").Value) Then
shAkt.Range("Акт_2").PrintOut Copies:=TextBox1.Value
End If
End If
Next i
End Sub
Спасибо ! И еще вопрос : можно- ли этот код написать с цыклом, так как в листе "АКТ" есть 15 именованных диапазонов (Акт_1 по Акт_15). Ячека для условия М20 ;М65 (шаг 45).
В коде, в строке:
For i = 20 To 65 Step 45
после "To" укажите номер последней строки, до которой должен макрос анализировать лист "АКТ".
Макрос
Private Sub CommandButton4_Click()
Dim shAkt As Excel.Worksheet
Dim i As Long, j As Long, k As Long
'VBA-наиманование нужного листа, чтобы было удобно делать макрос.
Set shAkt = Worksheets("АКТ")
'В цикле с "i" движение по листу "АКТ" со строки 20, с шагом 45.
For i = 20 To 65 Step 45
'Переменная "k" для перехода по диапазонам "Акт_".
k = k + 1
'Просмотр всех строк в листбоксе.
For j = 0 To Me.ListBox1.ListCount - 1 Step 1
'Если в строке есть флажок.
If Me.ListBox1.Selected(j) = True Then
'CStr - для перевода чисел в тип данных "Текст",
'чтобы можно было сравнить текст в ListBox,
'в котором числа представлены текстом.
If Me.ListBox1.List(j, 0) = CStr(shAkt.Range("M" & i).Value) Then
shAkt.Range("Акт_" & k).PrintOut Copies:=TextBox1.Value
End If
End If
Next j
Next i
End Sub
Спасибо, все работает.