In có điều kiện (Microsoft Excel)
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: