Nhờ các thấy chỉ giúp code tự điều chỉnh dấu thập phân trong Control Panel (1 người xem)

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

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

nhdphong

Thành viên mới
Tham gia
19/2/14
Bài viết
28
Được thích
2
Nhờ các thấy chỉ giúp code tự định dạng dấu thập phân và ngày trong Control Panel

Hiện e đang thiết kế 1 chương trình trên excel nhưng lại gặp rắc rối về định dạng dấu phân cách và ngày/tháng/năm
Nay nhờ các thầy giúp em đoạn code tự thiết lập dấu phân cách, dấu thập phân và định dạng ngày/tháng/năm trong Control Panel, cụ thể như sau:
- Decimal symbol là dấu " . "
- Digit grouping symbol là dấu " , "
- Short date là: "dd/mm/yyyy"
Xin cảm ơn rất nhiều
 
Lần chỉnh sửa cuối:
Hiện e đang thiết kế 1 chương trình trên excel nhưng lại gặp rắc rối về định dạng dấu phân cách và ngày/tháng/năm
Nay nhờ các thầy giúp em đoạn code tự thiết lập dấu phân cách, dấu thập phân và định dạng ngày/tháng/năm trong Control Panel, cụ thể như sau:
- Decimal symbol là dấu " . "
- Digit grouping symbol là dấu " , "
- Short date là: "dd/mm/yyyy"
Xin cảm ơn rất nhiều

Theo tôi bạn làm thế không được.
Bạn nên đọc thiết lập trong CP rồi "tuân thủ" các thiết lập đó. Tức code của bạn phải thao tác trên những thiết lập hiện hành.
Cái kiểu tự mình thay đổi các thiết lập của người chủ máy là không nên. Đối tác của bạn mà chạy code của bạn để rồi phải sửa lại thiết lập trong CP? Bạn chọn con đường có thể là dễ cho code của bạn nhưng đó là thói quen xấu. Máy của người ta và những thiết lập của người ta là cái thiêng liêng, không thể vì làm dễ cho mình mà thay đổi được. Bạn có thể nói: "nhưng tôi chỉ chạy code trên máy tôi, nhưng tôi chỉ thay đổi trên máy tôi". Nếu thế thì một ngày đẹp trời hãy bỏ ra 1 phút để thiết lập cho chuẩn trong CP của mình.

Tôi góp ý thế đề phòng bạn muốn thay đổi các thiết lập của người khác. Còn chuyện thay đổi bằng code không phải là không làm được.
 
Upvote 0
Theo tôi bạn làm thế không được.
Bạn nên đọc thiết lập trong CP rồi "tuân thủ" các thiết lập đó. Tức code của bạn phải thao tác trên những thiết lập hiện hành.
Cái kiểu tự mình thay đổi các thiết lập của người chủ máy là không nên. Đối tác của bạn mà chạy code của bạn để rồi phải sửa lại thiết lập trong CP? Bạn chọn con đường có thể là dễ cho code của bạn nhưng đó là thói quen xấu. Máy của người ta và những thiết lập của người ta là cái thiêng liêng, không thể vì làm dễ cho mình mà thay đổi được. Bạn có thể nói: "nhưng tôi chỉ chạy code trên máy tôi, nhưng tôi chỉ thay đổi trên máy tôi". Nếu thế thì một ngày đẹp trời hãy bỏ ra 1 phút để thiết lập cho chuẩn trong CP của mình.

Tôi góp ý thế đề phòng bạn muốn thay đổi các thiết lập của người khác. Còn chuyện thay đổi bằng code không phải là không làm được.

Rất cảm ơn những ý kiến của bạn, nhưng ở đây mình sử dụng code là vì không phải ai cũng biết cách chỉnh sửa trong control panel, mình thấy thay đổi thiết lập trong CP bằng code sẽ thích hợp trong trường hợp này. Code sẽ đưa ra 1 thông báo cho người dùng biết rằng nếu họ đồng ý với những thay đổi như thế thì code sẽ tự động làm việc thay cho họ.
Ý tưởng là như thế nên rất mong các thầy và các bạn giúp đỡ
 
