AfterPrint & AfterSave? Excel thiếu. Xin bổ sung? (1 người xem)

  • Thread starter Thread starter pmhoang
  • Ngày gửi Ngày gửi
Liên hệ QC

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

pmhoang

Thành viên thường trực
Tham gia
4/7/08
Bài viết
269
Được thích
83
Trong ThisWorkbook có các Sub mặc định của Excel VD:
Workbook_BeforeSave(...)
Workbook_BeforePrint(...)

Nhưng không có: Workbook_AfterSave(...) & Workbook_AfterPrint(...)???

Mình muốn.
1. Ở sheet1 ấn nút Save thì Code làm nhảy qua Sheet2 và save. (BeforeSave)
Sau khi Save xong thì nhảy lại Sheet1 như cũ. (AfterSave)
(Nếu làm thành công thi khi mở file lên sẽ thấy SheetActivate là Sheet2 - Vì khi Save là Sheet2 Activate)

2. Ở sheet1 ấn nút Print Preview thì Code ẩn 3 Cột B,C,D và view (BeforePrint)
Sau khi close Print Preview hay là Print xong thì mở ẩn cho hiện lại 3 cột trên. (AfterPrint)

Mình làm hoài mà không được mong các bạn giúp với. Nếu được thì đây cũng là 2 Sub hay để cho mọi người áp dụng. Thanks
 
Lần chỉnh sửa cuối:
Tại sao bạn không chủ động làm việc mở Sheet2 mà thụ đông nhờ vào việc lưư lần trước.
Bằng code sau chắc chắn Sheet 2 sẽ mở khi mở file:

Mã:
Private Sub Workbook_Open()
Sheet2.Activate
End Sub
 
Upvote 0
Tại sao bạn không chủ động làm việc mở Sheet2 mà thụ đông nhờ vào việc lưư lần trước.
Bằng code sau chắc chắn Sheet 2 sẽ mở khi mở file:

Mã:
Private Sub Workbook_Open()
Sheet2.Activate
End Sub
Bẳng cách Workbook_Open mình đã làm rồi. Nhưng không được vừa ý vì khi mở file lên nó không phải mở Sheet2 lên liền. Mà Excel mở sheet1 lên (trong giay lát) rồi mới chuyển sang sheét2. Người dùng sẽ thấy số liệu ở Sheet1 (trong giây lát) rồi thấy chuyển đổi màng hình nháy 1 cái qua sheet2
Mình không muốn họ thấy sự nhấp nháy này.
Sheet 2 mình để trống, mình muốn khi mở file lên họ luôn thấy sheet trống trước.

Còn AfterPrint?
 
Upvote 0
Nếu muốn làm như bạn thì bạn nên đặt tất cả quá trình Print hoặc Save vào trong code của VBA để nó tự động Print hoặc Save luôn. Đừng đặt chế độ Print Preview rồi mới nhấn Print. Thì trong cuối code mình sẽ thêm được lệnh trả về vị trí cũ được. Tức là khi nhấn nút Print thì toàn bộ thao tác là chuyển sheet -> ẩn cột -> Print (In ra giấy luôn) -> chuyển sheet về vị trí cũ -> Finished hoàn tất. Kiểu như:
PHP:
 Sub Print() Sheet2.Select Range("F:H").EntireColumn.Hidden = True '..... 'Rồi đến lệnh Print '... Sheet1.Select End Sub
Trường hợp Save cũng làm tương tự. Phần lệnh Print như thế nào thì bạn có thể Record Macro rồi copy đoạn code đó đặt vào là được. Thân.
 
Lần chỉnh sửa cuối:
Upvote 0
Bẳng cách Workbook_Open mình đã làm rồi. Nhưng không được vừa ý vì khi mở file lên nó không phải mở Sheet2 lên liền. Mà Excel mở sheet1 lên (trong giay lát) rồi mới chuyển sang sheét2. Người dùng sẽ thấy số liệu ở Sheet1 (trong giây lát) rồi thấy chuyển đổi màng hình nháy 1 cái qua sheet2 Mình không muốn họ thấy sự nhấp nháy này. Sheet 2 mình để trống, mình muốn khi mở file lên họ luôn thấy sheet trống trước. Còn AfterPrint?
Vậy hãy đặt quá trình mở Sheet2 vào trong lệnh Close ấy. Như sau:
PHP:
Private Sub Workbook_BeforeClose(Cancel As Boolean) Application.DisplayAlerts = False Sheet2.Activate ThisWorkbook.Save Application.Quit End Sub
Và khi mở lên thì người ta luôn thấy sheet2 mà chẳng bao giờ thấy được Sheet1 đâu. Thân.
 
