B
Breck
I found this code at http://www.j-walk.com/ss/excel/tips/tip48.htm and
it is almost perfect for my needs. I would like to add just one
option. I would like to add a spinbox or some other way to choose the
number of pages to print. The default is just 1
(ActiveWindow.SelectedSheets.PrintOut copies:=1). I would like to be
able to choose the number or pages printed. I probabaly don't need
more that 10.
What would be really cool if the code could be modified so the number
of pages could be a different number for each sheet that has a
checkbox in the dialog box. If that is just too difficult to do then
just a single choice would be find.
Any help or suggestions would be greatly appreciated
Although this procedure uses an Excel 5/95 Dialog Sheet, it will also
work with later versions of Excel. By the way, this is a rare example
of how using a Dialog Sheet is easier than using a UserForm. Creating
a UserForm on the fly is much more difficult (but it is possible --
click here for an example).
Using the code
To try out the example, copy the code below and paste it to a VBA
module (there is no need to add a dialog sheet). Then execute the
SelectSheets subroutine.
The SelectSheets subroutine
Option Explicit
Sub SelectSheets()
Dim i As Integer
Dim TopPos As Integer
Dim SheetCount As Integer
Dim PrintDlg As DialogSheet
Dim CurrentSheet As Worksheet
Dim cb As CheckBox
Application.ScreenUpdating = False
' Check for protected workbook
If ActiveWorkbook.ProtectStructure Then
MsgBox "Workbook is protected.", vbCritical
Exit Sub
End If
' Add a temporary dialog sheet
Set CurrentSheet = ActiveSheet
Set PrintDlg = ActiveWorkbook.DialogSheets.Add
SheetCount = 0
' Add the checkboxes
TopPos = 40
For i = 1 To ActiveWorkbook.Worksheets.Count
Set CurrentSheet = ActiveWorkbook.Worksheets(i)
' Skip empty sheets and hidden sheets
If Application.CountA(CurrentSheet.Cells) <> 0 And _
CurrentSheet.Visible Then
SheetCount = SheetCount + 1
PrintDlg.CheckBoxes.Add 78, TopPos, 150, 16.5
PrintDlg.CheckBoxes(SheetCount).Text = _
CurrentSheet.Name
TopPos = TopPos + 13
End If
Next i
' Move the OK and Cancel buttons
PrintDlg.Buttons.Left = 240
' Set dialog height, width, and caption
With PrintDlg.DialogFrame
.Height = Application.Max _
(68, PrintDlg.DialogFrame.Top + TopPos - 34)
.Width = 230
.Caption = "Select sheets to print"
End With
' Change tab order of OK and Cancel buttons
' so the 1st option button will have the focus
PrintDlg.Buttons("Button 2").BringToFront
PrintDlg.Buttons("Button 3").BringToFront
' Display the dialog box
CurrentSheet.Activate
Application.ScreenUpdating = True
If SheetCount <> 0 Then
If PrintDlg.Show Then
For Each cb In PrintDlg.CheckBoxes
If cb.Value = xlOn Then
Worksheets(cb.Caption).Activate
ActiveSheet.PrintOut
' ActiveSheet.PrintPreview 'for debugging
End If
Next cb
End If
Else
MsgBox "All worksheets are empty."
End If
' Delete temporary dialog sheet (without a warning)
Application.DisplayAlerts = False
PrintDlg.Delete
' Reactivate original sheet
CurrentSheet.Activate
End Sub
NOTE: Aaron Blood suggested the following modification, which prints
the selected sheets as a single print job. This allows the sheet to be
printed with continuous page numbers.
If PrintDlg.Show Then
For Each cb In PrintDlg.CheckBoxes
If cb.Value = xlOn Then
Worksheets(cb.Caption).Select Replace:=False
End If
Next cb
ActiveWindow.SelectedSheets.PrintOut copies:=1
ActiveSheet.Select
End If
it is almost perfect for my needs. I would like to add just one
option. I would like to add a spinbox or some other way to choose the
number of pages to print. The default is just 1
(ActiveWindow.SelectedSheets.PrintOut copies:=1). I would like to be
able to choose the number or pages printed. I probabaly don't need
more that 10.
What would be really cool if the code could be modified so the number
of pages could be a different number for each sheet that has a
checkbox in the dialog box. If that is just too difficult to do then
just a single choice would be find.
Any help or suggestions would be greatly appreciated
Although this procedure uses an Excel 5/95 Dialog Sheet, it will also
work with later versions of Excel. By the way, this is a rare example
of how using a Dialog Sheet is easier than using a UserForm. Creating
a UserForm on the fly is much more difficult (but it is possible --
click here for an example).
Using the code
To try out the example, copy the code below and paste it to a VBA
module (there is no need to add a dialog sheet). Then execute the
SelectSheets subroutine.
The SelectSheets subroutine
Option Explicit
Sub SelectSheets()
Dim i As Integer
Dim TopPos As Integer
Dim SheetCount As Integer
Dim PrintDlg As DialogSheet
Dim CurrentSheet As Worksheet
Dim cb As CheckBox
Application.ScreenUpdating = False
' Check for protected workbook
If ActiveWorkbook.ProtectStructure Then
MsgBox "Workbook is protected.", vbCritical
Exit Sub
End If
' Add a temporary dialog sheet
Set CurrentSheet = ActiveSheet
Set PrintDlg = ActiveWorkbook.DialogSheets.Add
SheetCount = 0
' Add the checkboxes
TopPos = 40
For i = 1 To ActiveWorkbook.Worksheets.Count
Set CurrentSheet = ActiveWorkbook.Worksheets(i)
' Skip empty sheets and hidden sheets
If Application.CountA(CurrentSheet.Cells) <> 0 And _
CurrentSheet.Visible Then
SheetCount = SheetCount + 1
PrintDlg.CheckBoxes.Add 78, TopPos, 150, 16.5
PrintDlg.CheckBoxes(SheetCount).Text = _
CurrentSheet.Name
TopPos = TopPos + 13
End If
Next i
' Move the OK and Cancel buttons
PrintDlg.Buttons.Left = 240
' Set dialog height, width, and caption
With PrintDlg.DialogFrame
.Height = Application.Max _
(68, PrintDlg.DialogFrame.Top + TopPos - 34)
.Width = 230
.Caption = "Select sheets to print"
End With
' Change tab order of OK and Cancel buttons
' so the 1st option button will have the focus
PrintDlg.Buttons("Button 2").BringToFront
PrintDlg.Buttons("Button 3").BringToFront
' Display the dialog box
CurrentSheet.Activate
Application.ScreenUpdating = True
If SheetCount <> 0 Then
If PrintDlg.Show Then
For Each cb In PrintDlg.CheckBoxes
If cb.Value = xlOn Then
Worksheets(cb.Caption).Activate
ActiveSheet.PrintOut
' ActiveSheet.PrintPreview 'for debugging
End If
Next cb
End If
Else
MsgBox "All worksheets are empty."
End If
' Delete temporary dialog sheet (without a warning)
Application.DisplayAlerts = False
PrintDlg.Delete
' Reactivate original sheet
CurrentSheet.Activate
End Sub
NOTE: Aaron Blood suggested the following modification, which prints
the selected sheets as a single print job. This allows the sheet to be
printed with continuous page numbers.
If PrintDlg.Show Then
For Each cb In PrintDlg.CheckBoxes
If cb.Value = xlOn Then
Worksheets(cb.Caption).Select Replace:=False
End If
Next cb
ActiveWindow.SelectedSheets.PrintOut copies:=1
ActiveSheet.Select
End If