Форум по VBA, Excel и Word

VBA, Excel => VBA, макросы в Excel => Тема начата: Amator от 22 апреля 2014, 14:59

Название: Печать листов из формы
Отправлено: Amator от 22 апреля 2014, 14:59
Здравствуйте. Необходимо в данном макросе изменить условие.В ListBox1 выводить листы  в которых ячейка А1="НАРЯД...". Для печати выбранного листа нужно вказать диапазоны (как на кнопках).А из листа "АКТ" подтянуть страницу соответствующую выбранному листу (Если лист"11" - из листа "АКТ" диапазон А1:М45)  (Если лист"22" - из листа "АКТ" диапазон А46:М90) и т.д.  Мне это не под силу .Если не сложно - помогите!

[вложение удалено администратором]
Название: Re: Печать листов из формы
Отправлено: Администратор от 22 апреля 2014, 15:13
Amator, большие задачи не рассматриваются на форуме.
Форум создан для обсуждения небольших вопросов.

Разбивайте Вашу задачу на части и создавайте тему по этой части.
Название: Re: Печать листов из формы
Отправлено: Amator от 22 апреля 2014, 15:18
 Как изменить условие.В ListBox1 выводить листы  в которых ячейка А1="НАРЯД..."
Название: Re: Печать листов из формы
Отправлено: Администратор от 22 апреля 2014, 15:35
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
Название: Re: Печать листов из формы
Отправлено: Amator от 22 апреля 2014, 16:26
Спасибо! А еще подскажите как в этот код прописать диапазон для печати (А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
Название: Re: Печать листов из формы
Отправлено: Администратор от 22 апреля 2014, 16:44
Amator, метод "PrintOut" есть у нескольких объектов. Чтобы посмотреть, у каких объектов есть метод "PrintOut", в VBA, в справке используйте для поиска слово "PrintOut". Вы увидите, что "PrintOut" есть у нескольких объектов, например у Workbook, Worksheets.

Попробуйте использовать метод "PrintOut" для объекта "Range", например:

Sub Макрос1()

    'Распечатка ячейки "A1" из первого листа в одном экземпляре.
    Worksheets(1).Range("A1").PrintOut Copies:=1
   
End Sub
Название: Re: Печать листов из формы
Отправлено: Amator от 23 апреля 2014, 18:49
Здравствуйте! С Вашей помощью , с двумя первыми заданиями я справился.Как из листа "АКТ" подтянуть соответствующую страницу .Задумка такова:     если имя выбранного листа в  ListBox1 = ячейке М20 листа "АКТ" то по нажатию CommandButton4 печатать именованный диапазон (Акт_1).
        если имя выбранного листа в  ListBox1 = ячейке М65 листа "АКТ" то по нажатию CommandButton4 печатать именованный диапазон (Акт_2).  Как это реализовать?


[вложение удалено администратором]
Название: Re: Печать листов из формы
Отправлено: Администратор от 23 апреля 2014, 18:57
Amator, а если пользователь выбрал в ListBox два флажка и оба соответствуют Вашим условиям, что тогда печатать?
Название: Re: Печать листов из формы
Отправлено: Amator от 23 апреля 2014, 19:00
печатать оба.
Название: Re: Печать листов из формы
Отправлено: Администратор от 23 апреля 2014, 19:10
Макрос не тестировал, поэтому может быть какая-нибудь ошибка.

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
Название: Re: Печать листов из формы
Отправлено: Amator от 23 апреля 2014, 19:22
Не работает.

[вложение удалено администратором]
Название: Re: Печать листов из формы
Отправлено: Администратор от 23 апреля 2014, 19:41
Amator, на этом Форуме не рассматриваются большие задания.
Чтобы проверить работу макроса, мне надо изучить Ваш файл и макросы - это сложно.
Название: Re: Печать листов из формы
Отправлено: Amator от 23 апреля 2014, 19:49
А как протестировать макрос  Private Sub CommandButton4_Click() на работоспособность?
Название: Re: Печать листов из формы
Отправлено: Администратор от 23 апреля 2014, 19:56
Amator, создайте новый Excel-файл, сделайте в нём форму, на которой будут только необходимые элементы управления, выложите этот файл на Форуме.
Название: Re: Печать листов из формы
Отправлено: Amator от 23 апреля 2014, 20:31
Создал файл...

[вложение удалено администратором]
Название: Re: Печать листов из формы
Отправлено: Администратор от 23 апреля 2014, 20:38
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
Название: Re: Печать листов из формы
Отправлено: Amator от 23 апреля 2014, 20:52
Спасибо ! И еще вопрос : можно- ли этот код написать с цыклом, так как в листе "АКТ" есть 15 именованных диапазонов (Акт_1  по  Акт_15). Ячека для условия М20 ;М65 (шаг 45).
Название: Re: Печать листов из формы
Отправлено: Администратор от 23 апреля 2014, 21:07
В коде, в строке:
    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
[свернуть]
Название: Re: Печать листов из формы
Отправлено: Amator от 23 апреля 2014, 21:17
Спасибо, все работает.