Xin bản đồ các tỉnh Việt Nam trong file Excel

Liên hệ QC
Cái này hay quá.
Cái này bây giờ mình có thể thêm bản đồ chi tiết của tỉnh hoặc thành phố khi nhấn vào được không ?
 
Hơi tiếc. 32 bit thì 99,99% là chạy rồi, chỉ muốn kiểm tra 64 bit thôi. Đồng hồ bây giờ tôi đặt nhịp 1/5 s, dùng SetTimer thấy mượt, không bị giật giật trỏ chuột.
Của em 64 bit vẫn chạy bình thường ạ. Em dùng office 365
 
Cái này bây giờ mình có thể thêm bản đồ chi tiết của tỉnh hoặc thành phố khi nhấn vào được không ?
Thực ra bài này là bản đồ nhưng lôgíc không hẳn là cho bản đồ. Có tọa độ của thành phố, quận, hay từng thửa đất, căn nhà bạn có thể tạo Shape. Có tọa độ của đa giác bất kỳ bạn tạo được Shape. Bạn có thể tự tạo Shape có hình dạng là hình tròn, êlíp, hình vuông. Có thể tạo Shape mô tả người, đồ vật, con vật v...v. Và dùng code y hệt để tô mầu, hiện thông tin về mỗi con người, con vật, đồ vật đang ở dưới con trỏ chuột. Triết lý của code không dính dáng gì tới bản đồ địa lý.
Bài đã được tự động gộp:

Của em 64 bit vẫn chạy bình thường ạ. Em dùng office 365
Tôi viết rõ mà. Bây giờ tôi thay OnTime bằng SetTimer nên tôi cần kiểm tra khai báo API. Nhiều cái mình không chắc chắn, nhiều cái sơ ý. Nếu có lỗi thì khi kiểm tra trên 64 bit sẽ lòi ra. Còn 32 bit thì tôi đang có và kiểm tra được rồi. Bản trước không nói (có 1 chỗ sơ sót khi khai báo, vd. GetWindowLong trả về LongPtr vào style nhưng style lại khai báo là Long vì thế có lỗi như bài #31), bây giờ dùng SetTimer nên tôi muốn kiểm tra.

Bạn có chấp nhận kiểm tra hộ tôi không?
 
Lần chỉnh sửa cuối:
Thực ra bài này là bản đồ nhưng lôgíc không hẳn là cho bản đồ. Có tọa độ của thành phố, quận, hay từng thửa đất, căn nhà bạn có thể tạo Shape. Có tọa độ của đa giác bất kỳ bạn tạo được Shape. Bạn có thể tự tạo Shape có hình dạng là hình tròn, êlíp, hình vuông. Có thể tạo Shape mô tả người, đồ vật, con vật v...v. Và dùng code y hệt để tô mầu, hiện thông tin về mỗi con người, con vật, đồ vật đang ở dưới con trỏ chuột. Triết lý của code không dính dáng gì tới bản đồ địa lý.
Cái này vượt quá khả năng của tôi rồi, để tôi tìm hiểu thử, ở đây có nhiều bác có kiến thức rộng quá.
 
Hơi tiếc. 32 bit thì 99,99% là chạy rồi, chỉ muốn kiểm tra 64 bit thôi. Đồng hồ bây giờ tôi đặt nhịp 1/5 s, dùng SetTimer thấy mượt, không bị giật giật trỏ chuột.

Bác gửi file làm trên 64bit lên tôi test thử xem nhé, Dùng Timer hiện tại thấy nó cứ nhấp nháy trỏ chuột.
 
Bác gửi file làm trên 64bit lên tôi test thử xem nhé, Dùng Timer hiện tại thấy nó cứ nhấp nháy trỏ chuột.
Bạn kiểm tra hộ nhé.

Để nhiều người khỏi hiểu lầm thì tôi nói rõ. Không phải là tập tin chỉ làm cho 64 bit. Tập tin làm để chạy trên cả 32 bit và 64 bit. 32 bit thì tôi có nên đã kiểm tra rồi. Chỉ không có 64 bit nên muốn nhờ kiểm tra trên 64 bit.

Lưu ý: tập tin hoàn chỉnh ở bài #65
 

File đính kèm

  • Covid Viet Nam - SetTimer.xlsm
    202 KB · Đọc: 45
Lần chỉnh sửa cuối:
Bạn kiểm tra hộ nhé.

Để nhiều người khỏi hiểu lầm thì tôi nói rõ. Không phải là tập tin chỉ làm cho 64 bit. Tập tin làm để chạy trên cả 32 bit và 64 bit. 32 bit thì tôi có nên đã kiểm tra rồi. Chỉ không có 64 bit nên muốn nhờ kiểm tra trên 64 bit.

Chú ơi SN ơi, cháu mở lên nó bị lỗi như thế này rồi tắt luôn, hình ảnh cháu phải canh mãi mới chụp được nên thông báo lỗi nó mờ:

1630147849259.png
 
Chú ơi SN ơi, cháu mở lên nó bị lỗi như thế này rồi tắt luôn, hình ảnh cháu phải canh mãi mới chụp được nên thông báo lỗi nó mờ:

View attachment 264949
Trong cửa sổ này có nút Debug. Nếu bạn nhanh tay click vào Debug và cho tôi biết dòng nào bị bôi vàng thì hay quá.

Thực ra tôi không dám chắc khai báo Sub TimerProc.
 
...................................................... nhờ các mod xóa giúp em, đã chuyển bài dưới
 
Lần chỉnh sửa cuối:
Trong cửa sổ này có nút Debug. Nếu bạn nhanh tay click vào Debug và cho tôi biết dòng nào bị bôi vàng thì hay quá.

Thực ra tôi không dám chắc khai báo Sub TimerProc.
cháu ghi lại màn hình chú xem nhé, nhanh quá cháu kịp bấm vào được cái gì cả,hình như là khi đặt chuột ở các ô trên bảng tính thì mới bị, đúng rồi bật lên để không thì không sao nếu di chuyển trên bảng tính là bị lỗi vậy.
 

File đính kèm

  • gui_snbatman.zip
    1.3 MB · Đọc: 8
cháu ghi lại màn hình chú xem nhé, nhanh quá cháu kịp bấm vào được cái gì cả,hình như là khi đặt chuột ở các ô trên bảng tính thì mới bị, đúng rồi bật lên để không thì không sao nếu di chuyển trên bảng tính là bị lỗi vậy.
Bây giờ tôi hiểu rồi. Nếu bài trước bạn viết rõ thì tôi không hiểu sai.

Tức khi mở tập tin thì di chuột tới ngày tận thế vẫn không có lỗi. Nhưng nếu CLICK để chọn ô nào đó thì có lỗi. Cũng dễ hiểu thôi vì khi CLICK thì sẽ có code của Excel được thực thi, vd. nếu có Sub Worksheet_SelectionChange thì nó sẽ được thực hiện. Trong khi đó đồng thời Windows gọi call back TimerProc. 2 thằng "xung đột" nhau nên sảy ra lỗi.

Khắc phục:
1. Trong sub TimerProc trước dòng GetCursorPos pt thì thêm dòng On Error GoTo end_. Tức phải có
Mã:
On Error GoTo end_
GetCursorPos pt

2. Trước End Sub thên dòng end_:, tức phải có
Mã:
end_:
End Sub


̣Để chỉnh sửa thì thao tác như sau: Mở Excel với tập tin trắng -> File -> Options -> Trust Center -> tắt Macro -> mở Covid -> chỉnh sửa -> lưu lại rồi đóng Covid -> Trust Center -> bật macro -> mở Covid

Bây giờ thế nào?
 
Bạn kiểm tra hộ nhé.

Để nhiều người khỏi hiểu lầm thì tôi nói rõ. Không phải là tập tin chỉ làm cho 64 bit. Tập tin làm để chạy trên cả 32 bit và 64 bit. 32 bit thì tôi có nên đã kiểm tra rồi. Chỉ không có 64 bit nên muốn nhờ kiểm tra trên 64 bit.

Lỗi đây anh.

Screen Shot 2021-08-28 at 17.56.39.png

Sau khi em sửa cái hàm SetStyleBit() thì nó chạy được nhưng thường bị treo và lỗi như video đính kèm.

Screen Shot 2021-08-28 at 13.08.41.png

Link video: https://www.mediafire.com/file/nsr40pdq5arg8nc/Loi_setTimer.7z/file
 
Lỗi đây anh.

View attachment 264956

Sau khi em sửa cái hàm SetStyleBit() thì nó chạy được nhưng thường bị treo và lỗi như video đính kèm.

View attachment 264957

Link video: https://www.mediafire.com/file/nsr40pdq5arg8nc/Loi_setTimer.7z/file
Đúng là kiểu của style không chuẩn. Khi VBA7 thì style là LongPtr (vd. GetWindowLong trả về LongPtr). Nhưng khi dò bằng mắt thì rất dễ sơ ý và bỏ qua.

Tuy nhiên theo tôi thì bạn sửa thế chưa chuẩn. Nếu là tôi thì tôi sửa lại thành
Mã:
#If VBA7 Then
Private Sub SetStyleBit(style As LongPtr, ByVal bit As Long, ByVal bSet As Boolean)
#Else
Private Sub SetStyleBit(style As Long, ByVal bit As Long, ByVal bSet As Boolean)
#End If

Còn lỗi mà bạn 3ii viết thì tôi đã đề nghị sửa như bài #53

Cám ơn bạn bạn đã phát hiện thiếu sót style.
 
Thực ra bài này là bản đồ nhưng lôgíc không hẳn là cho bản đồ. Có tọa độ của thành phố, quận, hay từng thửa đất, căn nhà bạn có thể tạo Shape. Có tọa độ của đa giác bất kỳ bạn tạo được Shape. Bạn có thể tự tạo Shape có hình dạng là hình tròn, êlíp, hình vuông. Có thể tạo Shape mô tả người, đồ vật, con vật v...v. Và dùng code y hệt để tô mầu, hiện thông tin về mỗi con người, con vật, đồ vật đang ở dưới con trỏ chuột. Triết lý của code không dính dáng gì tới bản đồ địa lý.
Bài đã được tự động gộp:


Tôi viết rõ mà. Bây giờ tôi thay OnTime bằng SetTimer nên tôi cần kiểm tra khai báo API. Nhiều cái mình không chắc chắn, nhiều cái sơ ý. Nếu có lỗi thì khi kiểm tra trên 64 bit sẽ lòi ra. Còn 32 bit thì tôi đang có và kiểm tra được rồi. Bản trước không nói (có 1 chỗ sơ sót khi khai báo, vd. GetWindowLong trả về LongPtr vào style nhưng style lại khai báo là Long vì thế có lỗi như bài #31), bây giờ dùng SetTimer nên tôi muốn kiểm tra.

Bạn có chấp nhận kiểm tra hộ tôi không?
Xin lỗi anh, vừa rồi em kiểm tra lại thì đang dùng 32 bit, em vừa update lên 64 bit để xem lỗi gì?
Đây là hình ảnh lỗi ạ (Bôi đen ở chữ style).

Snag_c0ba804.png
 
Đúng là kiểu của style không chuẩn. Khi VBA7 thì style là LongPtr (vd. GetWindowLong trả về LongPtr). Nhưng khi dò bằng mắt thì rất dễ sơ ý và bỏ qua.

Tuy nhiên theo tôi thì bạn sửa thế chưa chuẩn. Nếu là tôi thì tôi sửa lại thành
Mã:
#If VBA7 Then
Private Sub SetStyleBit(style As LongPtr, ByVal bit As Long, ByVal bSet As Boolean)
#Else
Private Sub SetStyleBit(style As Long, ByVal bit As Long, ByVal bSet As Boolean)
#End If

Còn lỗi mà bạn 3ii viết thì tôi đã đề nghị sửa như bài #53

Đã sửa như bài #53 và chạy êm ru.
Em sửa cái hàm SetStyleBit như kiểu trên vì LongPtr vẫn nhận dạng được trong Office 32bit + Windows 64bit (còn trong Windows 32bit + Office 32bit thì không có tạo máy ảo đế test).
 
Bây giờ tôi hiểu rồi. Nếu bài trước bạn viết rõ thì tôi không hiểu sai.

Tức khi mở tập tin thì di chuột tới ngày tận thế vẫn không có lỗi. Nhưng nếu CLICK để chọn ô nào đó thì có lỗi. Cũng dễ hiểu thôi vì khi CLICK thì sẽ có code của Excel được thực thi, vd. nếu có Sub Worksheet_SelectionChange thì nó sẽ được thực hiện. Trong khi đó đồng thời Windows gọi call back TimerProc. 2 thằng "xung đột" nhau nên sảy ra lỗi.

Khắc phục:
1. Trong sub TimerProc trước dòng GetCursorPos pt thì thêm dòng On Error GoTo end_. Tức phải có
Mã:
On Error GoTo end_
GetCursorPos pt

2. Trước End Sub thên dòng end_:, tức phải có
Mã:
end_:
End Sub


̣Để chỉnh sửa thì thao tác như sau: Mở Excel với tập tin trắng -> File -> Options -> Trust Center -> tắt Macro -> mở Covid -> chỉnh sửa -> lưu lại rồi đóng Covid -> Trust Center -> bật macro -> mở Covid

Bây giờ thế nào?

Tuyệt vời cảm ơn chú, code chạy êm ru, còn khúc dưới đây cháu chưa hiểu các Sao đang bàn về chuyện gì:
Lỗi đây anh.

View attachment 264956

Sau khi em sửa cái hàm SetStyleBit() thì nó chạy được nhưng thường bị treo và lỗi như video đính kèm.

View attachment 264957

Link video: https://www.mediafire.com/file/nsr40pdq5arg8nc/Loi_setTimer.7z/file
Đúng là kiểu của style không chuẩn. Khi VBA7 thì style là LongPtr (vd. GetWindowLong trả về LongPtr). Nhưng khi dò bằng mắt thì rất dễ sơ ý và bỏ qua.

Tuy nhiên theo tôi thì bạn sửa thế chưa chuẩn. Nếu là tôi thì tôi sửa lại thành
Mã:
#If VBA7 Then
Private Sub SetStyleBit(style As LongPtr, ByVal bit As Long, ByVal bSet As Boolean)
#Else
Private Sub SetStyleBit(style As Long, ByVal bit As Long, ByVal bSet As Boolean)
#End If

Còn lỗi mà bạn 3ii viết thì tôi đã đề nghị sửa như bài #53

Cám ơn bạn bạn đã phát hiện thiếu sót style.

rút cục là có phải sửa gì nữa không sửa khúc nào xin hãy nói rõ để cháu biết hoặc gửi file đính kèm.
 
Tuyệt vời cảm ơn chú, code chạy êm ru, còn khúc dưới đây cháu chưa hiểu các Sao đang bàn về chuyện gì:

rút cục là có phải sửa gì nữa không sửa khúc nào xin hãy nói rõ để cháu biết hoặc gửi file đính kèm.
Sửa chứ, các bài đều bàn về code của Covid mà.

Trong modWindowStyle có
Mã:
Private Sub SetStyleBit(style As Long, ByVal bit As Long, ByVal bSet As Boolean)

Sửa thành
Mã:
#If VBA7 Then
Private Sub SetStyleBit(style As LongPtr, ByVal bit As Long, ByVal bSet As Boolean)
#Else
Private Sub SetStyleBit(style As Long, ByVal bit As Long, ByVal bSet As Boolean)
#End If

Tóm lại ngoài khai báo style có thiếu sót thì khi CLICK trên sheet có lỗi là do có "xung đột".

Giải thích thêm cho những người thích Windows API hiểu.

1. Tại sao trong tập tin dùng OnTime không có lỗi khi CLICK trên sheet? OnTime dùng để chạy sub doi_mau. OnTime của VBA nên do Excel chạy, cứ sau 1 s thì Excel sẽ gọi doi_moi. Khi Excel bận thì dù 1 s đã qua thì nó cũng không gọi doi_moi mà làm xong các việc bận mới gọi doi_moi. Excel tự gọi nên nó làm chủ được tình huống. Không có xung đột gì ở đây.

2. Tại sao dùng SetTimer của Windows API thì lỗi khi CLICK trên sheet?
Ta phân tích dòng code
Mã:
ID = SetTimer(0, 0, 200, AddressOf TimerProc)
Dòng code trên có nghĩa là ta đã gọi hàm SetTimer của system Windows, kiểu như: báo cáo sếp (Windows), tôi đặt nhiệm vụ là cứ 200 ms thì thực hiện code của tôi, tức TimerProc, ở địa chỉ xyz trong bộ nhớ. Lúc đó system Windows sẽ tạo 1 "đồng hồ", cứ 200 ms sẽ gọi sub TimerProc. Tất nhiên 200 ms là thời gian mặc định. Khi 200 ms trôi qua mà đúng lúc system bận (ngoài process của ta còn vô vàn process khác trong system, bản thân system có những lúc bận) thì system sẽ gọi TimerProc vào lúc sau. Nhưng đây là nói về việc system bận, còn chuyện Excel lúc đó có bận hay không thì system không quan tâm, cứ 200 ms là gọi TimerProc. Hàm SetTimer trả về một giá trị được ghi nhớ trong biến ID. Khi cần "hủy" đồng hồ thì gọi KillTimer và truyền ID vào để hủy đồng hồ. Tại sao KillTimer không đủ để hủy đồng hồ mà lại phải truyền ID vào? Đơn giản là mỗi app có thể tạo nhiều đồng hồ do có nhu cầu. Khi muốn hủy 1 đồng hồ nào đấy mà chỉ cần gọi KillTimer không có tham số thì cụ thánh của system Windpows cũng chịu không biết "người ta" cần hủy đồng hồ nào. Vì thế mỗi đồng hồ được tạo bởi SetTimer sẽ được gán cho một con số định danh, và SetTimer khi tạo đồng hồ sẽ trả về con số định danh (ID) đó của đồng hồ được tạo. Khi cần hủy đồng hồ nào thì gọi KillTimer và truyền con số định danh (ID) của nó vào.
Khi chạy chương trình thì code và dữ liệu (data) sẽ được load vào bộ nhớ. Mọi chuyện sảy ra là sảy ra trong bộ nhớ. Sub TimerProc nằm đâu đó trong bộ nhớ. Trong trường hợp này TimerProc được gọi bởi system Windows chứ không bởi Excel. Vì mình có "khai báo" gì với Excel đâu mà nó biết khi nào phải gọi cái gọi là TimerProc. Để Windows có thể gọi TimerProc thì phải cung cấp cho Windows địa chỉ của TimerProc trong bộ nhớ. Windows biết TimerProc ở đâu thì cứ "đến giở" là gọi nó thôi. Ta cung cấp cho Windows địa chỉ trong RAM của TimerProc bằng hàm: AddressOf TimerProc sẽ trả về địa chỉ của TimerProc trong RAM. Khi đến giờ là Windows gọi TimerProc để thực thi. Nếu đúng lúc đó người dùng CLICK trên sheet thì code của Excerl cũng được thực thi (nếu vd. Excel phát hiện có Worksheet_SelectionChange thì code của Worksheet_SelectionChange sẽ được thực thi). 2 vị khác nhau cùng thực hiện việc của mình thì sảy ra "xung đột".

Hàm mà khi gọi một hàm nào đó của Windows API ta phải cung cấp cho Windows địa chỉ của nó, để Windows biết nó nằm ở đâu trong RAM để sau đó gọi nó, hàm đó được gọi là call back. TimerProc là một call back.
 
Lần chỉnh sửa cuối:
Web KT

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

Back
Top Bottom