Lần chỉnh sửa cuối:
Upvote 0
Vậy hãy đặt quá trình mở Sheet2 vào trong lệnh Close ấy. Như sau:
PHP:
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Application.DisplayAlerts = False
Sheet2.Activate
ThisWorkbook.Save
Application.Quit
End Sub
Và khi mở lên thì người ta luôn thấy sheet2 mà chẳng bao giờ thấy được Sheet1 đâu.
Thân.
Cái này cũng đã làm rồi. Bị người dùng la làng quá trời vì khi mở lên xem, chỉnh sữa tùm lum, định Close và chọn No Save. ai gì Execl Save làm mất tiêu các số liệu quan trọng mà trước đó đã sữa tạm. Nên đã không còn dùng nữa.
 
Upvote 0
Như kết cấu File cua Hoang thì sheet2 nên thành sheet Main đặt các nút ở đó. Khi cần in trang nào thì mở trang đó dưới dạng sheetview. Lệnh sau khi in là thoát chế độ view và trở về sheet2.
 
Upvote 0
Vậy sao bác không khống chế người dùng bằng Validation và Protect Sheet. Để họ không nhập lung tung? Thân.
 
Lần chỉnh sửa cuối:
Upvote 0
Như kết cấu File cua Hoang thì sheet2 nên thành sheet Main đặt các nút ở đó. Khi cần in trang nào thì mở trang đó dưới dạng sheetview. Lệnh sau khi in là thoát chế độ view và trở về sheet2.
Kết cấu file của mình là nhập số liệu và tính toán và in hoàn toàn là sheet1, Sheet2 là trống.
Mình chỉ muốn lúc mở lên là Sheet trống (Sheet2), Nhưng không phải dùng:
Private Sub Workbook_Open()
Sheet2.Activate
End Sub
Vì như thế người dùng sẽ thấy so liệu ở Sheet1 (1 lúc) rồi excel mới chuyển về sheet2

