Kirk hỏi liệu có cách nào để kiểm soát có điều kiện những gì được in trong Excel không. Ví dụ: ô A1 chứa một giá trị và giá trị này kiểm soát chính xác những gì được in. Có lẽ nếu A1 chứa 1, thì Sheet1 được in; nếu nó chứa 2, thì Sheet1 và Sheet2 được in.

Cách duy nhất để làm điều này là sử dụng macro và bạn có thể sử dụng một số cách tiếp cận. Hãy xem xét macro rất đơn giản sau đây, macro này chỉ sử dụng cấu trúc Chọn trường hợp để kiểm soát việc in.

Sub PrintStuff()

Dim vShts As Variant

vShts = Sheets(1).Range("A1")

If Not IsNumeric(vShts) Then         Exit Sub     Else         Select Case vShts             Case 1                 Sheets("Sheet1").PrintOut             Case 2                 Sheets("Sheet2").PrintOut             Case 3                 Sheets("Sheet1").PrintOut                 Sheets("Sheet2").PrintOut         End Select     End If End Sub

Chạy macro này với giá trị 1, 2 hoặc 3 trong ô A1 của trang tính đầu tiên và macro sẽ in những thứ khác nhau dựa trên giá trị. Nếu giá trị là 1, thì Sheet1 được in; nếu nó là 2, thì Sheet2 được in; và nếu nó là 3, thì cả Sheet1 và Sheet2 đều được in. Nếu bạn muốn các giá trị khác nhau in những thứ khác nhau, chỉ cần sửa đổi cấu trúc Chọn trường hợp để phản ánh các giá trị có thể có và những gì sẽ được in cho mỗi giá trị.

Một cách tiếp cận toàn diện hơn cũng có thể được tạo ra. Xem xét thêm một “bảng điều khiển” vào sổ làm việc của bạn. Trang tính này sẽ có tên của mỗi trang tính trong sổ làm việc được liệt kê trong cột đầu tiên. Nếu bạn đặt một giá trị ở bên phải tên trang tính, trong cột thứ hai, thì macro sẽ in trang tính tương ứng.

Macro sau có thể được sử dụng để tạo “bảng điều khiển”.

Sub CreateControlSheet()

Dim i as integer

On Error Resume Next   'Delete this sheet if it already exists     Sheets("Control Sheet").Delete     On Error GoTo 0

Sheets.Add   'Add the WhatToPrint Sheet     ActiveSheet.Name = "Control Sheet"



Range("A1").Select   'Label the columns     ActiveCell.FormulaR1C1 = "Sheet Name"



Range("B1").Select     ActiveCell.FormulaR1C1 = "Print?"



Cells.Select     Selection.Columns.AutoFit

For i = 1 To ActiveWorkbook.Sheets.Count         Cells(i + 1, 1).Value = Sheets(i).Name     Next End Sub

Trước tiên, macro sẽ xóa bất kỳ trang kiểm soát cũ nào, nếu nó tồn tại. Sau đó, nó thêm một trang tính mới có tên là Control Sheet, và đặt nhãn tiêu đề vào cột A và B. Sau đó, nó liệt kê tất cả các trang tính trong sổ làm việc ở cột A.

Với bảng điều khiển đã tạo, sau đó bạn có thể đặt “X” hoặc một số giá trị khác (chẳng hạn như “Y” hoặc 1) vào cột B bên cạnh mỗi trang tính bạn muốn in. Sau đó, macro sau sẽ kiểm tra trang tính điều khiển và in bất kỳ trang tính nào có dấu — bất kỳ dấu nào — trong ô trong cột B.

Sub PrintSelectedSheets()

Dim i as Integer     i = 2

Do Until Sheets("Control Sheet").Cells(i, 1).Value = ""

If Trim(Sheets("Control Sheet").Cells(i, 2).Value <> "") Then             Sheets(Sheets("Control Sheet").Cells(i, 1).Value).Select             ActiveWindow.SelectedSheets.PrintOut Copies:=1         End If         i = i + 1     Loop End Sub

Một cách tiếp cận khác là tạo một macro chạy ngay trước khi in.

(Đây là một trong những sự kiện — in — mà Excel cho phép bạn bẫy.) Macro sau, được thêm vào đối tượng thisWorkbook, sẽ chạy mỗi khi bạn cố in hoặc chọn Print Preview.

Private Sub Workbook_BeforePrint(Cancel As Boolean)

Dim vShts As Variant     Dim iResponse As Integer     Dim bPreview As Boolean

On Error GoTo ErrHandler

vShts = Sheets(1).Range("A1")

If Not IsNumeric(vShts) Then         GoTo InValidEntry     ElseIf vShts < 1 Or vShts > Sheets.Count Then         GoTo InValidEntry     Else         iResponse = MsgBox(prompt:="Do you want Print Preview?", _           Buttons:=vbYesNoCancel, Title:="Preview?")

Select Case iResponse             Case vbYes                 bPreview = True             Case vbNo                 bPreview = False             Case Else                Msgbox "Canceled at User request"

GoTo ExitHandler         End Select

Application.EnableEvents = False         Sheets(vShts).PrintOut Preview:=bPreview     End If

ExitHandler:

Application.EnableEvents = True     Cancel = True     Exit Sub

InValidEntry:

MsgBox "'" & Sheets(1).Name & "'!A1" _         & vbCrLf & "must have a number between " _         & "1 and " & Sheets.Count & vbCrLf     GoTo ExitHandler

ErrHandler:

MsgBox Err.Description     Resume ExitHandler End Sub

Macro kiểm tra giá trị trong ô A1 của trang tính đầu tiên. Nó sử dụng giá trị này để xác định trang tính nào nên được in. Nói cách khác, số 1 in trang tính đầu tiên, số 2 in trang tính thứ hai, số 3 in trang tính thứ ba, v.v.

Nếu giá trị trong A1 không phải là một giá trị hoặc nếu nó nhỏ hơn 1 hoặc lớn hơn số trang tính trong sổ làm việc, thì người dùng được thông báo rằng giá trị không chính xác và macro bị thoát.

Giả sử giá trị trong A1 nằm trong phạm vi, macro sẽ hỏi bạn có muốn sử dụng Xem trước khi in hay không. Tùy thuộc vào phản hồi của người dùng, macro in trang tính được chỉ định hoặc hiển thị Xem trước khi in cho trang tính đó.

_Lưu ý: _

Nếu bạn muốn biết cách sử dụng các macro được mô tả trên trang này (hoặc trên bất kỳ trang nào khác trên trang ExcelTips), tôi đã chuẩn bị một trang đặc biệt bao gồm thông tin hữu ích.

ExcelTips là nguồn của bạn để đào tạo Microsoft Excel hiệu quả về chi phí.

Mẹo này (2372) áp dụng cho Microsoft Excel 97, 2000, 2002 và 2003. Bạn có thể tìm phiên bản của mẹo này cho giao diện ribbon của Excel (Excel 2007 trở lên) tại đây: