Code đếm số lần mở File ( chỉ hiện kết quả trên 1 sheet duy nhất ) (1 người xem)

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

congnguyen88

Thành viên bị đình chỉ hoạt động
Thành viên bị đình chỉ hoạt động
Tham gia
22/7/14
Bài viết
355
Được thích
31
Mình có sử dụng đoạn code bên dưới để đếm số lần mở FIle, nhưng mình chỉ muốn kết quả chỉ hiện ra 1 sheet thôi ( ví dụ ô B5 của sheet 1 ) , chứ code này thì tất các sheet của ô B1 đều hiện ra kết quả. Mong mọi người giúp mình

Private Sub Workbook_Open()
Dim sh As Worksheet
For Each sh In ThisWorkbook.Worksheets
sh.Range("B1").Value = sh.Range("B1").Value + 1
Next
End Sub
 
Mình có sử dụng đoạn code bên dưới để đếm số lần mở FIle, nhưng mình chỉ muốn kết quả chỉ hiện ra 1 sheet thôi ( ví dụ ô B5 của sheet 1 ) , chứ code này thì tất các sheet của ô B1 đều hiện ra kết quả. Mong mọi người giúp mình

Private Sub Workbook_Open()
Dim sh As Worksheet
For Each sh In ThisWorkbook.Worksheets
sh.Range("B1").Value = sh.Range("B1").Value + 1
Next
End Sub
Đơn giản là bỏ cái vòng For ấy đi và chỉ định sheet cụ thể thay vì biến Sh. Chẳng hạn thế này:
[GPECODE=vb]Private Sub Workbook_Open()
Sheets("Sheet1").[B5] = Sheets("Sheet1").[B5] + 1
End Sub[/GPECODE]
Còn vấn đề làm sao để lưu giữ giá trị này qua mỗi lần mở file thì bạn chịu trách nhiệm nhé.
 
Upvote 0
Mình có sử dụng đoạn code bên dưới để đếm số lần mở FIle, nhưng mình chỉ muốn kết quả chỉ hiện ra 1 sheet thôi ( ví dụ ô B5 của sheet 1 ) , chứ code này thì tất các sheet của ô B1 đều hiện ra kết quả. Mong mọi người giúp mình

Private Sub Workbook_Open()
Dim sh As Worksheet
For Each sh In ThisWorkbook.Worksheets
sh.Range("B1").Value = sh.Range("B1").Value + 1
Next
End Sub

Ví dụ bạn mở file được 100 lần, tức cell B1 sẽ có giá trị =100
Vậy đặt trường hợp ai đó xóa cell B1 thì lần mở tiếp theo Excel sẽ hiểu như mở lần đầu tiên.
???
Bạn đã tính đến tình huống này chưa?
 
Upvote 0
Mình có sử dụng đoạn code bên dưới để đếm số lần mở FIle, nhưng mình chỉ muốn kết quả chỉ hiện ra 1 sheet thôi ( ví dụ ô B5 của sheet 1 ) , chứ code này thì tất các sheet của ô B1 đều hiện ra kết quả. Mong mọi người giúp mình

Private Sub Workbook_Open()
Dim sh As Worksheet
For Each sh In ThisWorkbook.Worksheets
sh.Range("B1").Value = sh.Range("B1").Value + 1
Next
End Sub
Thử 2 sub này coi sao. Có bị xoá mất ô A1 thì vẫn biết được mở bao nhiêu lần
Nhưng mà ai đó chẳng chịu Enable Macro thì á á á...
PHP:
Private Sub Workbook_BeforeClose(Cancel As Boolean)
 Sheet1.[A1] = SoLanMoFile
 ThisWorkbook.Save
End Sub

PHP:
Public SoLanMoFile
Sub auto_open()
Sheet1.[A1] = Sheet1.[A1] + 1
SoLanMoFile = Sheet1.[A1]
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Dùng một cái name để chứa số lần mở file. Hiển thị trị này lên ô trên sheet.
Như vậy có xoá sửa ô gì thì cũng chả liên quan gì đến trị.
 
Upvote 0
Thử 2 sub này coi sao. Có bị xoá mất ô A1 thì vẫn biết được mở bao nhiêu lần
Nhưng mà ai đó chẳng chịu Enable Macro thì á á á...
PHP:
Private Sub Workbook_BeforeClose(Cancel As Boolean)
 Sheet1.[A1] = SoLanMoFile
 ThisWorkbook.Save
End Sub

PHP:
Public SoLanMoFile
Sub auto_open()
Sheet1.[A1] = Sheet1.[A1] + 1
SoLanMoFile = Sheet1.[A1]
End Sub

Giả sử rằng ngoài code này ra, trong file còn có code khác nữa. Vậy thì sẽ có tình huống các code khác chạy bị lỗi sẽ khiến cho biến SoLanMoFile "bốc hơi"
Vậy phải làm sao? --=0
 
Upvote 0
Giả sử rằng ngoài code này ra, trong file còn có code khác nữa. Vậy thì sẽ có tình huống các code khác chạy bị lỗi sẽ khiến cho biến SoLanMoFile "bốc hơi"
Vậy phải làm sao? --=0
Không có đối thủ thì ít ra cũng có bao cát để đấm, chứ đấm vào không khí chán lắm. Nếu có tình huống thì thiệt thì may ra còn suy nghĩ ra cách, nếu không thì bó tay thôi anh ơi. Lười lắm.
 
Upvote 0
Không có đối thủ thì ít ra cũng có bao cát để đấm, chứ đấm vào không khí chán lắm. Nếu có tình huống thì thiệt thì may ra còn suy nghĩ ra cách, nếu không thì bó tay thôi anh ơi. Lười lắm.