Minh send file mẫu để các bạn tham khảo (file ở bài #12)

Mình vẫn ko thích cái Save của file này, vi mỗi lần save nó nhảy qua Sheet2.

Khi mơ file lên, nếu nhập tên vào đúng thì nó chuyển về Sheet1 để làm việc, còn nhập sai thì nó sẽ xóa hết sheet1 (xem như sheet nhap liệu, tinh toán bị xóa) trở về trắng.
 
Lần chỉnh sửa cuối:
Upvote 0
Vậy sao bác không khống chế người dùng bằng Validation và Protect Sheet. Để họ không nhập lung tung?
Thân.

hehe. Nhap lung tung o day ko phai la nhap vao nhung o khống chế, mà là nhập vào những o được phép nhập. Nhưng mà là nhập những số liệu thí nghiệm xem kết quả thế nào. Sau do nếu thấy thỏa mãn yêu cầu thì save còn khong thì No save.
Thân chào.
 
Upvote 0
Trong ThisWorkbook có các Sub mặc định của Excel VD:
Workbook_BeforeSave(...)
Workbook_BeforePrint(...)

Nhưng không có: Workbook_AfterSave(...) & Workbook_AfterPrint(...)???

Mình muốn.
1. Ở sheet1 ấn nút Save thì Code làm nhảy qua Sheet2 và save. (BeforeSave)
Sau khi Save xong thì nhảy lại Sheet1 như cũ. (AfterSave)
(Nếu làm thành công thi khi mở file lên sẽ thấy SheetActivate là Sheet2 - Vì khi Save là Sheet2 Activate)

2. Ở sheet1 ấn nút Print Preview thì Code ẩn 3 Cột B,C,D và view (BeforePrint)
Sau khi close Print Preview hay là Print xong thì mở ẩn cho hiện lại 3 cột trên. (AfterPrint)

Mình làm hoài mà không được mong các bạn giúp với. Nếu được thì đây cũng là 2 Sub hay để cho mọi người áp dụng. Thanks

Bạn xem có đúng ý bạn không
PHP:
Sub BeforeSave()
Sheet2.Activate
Application.ActiveWorkbook.Save
Sheet1.Activate
End Sub

Sub PrintPreview()
Columns("B:D").EntireColumn.Hidden = True
ActiveWindow.SelectedSheets.PrintPreview
Columns("B:D").EntireColumn.Hidden = False
End Sub
 

File đính kèm

Upvote 0
Bạn xem có đúng ý bạn không
PHP:
Sub BeforeSave()
Sub PrintPreview()

Cái của bạn là đúng như ý mình nói rồi. Nhưng mà làm như vậy là phải thêm nút lệnh cho file. Ý của mình là nút Save va Print của Excel kìa. (Không tạo thêm nút mới, vì excel có 2 nút đó rồi, chỉ lồng các Code vào nút có sẵn của Excel thôi.)

Nếu làm vậy, người dùng sử dụng nút Save của Excel mà lưu lại file đang ở Sheet1 thì xem như ý định Save file ở Sheet2 của mình thất bại rồi. huhu...

Thân chào.
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Hoang à, mình sửa như thế này có lẽ bạn chẳng phải chuyển sheet mà vẫn giấu hết thông tin trước khi đăng nhập
 

File đính kèm

Upvote 0
Hoang à, mình sửa như thế này có lẽ bạn chẳng phải chuyển sheet mà vẫn giấu hết thông tin trước khi đăng nhập
Hướng của bạn làm
Application.Visible = False
là rất sáng tạo. Thế mà mình không nghĩ ra. Mình sẽ áp dụng nó vào file của mình thử xem. Có gì mình sẽ liên hệ bạn. Thank rất nhiều!

Còn vấn đề AfterPrint? Mong các bạn giúp với.
 
Upvote 0
After Print thì vận dụng Code của Hoang Danh là ổn.
 
Upvote 0
After Print thì vận dụng Code của Hoang Danh là ổn.
Code của Hoang Danh la nút tạo mới. Nếu người ta ấn vào nút Print View hay Print của Excel thì xem như lệnh ẩn Cột không thực hiện được rồi. (mà đa số ai cũng quen vị trí của nút PrintView và Print (Ctrl+P) nên họ sẽ dùng cái này đầu tiên nhất)
 
Upvote 0
Code của Hoang Danh la nút tạo mới. Nếu người ta ấn vào nút Print View hay Print của Excel thì xem như lệnh ẩn Cột không thực hiện được rồi. (mà đa số ai cũng quen vị trí của nút PrintView và Print (Ctrl+P) nên họ sẽ dùng cái này đầu tiên nhất)
Cái sự kiện Workbook_BeforePrint có 1 tham số là Cancel có kiểu Boolean. Trong sự kiện mà ta gán Cancel = True thì sẽ vô hiệu hóa sự kiện này, vậy là bạn đã có thể thay sự kiện này bằng 1 Sub của bạn rồi. Ví dụ
Mã:
Private Sub Workbook_BeforePrint(Cancel As Boolean) 
    'Goi Sub can xu ly o day
    Call mySub
    'Vo hieu hoa su kien nay
    Cancel = True 
End Sub
 
Upvote 0
Cái sự kiện Workbook_BeforePrint có 1 tham số là Cancel có kiểu Boolean. Trong sự kiện mà ta gán Cancel = True thì sẽ vô hiệu hóa sự kiện này, vậy là bạn đã có thể thay sự kiện này bằng 1 Sub của bạn rồi. Ví dụ
Mình đã dựa vào ý tưởng của bạn để viết Code này. Nhưng nó hoạt động không như ý muốn, nó không thể nào Printview được, không hiểu tại sao? Mong các bạn giúp.
PHP:
Private Sub Workbook_BeforePrint(Cancel As Boolean)
  MsgBox "Truoc khi Print, to mau xanh"
  Range("B2:D15").Interior.ColorIndex = 4
  
  Cancel = True
  ActiveWindow.SelectedSheets.PrintPreview
  
  MsgBox "Sau khi Print, to mau trang tro lai"
  Range("B2:D15").Interior.ColorIndex = xlNone
End Sub
 
Upvote 0
Giải pháp của rollover79laf dược đấy, nhưng còn vấn đề là nếu không in mà chỉ xem rồi thoát ra thì sẽ không thực hiện đúng ý nữa, mình nghĩ chưa ra.Mình chưa tìm cách gài vào sự kiện thoát PrintPreview.

Bạn sửa câu lệnh
ActiveWindow.SelectedSheets.PrintPreview

Thành:

Sheets(2).PrintPreview

Vì bạn đang ở Sheets(1)
 
Lần chỉnh sửa cuối:
Upvote 0
<<< nhờ mode xóa giúp bài này>>>
 
Lần chỉnh sửa cuối:
Upvote 0
Web KT

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

Back
Top Bottom