em muốn khóa lệnh in khi nhấn nút Ctrl+P (1 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

RAT_LIEU

Thành viên mới
Tham gia
9/9/09
Bài viết
29
Được thích
4
em muốn ở file của em Workbook (Sample Report 10-2009) khi nhấn nút ctrl+P thì chỉ có Sheet.Name = "Report" mới được in, còn các sheet khác thì sẽ hiện ra thông báo "Sorry, Printer not found. Pls check your cable". Em chưa nghĩ ra được cách gì hay nên đặt một cái mảco và đặt phím tắt Ctrl+P cho nó
Nhưng macro này hoạt động cả trên các Workbook khác mà em chưa biết xử lý thể này ( tức là giả sử em mở 1 file ex khác thì nhấn ctrl+P macro này vẫn chạy ở file đó luôn)
Sub khoa()
'
' khoa Macro
'
' Keyboard Shortcut: Ctrl+p
'
On Error Resume Next
If ActiveSheet.Name = "Report" Then
ActiveSheet.PrintPreview
Else

With ActiveWorkbook
Cancel = True
MsgBox "Sorry, Printer not found. Pls check your cable", vbInformation

End With
End If
End Sub
 
Bạn sửa lại thế này thử xem :

PHP:
If ThisWorkBook.Name = "Sample Report 10-2009.xls" And ActiveSheet.Name = "Report" Then ...
 
Bạn sửa lại thế này thử xem :

PHP:
If ThisWorkBook.Name = "Sample Report 10-2009.xls" And ActiveSheet.Name = "Report" Then ...

chắc bạn hiểu chưa rõ í mình. ý mình là chỉ khóa phím ^+P ở fíle "sample Report 10-2009.xls" còn các file khác thì không. còn sheẻt "Report" là thuộc file "sample Report 10-2009.xls"
để mình post code hiệu chỉnh gấn giống ý bạn kèm ví dụ lên nhé


Sub khoa()
'
' khoa Macro
'
' Keyboard Shortcut: Ctrl+p
'
On Error Resume Next
If ThisWorkbook.Name = "abc.xls" Then
If ActiveSheet.Name = "Report" Then
ActiveSheet.PrintPreview
Else

With ActiveWorkbook

Cancel = True
MsgBox "Sorry, Printer not found. Pls check your cable", vbInformation

End With
End If
End If
End Sub

Nhưng code này chưa hoạt động ok, mở file khác rồi nhấn nút ctrl+P macro vẫn hoạt động

Ai có cách giải quyết vấn đề nào hay hơn thì giúp mình với nhé chứ khóa nút bằng hotkey của macro mình thấy sao sao ấy

giả sử như sử dụng workbook_beforeprint.... nhưng mình chưa làm dc
 

File đính kèm

Lần chỉnh sửa cuối:
chắc bạn hiểu chưa rõ í mình. ý mình là chỉ khóa phím ^+P ở fíle "sample Report 10-2009.xls" còn các file khác thì không. còn sheẻt "Report" là thuộc file "sample Report 10-2009.xls"
để mình post code hiệu chỉnh gấn giống ý bạn kèm ví dụ lên nhé




Nhưng code này chưa hoạt động ok, mở file khác rồi nhấn nút ctrl+P macro vẫn hoạt động

Ai có cách giải quyết vấn đề nào hay hơn thì giúp mình với nhé chứ khóa nút bằng hotkey của macro mình thấy sao sao ấy

giả sử như sử dụng workbook_beforeprint.... nhưng mình chưa làm dc
Đúng là phải dùng sự kiện Before Print. Vì đâu phải không cho nhấn Ctrl + P là không in được. Người ta có thể click vào button mà. Bạn làm thế này:
Dán cái này vào ThisWorkBook
PHP:
Private Sub Workbook_BeforePrint(Cancel As Boolean)
If ActiveSheet.Name <> "Report" Then
Cancel = True
MsgBox "Sorry, Printer not found. Pls check your cable", vbInformation
End If
End Sub
Dán cái này vào Sheet Report
PHP:
Private Sub Worksheet_Deactivate()
If Me.Name <> "Report" Then Me.Name = "Report"
End Sub
Còn một trường hợp nữa. Nếu người ta chọn nhiều sheet để in và sheet Report là sheet active thì chưa chặn được.
Quan trọng là có lệnh nào đếm được có bao nhiêu sheet đang được chọn không? Nếu số sheet được chọn > 1 thì không cho in.
 
Đúng là phải dùng sự kiện Before Print. Vì đâu phải không cho nhấn Ctrl + P là không in được. Người ta có thể click vào button mà. Bạn làm thế này:
Dán cái này vào ThisWorkBook
PHP:
Private Sub Workbook_BeforePrint(Cancel As Boolean)
If ActiveSheet.Name <> "Report" Then
Cancel = True
MsgBox "Sorry, Printer not found. Pls check your cable", vbInformation
End If
End Sub
Dán cái này vào Sheet Report
PHP:
Private Sub Worksheet_Deactivate()
If Me.Name <> "Report" Then Me.Name = "Report"
End Sub
Còn một trường hợp nữa. Nếu người ta chọn nhiều sheet để in và sheet Report là sheet active thì chưa chặn được.
Quan trọng là có lệnh nào đếm được có bao nhiêu sheet đang được chọn không? Nếu số sheet được chọn > 1 thì không cho in.


vì một số lý do, trong các sheet còn lại em có đặt các nút PRINT sử dụng các macro khác. Nhưng macro này cho phép in sheet với các điều kiện ( ví dụ như a/c thấy ở hình gửi kèm. Nếu bảng 1 có dữ liệu thì ấn nút PRINT sẽ chỉ in bảng 1. nếu bảng 1,2 có dữ liệu PRINT sẽ chỉ in bảng 1.2....) đó chính là lý do mà em không muốn thao tác nhấn phím ^ +P trong các sheet này để không bị in lộn ra các bảng không cần thiêt thôi
theo cách của anh thắng thì nó sẽ cũngkhóa luôn chức năng in với các điều kiệu trên
---------------> mong muốn của em là chỉ khóa nút ^P ở các sheet khác trong file "sample report.."( vì các sheet này em đã có nút PRINT cho nó) trừ sheet "report"
 
Lần chỉnh sửa cuối:
vì một số lý do, trong các sheet còn lại em có đặt các nút PRINT sử dụng các macro khác. Nhưng macro này cho phép in sheet với các điều kiện ( ví dụ như a/c thấy ở hình gửi kèm. Nếu bảng 1 có dữ liệu thì ấn nút PRINT sẽ chỉ in bảng 1. nếu bảng 1,2 có dữ liệu PRINT sẽ chỉ in bảng 1.2....) đó chính là lý do mà em không muốn thao tác nhấn phím ^ +P trong các sheet này
theo cách của anh thắng thì nó sẽ cũngkhóa luôn chức năng in với các điều kiệu trên
---------------> mong muốn của em là chỉ khóa nút ^P ở các sheet khác trong file "sample report.."( vì các sheet này em đã có nút PRINT cho nó) trừ sheet "report"

Mình thấy code này cho phép in trong sheet Report của file abc.xls (các sheet khác của abc.xls thì cấm) và cho phép in trong sheet bất kỳ của file khác. Không biết đã đúng ý bạn chưa???

PHP:
Private Sub Workbook_BeforePrint(Cancel As Boolean)
    On Error Resume Next
    
    If ThisWorkbook.Name <> "abc.xls" Then End
    If ActiveSheet.Name = "Report" Then
        ThisWorkbook.PrintPreview
    Else
        MsgBox "Sorry, Printer not found. Pls check your cable", vbInformation
        Cancel = True
    End If
End Sub
 

File đính kèm

Mình thấy code này cho phép in trong sheet Report của file abc.xls (các sheet khác của abc.xls thì cấm) và cho phép in trong sheet bất kỳ của file khác. Không biết đã đúng ý bạn chưa???

PHP:
Private Sub Workbook_BeforePrint(Cancel As Boolean)
    On Error Resume Next
    
    If ThisWorkbook.Name <> "abc.xls" Then End
    If ActiveSheet.Name = "Report" Then
        ThisWorkbook.PrintPreview
    Else
        MsgBox "Sorry, Printer not found. Pls check your cable", vbInformation
        Cancel = True
    End If
End Sub

chưa được bạn ơi, bạn xem lại yêu cầu của bài trên dùm mình, mình muốn khóa nút ^+P để tránh in lầm chứ không muôn khóa luôn chức năng in của các sheet khác
 
vì một số lý do, trong các sheet còn lại em có đặt các nút PRINT sử dụng các macro khác. Nhưng macro này cho phép in sheet với các điều kiện ( ví dụ như a/c thấy ở hình gửi kèm. Nếu bảng 1 có dữ liệu thì ấn nút PRINT sẽ chỉ in bảng 1. nếu bảng 1,2 có dữ liệu PRINT sẽ chỉ in bảng 1.2....) đó chính là lý do mà em không muốn thao tác nhấn phím ^ +P trong các sheet này để không bị in lộn ra các bảng không cần thiêt thôi
theo cách của anh thắng thì nó sẽ cũngkhóa luôn chức năng in với các điều kiệu trên
---------------> mong muốn của em là chỉ khóa nút ^P ở các sheet khác trong file "sample report.."( vì các sheet này em đã có nút PRINT cho nó) trừ sheet "report"
Nếu vậy thì không sử dụng sự kiện Before Print được. Bạn dùng code này.
PHP:
Sub khoa()
On Error Resume Next
If ActiveWorkbook.Name = "abc.xls" And ActiveSheet.Name <> "Report" Then
MsgBox "Sorry, Printer not found. Pls check your cable", vbInformation
Else
ActiveSheet.PrintPreview
End If
End Sub
Gán Ctrl + P cho Macro.
 

File đính kèm

Theo mình bạn nên giành lấy quyền sử dụng phím tắt của chương trình bằng lệnh onkey và lúc đó làm gì thì tùy bạn. Như vậy cấu trúc gọn gàng:

Mã:
Sub khoa()
Application.OnKey "^{p}", "tb"
End Sub
'======================
Sub tb()
[COLOR=MediumTurquoise]'Làm thế nào tùy bạn ở đây[/COLOR],[COLOR=DeepSkyBlue] mình tạm để bằng "No print"[/COLOR]
MsgBox "No Print"
End Sub
 
Vô hiệu hóa phím nóng, cú pháp như sau:

Mã:
Application.OnKey "^p", ""

Để mở lại phím nóng như sau:

Mã:
Application.OnKey "^p"

Tương tự như trên cho chừc năng copy thì thay "P" thành "C"...
 
cho em hỏi thêm là đặt nó vào đâu a,
 
Bạn xem ví dụ nhé, Chỉ sheet 1 và 2 in được. 2 sheet này trong vùng A1:G28 phải có dữ liệu mới in được.Để tự động khoá thì code khoá đặt vào sự kiên Open của Workbook (Lưu ý tên sheet mình dùng codeName để tránh ảnh hưởng do người dùng thay đổi tên sheet)

Mã:
Sub khoa()
Application.OnKey "^p", "tb"
End Sub
'========================================================
Sub mo()
Application.OnKey "^p"
End Sub
'========================================================
Sub tb()
If ActiveSheet.CodeName = "Sheet1" Or ActiveSheet.CodeName = "Sheet2" Then
If test(ActiveSheet.[A1:G28]) Then
ActiveSheet.PrintPreview
Else
MsgBox "Day la trang duoc in nhung khong co du lieu"
End If
Else
MsgBox "Trang nay khong in duoc"
End If
End Sub
'===================================================
Function test(rg As Range) As Boolean
Dim cll As Range
test = False
For Each cll In rg
If cll <> "" Then
test = True
Exit Function
End If
Next
End Function
 

File đính kèm

Lần chỉnh sửa cuối:
OKie. cho em hỏi thêm một ví dụ ngoài lề

EM muốn tạo Một macro tự đôngj sử dụng phím END, khi em nhấn phím END thì nó sẽ nhảy tới cột AH của ROW hiện thời ( macro này tự động chạy theo Workbook Open nhé), thank a
 
OKie. cho em hỏi thêm một ví dụ ngoài lề

EM muốn tạo Một macro tự đôngj sử dụng phím END, khi em nhấn phím END thì nó sẽ nhảy tới cột AH của ROW hiện thời ( macro này tự động chạy theo Workbook Open nhé), thank a
Dán code này vào Module
PHP:
Sub Auto_Open()
Application.OnKey "{END}", "AH"
End Sub
Sub AH()
Cells(ActiveCell.Row, 34).Select
End Sub
 
em làm thế này nhưng chưa biết cách nhảy tới cột thứ 1 trước khi nhảy tới cột thứ 43 (cột của row hiện thời nhé)

AH là 34 chứ bạn.

PHP:
Sub callend()
    If ActiveCell.Column = 1 Then
        Cells(ActiveCell.Row, 34).Select
    Else
        Cells(ActiveCell.Row, 1).Select
    End If
End Sub
 
Thực chất callend() của bạn như sau:

Mã:
[COLOR=#000000][COLOR=#0000bb]
Sub callend[/COLOR][COLOR=#007700]()
[/COLOR][COLOR=#0000bb]        Cells[/COLOR][COLOR=#007700]([/COLOR][COLOR=#0000bb]ActiveCell[/COLOR][COLOR=#007700].[/COLOR][COLOR=#0000bb]Row[/COLOR][COLOR=#007700], [/COLOR][COLOR=#0000bb]34[/COLOR][COLOR=#007700]).[/COLOR][COLOR=#0000bb]Select
 [/COLOR][COLOR=#0000bb]End Sub  [/COLOR][/COLOR]
Vì cái hàm offset mà bạn phải về cột 1 mà thôi, nay chỉ đích danh ô đích thì không phải xác định vị trí thông qua ô 1 nữa. Việc sử lý theo cách của bạn là:

Mã:
[COLOR=#000000][COLOR=#0000bb]Sub callend[/COLOR][COLOR=#007700]()
[/COLOR][COLOR=#0000bb]        Cells[/COLOR][COLOR=#007700]([/COLOR][COLOR=#0000bb]ActiveCell[/COLOR][COLOR=#007700].[/COLOR][COLOR=#0000bb]Row[/COLOR][COLOR=#007700], [/COLOR][COLOR=#0000bb]1[/COLOR][COLOR=#007700]).Offset(,34).[/COLOR][COLOR=#0000bb]Select
 [/COLOR][COLOR=#0000bb]End Sub  [/COLOR][/COLOR]
Bạn so sánh xem. Nếu thích hàm Offset thì dùng
Mã:
Sub Callend()
ActiveCell.Offset(, 34 - ActiveCell.Column).Select
End sub
 
Lần chỉnh sửa cuối:
Nếu vậy thì không sử dụng sự kiện Before Print được. Bạn dùng code này.
PHP:
Sub khoa()
On Error Resume Next
If ActiveWorkbook.Name = "sample Report 10-09.xls" And ActiveSheet.Name <> "Report" Then
MsgBox "Sorry, Printer not found. Pls check your cable", vbInformation
Else
ActiveSheet.PrintPreview
End If
End Sub
Gán Ctrl + P cho Macro.
em làm theo cách này nhưng giả sử trong tháng 11 là em phải sửa code với tên file với a
If ActiveWorkbook.Name = "sample Report 11-09.xls" And ActiveSheet.Name <> "Report" Then

có cách gì giả sử như là chỉ cần thấy được ActiveWorkbook.Name có dạng "sample Report.." là được, giống như là lấy LEFT của nó í
 
em làm theo cách này nhưng giả sử trong tháng 11 là em phải sửa code với tên file với a


có cách gì giả sử như là chỉ cần thấy được ActiveWorkbook.Name có dạng "sample Report.." là được, giống như là lấy LEFT của nó í

Bạn thay cái này :

PHP:
If ActiveWorkbook.Name = "sample Report 10-09.xls" And ActiveSheet.Name <> "Report" Then

thành :

PHP:
If InStr(ActiveWorkbook.Name, "sample Report") And ActiveSheet.Name <> "Report" Then

thử xem.
 
Cách trên em chưa nghĩ ra, nhưng em tạm thời xài cách này. Vì file của em luu theo từng tháng
vd:Sample Report 09-2009,Sample Report 10-2009
if ActiveWorkbook.Name = "Sample Report " & Format(Now, "mm-yyyy") & ".xlsm" And ActiveSheet.Name <> "Report" Then
 
Cho em hỏi ạ! Hiện tại em đang muốn xin code tắt và bật chức năng ngăn chặn in này ! anh nào giúp em với.
Ý của em là tạo 1 nút pinter code lần lượt như sau : bật cho in ->> (code nhập liệu) -->> tắt không cho in. Anh nào giúp em với.
Code khóa chức năng in đây ạ! Vậy On và Off nó thì làm thế nào a.
Private Sub workbook_BeforePrint(Cancel As Boolean)
Select Case ActiveSheet.Name
Case "Sheet1", "Sheet2"
Cancel = True
MsgBox "Sorry, you cannot print this sheet from this workbook", _
vbInformation
End Select
End Sub
 
Cho em hỏi ạ! Hiện tại em đang muốn xin code tắt và bật chức năng ngăn chặn in này ! anh nào giúp em với.
Ý của em là tạo 1 nút pinter code lần lượt như sau : bật cho in ->> (code nhập liệu) -->> tắt không cho in. Anh nào giúp em với.
Code khóa chức năng in đây ạ! Vậy On và Off nó thì làm thế nào a. Hoặc có cgf in cách nào bật và tắt chức năng in của 1 vung in cũng đc ạ
Private Sub workbook_BeforePrint(Cancel As Boolean)
Select Case ActiveSheet.Name
Case "Sheet1", "Sheet2"
Cancel = True
MsgBox "Sorry, you cannot print this sheet from this workbook", _
vbInformation
End Select
End Sub
 
Cho em hỏi ạ! Hiện tại em đang muốn xin code tắt và bật chức năng ngăn chặn in này ! anh nào giúp em với.
Ý của em là tạo 1 nút pinter code lần lượt như sau : bật cho in ->> (code nhập liệu) -->> tắt không cho in. Anh nào giúp em với.
Code khóa chức năng in đây ạ! Vậy On và Off nó thì làm thế nào a.
Private Sub workbook_BeforePrint(Cancel As Boolean)
Select Case ActiveSheet.Name
Case "Sheet1", "Sheet2"
Cancel = True
MsgBox "Sorry, you cannot print this sheet from this workbook", _
vbInformation
End Select
End Sub
Bạn càng gửi bài linh tinh thì càng không có ai giúp!
Hỏi chỗ nào thì tập trung vào chỗ đó (1 chỗ duy nhất). Đây không phải cái chợ
 

Bài viết mới nhất

Back
Top Bottom