Загрузка данных



Option Explicit

Sub PrintWithIncrementingNumber()

    Dim ws As Worksheet
    Dim cellNumber As Range
    Dim sheetList As String
    Dim sheetName As String
    Dim startNum As Variant
    Dim endNum As Variant
    Dim i As Long
    Dim sh As Worksheet
    Dim oldCalc As XlCalculation
    Dim printCount As Long

    ' Формирование списка листов
    For Each sh In ThisWorkbook.Worksheets
        sheetList = sheetList & sh.Name & vbCrLf
    Next sh

    ' Выбор листа
    sheetName = InputBox( _
        "Введите название листа для печати:" & vbCrLf & vbCrLf & _
        sheetList, _
        "Выбор листа")

    If sheetName = "" Then Exit Sub

    On Error Resume Next
    Set ws = ThisWorkbook.Worksheets(sheetName)
    On Error GoTo 0

    If ws Is Nothing Then
        MsgBox "Лист с таким названием не найден.", vbExclamation
        Exit Sub
    End If

    ' Начальный номер
    startNum = Application.InputBox( _
        "Введите начальный номер:", _
        "Нумерация печати", 1, Type:=1)

    If VarType(startNum) = vbBoolean Then Exit Sub

    If startNum < 1 Or startNum <> Fix(startNum) Then
        MsgBox "Введите целый начальный номер больше нуля."
        Exit Sub
    End If

    ' Конечный номер
    endNum = Application.InputBox( _
        "Введите конечный номер:", _
        "Нумерация печати", 10, Type:=1)

    If VarType(endNum) = vbBoolean Then Exit Sub

    If endNum < startNum Or endNum <> Fix(endNum) Then
        MsgBox "Конечный номер должен быть не меньше начального."
        Exit Sub
    End If

    ' Ячейка с номером
    Set cellNumber = ws.Range("X3")

    ' Подтверждение
    If MsgBox( _
        "Лист: " & ws.Name & vbCrLf & _
        "Начальный номер: " & startNum & vbCrLf & _
        "Конечный номер: " & endNum & vbCrLf & _
        "Количество экземпляров: " & _
        (endNum - startNum + 1) & vbCrLf & vbCrLf & _
        "Начать печать?", _
        vbYesNo + vbQuestion, "Подтверждение печати") <> vbYes Then
        Exit Sub
    End If

    oldCalc = Application.Calculation
    On Error GoTo PrintError

    Application.ScreenUpdating = False
    Application.Calculation = xlCalculationAutomatic

    For i = CLng(startNum) To CLng(endNum)

        cellNumber.Value = i

        ' Пересчёт формул всей книги
        Application.CalculateFull

        Do While Application.CalculationState <> xlDone
            DoEvents
        Loop

        ' Печать выбранного листа
        ws.PrintOut Copies:=1

        printCount = printCount + 1

    Next i

    Application.Calculation = oldCalc
    Application.ScreenUpdating = True

    MsgBox "Печать завершена!" & vbCrLf & _
           "Лист: " & ws.Name & vbCrLf & _
           "Напечатано экземпляров: " & printCount, _
           vbInformation

    Exit Sub

PrintError:

    Application.Calculation = oldCalc
    Application.ScreenUpdating = True

    MsgBox "Ошибка: " & Err.Description & vbCrLf & _
           "Отправлено на печать: " & printCount, vbCritical

End Sub