Как использовать циклы For/Next для печати диапазона на основе состояния флажка

У меня возникли проблемы с составлением кода, который позволяет мне просматривать состояние флажка и печатать указанный диапазон на другом листе, если флажок равен true, а затем повторять этот цикл для заданного количества флажков и диапазонов.

Я использую два разных цикла For-Next, чтобы попытаться выполнить эту задачу. Ниже мой текущий код.

Sub PrintGraphs()
Dim i As Integer
Dim r As Integer
    For i = 16 To 18
        If ActiveSheet.OLEObjects("CheckBox" & i).Object.Value = True Then
            For r = 1 To 3
                Worksheets("Cut Tables Graphs").Activate
                    Range("RangeSet" & r).Select
                    ActiveSheet.PageSetup.PrintArea = ("RangeSet" & r)
                    With ActiveSheet.PageSetup
                        .PaperSize = xlPaperLetter
                        .Orientation = xlLandscape
                        .Zoom = False
                        .FitToPagesWide = 1
                        .FitToPagesTall = 1
                        .LeftMargin = Application.InchesToPoints(0.25)
                        .RightMargin = Application.InchesToPoints(0.25)
                        .TopMargin = Application.InchesToPoints(0.25)
                        .BottomMargin = Application.InchesToPoints(0.25)
                        .CenterHorizontally = True
                        .CenterVertically = True
                    End With
                    Application.PrintCommunication = True
                    Selection.PrintOut Copies:=1, Collate:=True
            Next r
        End If
    Next i
End Sub

Я также использую общедоступные константы в отдельном модуле для определения переменной RangeSet. Код этого модуля выглядит следующим образом.

Public Const RangeSet1 = "B2:U51"
Public Const RangeSet2 = "W2:AP51"
Public Const RangeSet3 = "B53:U102"

Я хочу, чтобы мой код смотрел на флажки с 16 по 18, а затем печатал соответствующий диапазон в значении флажка, равном true.

Желаемый результат:

Если флажок #16 равен true, то выведите диапазон "B2:U51", иначе Next i

Если флажок #17 равен true, то выведите диапазон "W2:AP51", иначе Next i

Если флажок #18 равен true, то выведите диапазон "B53:U102", иначе End Loop

В настоящее время я получаю следующую ошибку: Ошибка времени выполнения «1004»: Исключение было вызвано целью вызова в строке, содержащей «Range («RangeSet» & r). Select

Любая помощь в поиске решения этой проблемы будет принята с благодарностью. Заранее спасибо.


person Johnson H.    schedule 04.06.2015    source источник


Ответы (3)


Я чувствую, что самым простым подходом было бы создание массива со значениями, которые вы хотите записать. После того, как вы заполнили массив, вы можете распечатать его в любом месте, используя цикл for.

person Aldo Sanchez    schedule 04.06.2015
comment
Я новичок в Excel VBA, не могли бы вы уточнить свой комментарий или привести пример, который я мог бы перепроектировать. - person Johnson H.; 04.06.2015

Range("RangeSet" & r).Select

Недопустимый диапазон в VBA. вы передадите ему «RangeSet1», как в строке, а не в диапазоне или переменной, которую вы объявили.

мог бы попробовать

if r = 1 then
     Range(RangeSet1).Select
elseif r=2 then
     Range(RangeSet2).Select
elseif r=3 then
     Range(RangeSet3).Select
else
    stop'should never get here?
endif

есть способ сделать это одной строкой кода, но я не могу вспомнить его синтаксис.

person 99moorem    schedule 04.06.2015
comment
В одной строке кода это должно иметь тот же результат: Range(Choose(r, RangeSet1, RangeSet2, RangeSet3)).Select - person Darren Bartrup-Cook; 04.06.2015
comment
Мне удалось реализовать одну строку кода для выбора переменной r, но она не привязывает выбор для r обратно к выбору соответствующей переменной i. Кажется, просто печатаются все диапазоны для переменной r. Например, если только флажок 17 = true, а 16 и 18 = false, он по-прежнему печатает все три диапазона, а не только диапазон для флажка 17. @DarrenBartrup-Cook - person Johnson H.; 04.06.2015
comment
Мне удалось получить код для распечатки правильных диапазонов, в зависимости от того, какой флажок установлен с помощью «Если i = 16, то r = 1/иначе, если i = 17, тогда r = 2/иначе, если i = 18, тогда r = 3/ End If», а также код «(Choose(r, RangeSet1, RangeSet2, RangeSet3)». Если последний флажок не установлен, мне выдается следующая ошибка: Ошибка выполнения «1004»: невозможно получить свойство OLEObject класса Wroksheet.Если установлен последний флажок, я не получаю сообщение об ошибке.Есть мысли о том, что может быть причиной этого?? - person Johnson H.; 04.06.2015
comment
С моим кодом выше вы должны просто заменить Range(RangeSet & r). Выберите мой пример, остальная часть кода должна работать нормально. Если вы хотите, вы можете изменить r = 1, чтобы установить флажок # 16.checked = true и т. д. - person 99moorem; 05.06.2015

Вот как бы я написал код

Sub PrintGraphs()

    Dim i As Integer

    With ThisWorkbook.Worksheets("Cut Tables Graphs")
        With .PageSetup
            .PaperSize = xlPaperLetter
            .Orientation = xlLandscape
            .Zoom = False
            .FitToPagesWide = 1
            .FitToPagesTall = 1
            .LeftMargin = Application.InchesToPoints(0.25)
            .RightMargin = Application.InchesToPoints(0.25)
            .TopMargin = Application.InchesToPoints(0.25)
            .BottomMargin = Application.InchesToPoints(0.25)
            .CenterHorizontally = True
            .CenterVertically = True
        End With
        Application.PrintCommunication = True
        For i = 16 To 18
            If .OLEObjects("CheckBox" & i).Object.Value = True Then

                .Range(Choose(i - 15, RangeSet1, RangeSet2, RangeSet3)).PrintOut Copies:=1, Collate:=True

            End If
        Next i
    End With

End Sub

Нет необходимости в переменной r — если вы выберете CheckBox16, вы хотите напечатать диапазон 1 — поэтому удалите 15 из i, и вы получите 1 — выберите этот диапазон (надеюсь, это имело смысл).

Я также предполагаю, что «ActiveSheet» (тот, что с флажками) — это «Cut Tables Graphs».

Я включил ваш исходный код внизу с некоторыми комментариями.

Sub PrintGraphs()
Dim i As Integer
Dim r As Integer
    'This will work - providing the correct sheet is active.
    For i = 16 To 18
        If ActiveSheet.OLEObjects("CheckBox" & i).Object.Value = True Then

            'This will cycle through all three no matter which checkbox was ticked.
            For r = 1 To 3

                'No need to activate the sheet.  Especially if it's the ActiveSheet.
                Worksheets("Cut Tables Graphs").Activate

                    'No need to select a range before working on it.
                    Range("RangeSet" & r).Select

                    'This only needs doing once - not at all if it's the default anyway.
                    'As it's inside the 1 to 3 loop it will happen 3 times.
                    ActiveSheet.PageSetup.PrintArea = ("RangeSet" & r)
                    With ActiveSheet.PageSetup
                        .PaperSize = xlPaperLetter
                        .Orientation = xlLandscape
                        .Zoom = False
                        .FitToPagesWide = 1
                        .FitToPagesTall = 1
                        .LeftMargin = Application.InchesToPoints(0.25)
                        .RightMargin = Application.InchesToPoints(0.25)
                        .TopMargin = Application.InchesToPoints(0.25)
                        .BottomMargin = Application.InchesToPoints(0.25)
                        .CenterHorizontally = True
                        .CenterVertically = True
                    End With
                    Application.PrintCommunication = True

                    'Rather than select the range and print the selection,
                    'just reference the range and print it.
                    Selection.PrintOut Copies:=1, Collate:=True
            Next r
        End If
    Next i
End Sub
person Darren Bartrup-Cook    schedule 05.06.2015