Upvote 0
... sử dụng code là vì không phải ai cũng biết cách chỉnh sửa trong control panel, mình thấy thay đổi thiết lập trong CP bằng code sẽ thích hợp trong trường hợp này. Code sẽ đưa ra 1 thông báo cho người dùng biết rằng nếu họ đồng ý với những thay đổi như thế thì code sẽ tự động làm việc thay cho họ.
...

Tôi mua cho con tôi một chiếc xe tăng. Khi hàng xóm thắc mắc thì tôi nói "con tôi nó lái xe yếu lắm, sắm xe tăng cho nó chạy đỡ bị móp méo khi cọ quẹt"

Gặp người không biết chỉnh CP mà bảo họ dùng code để chỉnh có khác nào bảo họ giao trứng cho ác? Ví dụ điển hình nhất là nhỡ code bị kẹt gì đó thì làm sao người ta biết tự chỉnh lại? (Code sửa config, chạy xong thì reset lại. Nhưng nếu nó chỉ chạy nửa chừng rồi kẹt thì ai reset?)

tb. Tôi nói chung cho các bạn khác cần học cách sử dụng code. Chứ tôi biết bạn đã quyết ý rồi, có trời mà phân trần.
 
Lần chỉnh sửa cuối:
Upvote 0
Rất cảm ơn những ý kiến của bạn, nhưng ở đây mình sử dụng code là vì không phải ai cũng biết cách chỉnh sửa trong control panel, mình thấy thay đổi thiết lập trong CP bằng code sẽ thích hợp trong trường hợp này. Code sẽ đưa ra 1 thông báo cho người dùng biết rằng nếu họ đồng ý với những thay đổi như thế thì code sẽ tự động làm việc thay cho họ.
Ý tưởng là như thế nên rất mong các thầy và các bạn giúp đỡ

Thế sao bạn không viết code cho phù hợp với mọi thiết lập trong Control Panel (nếu bạn chưa viết được thì.. cố suy nghĩ thêm)
Tôi thì rất ghét chương trình nào can thiệp tùm lum trong hệ thống của tôi. Gặp mấy chương trình này, tôi dẹp ngay lập tức
 
Upvote 0
Thế sao bạn không viết code cho phù hợp với mọi thiết lập trong Control Panel (nếu bạn chưa viết được thì.. cố suy nghĩ thêm)
Tôi thì rất ghét chương trình nào can thiệp tùm lum trong hệ thống của tôi. Gặp mấy chương trình này, tôi dẹp ngay lập tức

Tại thấy cái chương trình A-Excel của thầy Nguyễn Duy Tuân có cái tính năng tự chỉnh control panel hay quá với lại cũng cần áp dụng cho chương trình của mình nên mạn phép lên đây học hỏi, mà nhận được nhiều góp ý của mọi người là ko nên sử dụng, thôi đành tự tìm hiểu thôi, cũng xin cảm ơn mọi người đã dành chút thời gian ghé qua và cho ý kiến, xin chân thành cảm ơn
 
Upvote 0
Tại thấy cái chương trình A-Excel của thầy Nguyễn Duy Tuân có cái tính năng tự chỉnh control panel hay quá với lại cũng cần áp dụng cho chương trình của mình nên mạn phép lên đây học hỏi, mà nhận được nhiều góp ý của mọi người là ko nên sử dụng, thôi đành tự tìm hiểu thôi, cũng xin cảm ơn mọi người đã dành chút thời gian ghé qua và cho ý kiến, xin chân thành cảm ơn
Sau khi nhận được góp ý của 2 bậc tiền bối là siwtomndu96081631 mà thấy bạn còn rất quyết tâm. Nên trước tiên mình xin phép siwtomndu96081631 cho mình đưa đoạn code, có thể đáp ứng được yêu cầu của bạn. Tốt nhất là trước khi chạy chương trình của bạn, thì bạn hãy lưu lại những thiết lập mà bạn sẽ thay đổi để khi thoát chương trình thì bạn trả về giá trị cũ.
Mã:
Sub SetCP()
Const HKEY_CURRENT_USER = &H80000001
Set objReg = GetObject("winmgmts:\root\default:StdRegProv")
        strKeyPath = "Control Panel\International"
        'Decimal symbol
        strValueName1 = "sDecimal"
        strValue1 = "."
        'Digit grouping symbol
        strValueName2 = "sThousand"
        strValue2 = ","
        'Short date
        strValueName3 = "sShortDate"
        strValue3 = "dd/MM/yyyy"
        objReg.SetStringValue HKEY_CURRENT_USER, strKeyPath, strValueName1, strValue1
        objReg.SetStringValue HKEY_CURRENT_USER, strKeyPath, strValueName2, strValue2
        objReg.SetStringValue HKEY_CURRENT_USER, strKeyPath, strValueName3, strValue3