Dám cá là có tình huống này đấy!
Dạng bài này có nhiều cách:
- Lưu "số lần" trên sheet ---> Dở nhất
- Dùng biến dang Public ---> Tạm được nhưng... như đã nói ở trên
- Dùng name ---> Tạm được nhưng cũng chưa hay, vì người ta vẫn có thể xóa name
- Dùng GetSetting và SaveSetting lưu "số lần" trong registry ---> Mình cho là cách này tương đối tốt (vì hiếm có ai biết nó ở đâu mà xóa)
vân vân... và mây mây...
Đương nhiên vẫn còn nhiều cách khác, chẳng hạn lưu "số lần" trong 1 file text đặt ở đâu đó trên đĩa cứng rồi đọc ngược vào. Tóm lại: Không lưu "số lần" trong chính workbook đó
 
Upvote 0
Sự kiên cố thường phải trả giá bằng sự rắc rối.

1. Có một số c quan, phần mềm có khả năng sửa Registry được liệt vào hàng Malware, người dùng phải có quyền Manager trên máy mới được xài.
2. Nếu người dùng có cài phần mềm bảo vệ Registry thì việc ghi trở nên vô dụng.
3. Win7: Khi một vùng nào đó trong Registry được khoá lại và chỉ cho Readonly thì phần mềm đọc và ghi chỗ ấy vẫn hoạt động, nhưng thật ra phần mềm không biết là cái trị ấy không được update.
 
Upvote 0
Đơn giản là bỏ cái vòng For ấy đi và chỉ định sheet cụ thể thay vì biến Sh. Chẳng hạn thế này:
[GPECODE=vb]Private Sub Workbook_Open()
Sheets("Sheet1").[B5] = Sheets("Sheet1").[B5] + 1
End Sub[/GPECODE]
Còn vấn đề làm sao để lưu giữ giá trị này qua mỗi lần mở file thì bạn chịu trách nhiệm nhé.

Sao không hiện thị số lần trên ô A5 vậy bạn
 
Upvote 0
Ví dụ bạn mở file được 100 lần, tức cell B1 sẽ có giá trị =100
Vậy đặt trường hợp ai đó xóa cell B1 thì lần mở tiếp theo Excel sẽ hiểu như mở lần đầu tiên.
???
Bạn đã tính đến tình huống này chưa?

Đúng rồi anh ơi, mở bao nhiều lần thì hiện thị bấy nhiêu lần, và tất nhiên Ô đó mình sẽ ẩn đi và mình khóa Protect luôn
 
Upvote 0
Thử 2 sub này coi sao. Có bị xoá mất ô A1 thì vẫn biết được mở bao nhiêu lần
Nhưng mà ai đó chẳng chịu Enable Macro thì á á á...
PHP:
Private Sub Workbook_BeforeClose(Cancel As Boolean)
 Sheet1.[A1] = SoLanMoFile
 ThisWorkbook.Save
End Sub

PHP:
Public SoLanMoFile
Sub auto_open()
Sheet1.[A1] = Sheet1.[A1] + 1
SoLanMoFile = Sheet1.[A1]
End Sub

Chưa rung đùi được đâu.

Tất nhiên ta chỉ chống người ngay. Nhưng trong những cách chống người ngay thì cách của bạn dễ xử lý nhất. Vì tìm hướng xử lý chẳng qua là chỉ ra được những cách có thể được dùng. Người ít kinh nghiệm thì nghĩ ra ít cách, người có chút kinh nghiệm thì chỉ ra được nhiều.

Trước tiên tôi đoán là bạn đã dùng code để thao tác. Code có thể ghi "thực trạng" ở "đâu đó" và mỗi lần mở tập tin thì tăng "thực trạng" thêm 1. "Đâu đó" thì tùy mức "láu cá" của người thao tác. Có thể là "ruột" tập tin, có thể là tập tin trên đĩa, có thể là mục trong Registry. Thậm chí nếu chơi cách "quái đản" thì có thể đặt trên mạng và mỗi khi mở tập tin thì nối mạng và đọc về.

Dù thế nào thì trước hết phải disable macro rồi thử dò. Ta mở tập tin và xóa A1 --> save --> close --> enable macro --> mở lại tập tin. Trong trường hợp của bạn thì may mắn thành công luôn.

Tất nhiên ta có thể giấu cell chứa giá trị và thậm chí protect. Nhưng tôi viết những dòng này vì câu "Có bị xoá mất ô A1 thì vẫn biết được mở bao nhiêu lần". Tức bạn thách thức: "Tôi cho phép xóa đấy, nhưng công cốc thôi".

Nếu là cách ghi trong tập tin trên đĩa hay registry thì làm như trên vẫn chưa thành công. Nhưng gặp người ngay biết chút ít thì cũng có thể chạy một code vd. viết trong Delphi và dò ra là code của bạn đã mở tập tin nào, mở khóa nào của Registry. Sau đó thì vào "chỗ ấy" mà xóa thôi.

Nếu "cấm" không cho xóa A1 thì vẫn còn một vấn đề. Khi sẩy ra crash thì SoLanMoFile được thiết lập về 0 và khi đóng tập tin thì Sheet1.[A1] = SoLanMoFile = 0. Tức lần mở sau đồng hồ lại đếm từ 1.

Vậy nếu làm theo ý tưởng ghi vào A1 thì cũng phải từ bỏ biến SoLanMoFile,
 
Upvote 0

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

Back
Top Bottom