End Sub
 
Upvote 0
... Tốt nhất là trước khi chạy chương trình của bạn, thì bạn hãy lưu lại những thiết lập mà bạn sẽ thay đổi để khi thoát chương trình thì bạn trả về giá trị cũ.
...

Đáng lẽ code của bạn nên chứa luôn phần ghi lại giá trị hiện hành và trả về sau khi không cần nữa.

Tuy nhiên tôi đã cảnh báo làm cái này cũng như lái xe tăng trên đường phố. Nó không giản dị "đổi giá trị cho thích hợp, xài xong thì trả về giá trị cũ" đâu!
- Nếu trong lúc bạn đang chạy code này, bạn đồng thời cũng có một chương trình khác thì sao? Cái gì đảm bảo cho bạn là chương trình thứ 2 không bị ảnh hưởng?
- Ngược lại, nếu trong lúc bạn đang chạy code này nhưng có một chương trình khác đổi nó đi thì sao? Bạn đã có 1 chương trình can thiệp vào Control Panel thì ai có thể đảm bảo là bạn không có chương trình thứ 2 cũng can thiệp?

Tôi không đặt vấn đề ở chỗ dễ hay khó, làm được hay không được.
Tôi chủ ý đặt câu hỏi "người ra sáng kiến có suy nghĩ về quy mô và giới hạn của công việc chưa?"
 
Upvote 0
Đáng lẽ code của bạn nên chứa luôn phần ghi lại giá trị hiện hành và trả về sau khi không cần nữa.
Mình nghĩ khi nào thoát phần mềm thì người ta mới không cần dùng nữa. Hơn nữa vì thấy bạn ấy rất quyết tâm và chưa làm được nên mới đưa đoạn code thôi. Thành thật xin lỗi, có gì nhờ MOD xóa giúp. Thanks!
 
Upvote 0
Tại thấy cái chương trình A-Excel của thầy Nguyễn Duy Tuân có cái tính năng tự chỉnh control panel hay quá với lại cũng cần áp dụng cho chương trình của mình nên mạn phép lên đây học hỏi, mà nhận được nhiều góp ý của mọi người là ko nên sử dụng, thôi đành tự tìm hiểu thôi, cũng xin cảm ơn mọi người đã dành chút thời gian ghé qua và cho ý kiến, xin chân thành cảm ơn

Bạn nói là nhiều người không biết thao tác trong CP? Có lẽ bạn nói đùa?

Đã đến nước này, tức khi bạn voquangsu đã đưa ra code, thì tôi làm luôn cho bạn.

Vì làm như bạn voquangsu là thiếu. Xin đọc điểm 2 dưới đây.
--------------
Việc thay đổi các thiết lập của system không khó. Tôi cũng đã từng trao đổi với một bạn từ GPE về vấn đề này. Phải có 2 bước:

1. Thay đổi bằng code các thiết lập
2. Thông báo cho các ứng dụng trong system là đã có sự thay đổi để chúng cập nhật.

Ta xét 1 ví dụ.
Giả sử giờ nghỉ trưa được ghi trên bảng. Và giờ nghỉ trưa này có thể thay đổi. Như vậy mỗi nhân viên khi đến cơ quan sẽ kiểm tra giờ nghỉ trưa trong ngày. Nếu trước giờ nghỉ trưa sếp quyết định thay đổi giờ nghỉ trưa hôm đó thì sau khi sửa đổi phải thông báo cho mọi người biết để họ "cập nhật" kế hoạch của mình.

Khi ta thay đổi trực tiếp trong CP thì các applet *.cpl sẽ gửi thông điệp tới tất cả các ứng dụng trong system. Khi ta dùng code thay đổi các thiết lập thì tự ta phải gửi thông điệp, không ai làm hộ ta cả.

Nếu ta không gửi thông điệp thì sau khi thay đổi phải đóng Excel và mở lại thì những dữ liệu đã có trên sheet mới cập nhật vì Excel đọc các thiết lập trong system khi khởi động. Mà không gửi thông điệp cũng có nghĩa là các ứng dụng khác trong system không biết để mà cập nhật.

Cũng cần nói về các cảnh báo của bạn VetMini. Đã làm thì phải làm cho chuẩn. Tất nhiên bạn chỉ có thể làm tròn bổn phận của mình thôi. Còn nếu có 1 ứng dụng nào đó thay đổi thiết lập nhưng không thông báo cho các ứng dụng khác biết để cập nhật thì bạn cũng bó tay, làm sao can thiệp được.
Người ta không thông báo thì Excel của bạn không cập nhật, thế thôi. Vậy nếu bạn đã làm thì phải thông báo, phải làm tròn phần việc của mình.

Để cập nhật mà không cần đóng và mở lại Excel thì tôi đã thử gửi thông điệp

Mã:
SendMessage HWND_BROADCAST, WM_SETTINGCHANGE, 0, 0

Nhưng các dữ liệu đã có trên sheet không cập nhật.

Tất nhiên nếu ta viết program trong vd. VB và chỉ có 1 dòng code như trên thì khi kích hoạt EXE thì Excel tự cập nhật mà không cần đóng / mở.

Như vậy nếu ta "đứng ở ngoài Excel" và "loa loa, đã có thay đổi" thì Excel cập nhật bình thường (và tất nhiên mọi ứng dụng trong system cũng thế). Nhưng nếu ta "đứng ở trong Excel" và "loa loa, đã có thay đổi" thì Excel lại không cập nhật.

Nếu bạn nào có cách giải quyết "lịch sự, đẹp" thì chia sẻ nhé.

Hiện tại ta có thể làm như sau: ta kích hoạt Excel lần nữa và mở tập tin "tạm thời" (do lưu tập tin hiện hành thành tập tin tạm thời trên đĩa) vd. với tên secret_temp.xls. Trong Auto_Open của tập tin ta kiểm tra xem tên tập tin có phải là secret_temp.xls không, nếu có thì code sẽ gửi thông điệp ở trên. Tức ta đứng ở Excel thứ 2, tức đứng ngoài Excel chính, để "loa loa, đã có thay đổi". Sau khi "loa loa" thì Excel "loa loa" sẽ tự thoát, chỉ còn lại Excel với tập tin chính đã được cập nhật.

Nếu không cần cập nhật ngay thì chỉ cần làm điểm 1 ở trên. Tức trong code ví dụ trong Sub TestSet thì

bỏ dòng.

Mã:
broadcast_settingchange

Nhưng như thế là các ứng dụng khác không biết được là thiết lập thay đổi để cập nhật.

Xin chú ý là tập tin chính, và do vậy cả tập tin tạm thời, có Sub Auto_Open. Vậy nếu trong tập tin thực ta cần có code trong Auto_Open thì phải viết thêm vào code hiện đã có trong Auto_Open.
------------
1. Tập tin có cả đọc (Get) các thiết lập. Nếu bạn dùng Excel để đọc thì nghiên cứu Application.International

2. Về đọc thông tin cũng nên xem bài tôi đã viết

http://www.giaiphapexcel.com/forum/...quả-là-các-thứ-trong-tuần&p=548360#post548360
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0

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

Back
Top Bottom