PDA

View Full Version : Giúp mình về định dạng ngày tháng với!



trungtn1005
02-03-07, 02:38 AM
Các bạn cho mình hỏi trong Excel bây giờ mình có 1 cột ngày tháng đã đánh theo kiểu tháng/ngày/năm rồi và yêu cầu bắt buộc phải làm sao để định dạng lại cột đó theo kiểu ngày/tháng/năm như Việt Nam. Các bạn giúp mình nhé, tối mai thi rồi.Thanks trước!

nvson
02-03-07, 07:43 AM
Chọn cột đó, nhấn Ctrl+1
Trong tab Number chọn Custom, trong phần Type bạn đánh định dạng là dd/mm/yyyy rồi nhấn OK.

trungtn1005
02-03-07, 09:14 AM
Bạn ơi không phải rồi bạn à.Có thể bạn không hiểu ý mình rùi.Nghĩa là các cột đã gõ sẵn rồi ví dụ: 5/23/98 thì nó là ngày 23 tháng 5 năm 98 giờ làm sao chuyển nó thành 23/5/98 bạn ạ.MÌnh đã làm theo cách của bạn nhưng không được.

ruadangyeu
02-03-07, 10:11 AM
Cách của anh Sơn thực hiện tốt đấy chứ!
Hoặc là bạn làm thế này
vào format/cells/number/date/
trong mục locale (location)
chọn French (belgium)

Thân!

hai2hai
03-03-07, 10:44 AM
Làm thế nào để đổi tất cả dạng số (mà mọi người đã định trong Excel là kiểu Numeric có dạng ăn theo Regional Settings) trong Excel thành dạng #.###,00 (theo mẫu của nhà nước) mà không được đổi định dạng chuẩn trong Regional Settings của Windows.

Tương tự việc làm trên cho Date format (đổi thành dạng dd/mm/yyyy cho dù ở Regional Settings vẫn đặt là mm/dd/yyyy)

Với điều kiện là đổi 1 cái, về sau tất cả các file Excel mở ra phải ăn theo format ở trên cho dù Regional Settings của Windows vẫn ở dạng chuẩn của nó.

Lý do: Mấy cái biến kiểu date trong VB nó cứ ăn theo hệ thống nên rất khó sử như Format$(dteDate, "dd/mm/yyyy") nhưng khi ở ngoài cứ thay đổi format thì giá trị dteDate có kiểu Date lại thay đổi theo nên cứ phải đổi thành biến String hết. Nhưng khi chuyển thành String thì không sử dụng được các hàm sử lý liên quan đến Date như dteDate + 1 chẳng hạn).

Đây cũng là 1 bài tập dành cho các bạn lập trình trong VB nhé (Thay đổi Regional Settings của Windows thì không ảnh hưởng gì đến DateTime, Numeric trong chương trình VB)

tthntdm
03-03-07, 09:35 PM
Bạn nvson và ruadangyeu chỉ cho bạn như thề là rõ rồi, nhưng bạn phải điều chỉnh lại trong máy của mình thì nó mới cho hiện ra đúng dạng ngày tháng vn được. Vào Start - Settings - control Panel, nhấp đúp vào Regional And Language. Trong thẻ Regional Option chọn Customize, chọn tiếp thẽ Date, gõ vào ô Short date format là dd/MM/yy (nếu năm có 2 chữ số) hay yyyy nếu muốn năm có 4 chữ số. chúc bạn thành công.

hai2hai
03-03-07, 11:05 PM
Vào Start - Settings - control Panel, nhấp đúp vào Regional And Language. Trong thẻ Regional Option chọn Customize, chọn tiếp thẽ Date, gõ vào ô Short date format là dd/MM/yy (nếu năm có 2 chữ số) hay yyyy nếu muốn năm có 4 chữ số. chúc bạn thành công.

Làm thế (thay đổi định dạng trong Regional Settings) thì ai mà chẳng làm được. Bạn ko đọc cái dòng tôi in đậm à. Không được đổi Regional Settings trong Control Panel! Nếu bạn làm foxpro rồi thì bạn biết sẽ có mấy dòng lệnh làm cho cả môi trường lập trình của Fox độc lập với môi trường của Windows. Ý tôi là trong Excel có options nào để nó thay đổi được cái format của các định dạng số và ngày tháng 1 cách tự động theo định dạng do mình đặt ra cho tất cả các cột có định dạng số hoặc dạng date chứ ko phải là thay đổi format cho vùng lựa chọn trên 1 file cụ thể nào đó. Còn nếu dùng customized formats thì làm sao mà thuyết phục được tất cả khách hàng đổi tất cả định dạng trong các files excel của họ chỉ để chạy ứng dụng của mình. Hầu như tất cả các khách hàng đều thay đổi hết định dạng trong Regional Setting làm cho các phần mềm khác (thường dựa theo chuẩn định dạng ban đầu của Windows để chạy) đều chạy ko được đúng.

Vì thế tôi mới nói là các bạn làm lập trình hãy thử care đến vấn đề độc lập với môi trường hệ điều hành mà một trong những thứ đó là độc lập định dạng với môi trường của HĐH.

Mà thôi, nói vấn đề này ra mọi người chắc không rõ lắm đâu vì ít ai phải đương đầu với tình huống này vì đại đa số mọi người chỉ làm Excel thôi thì muốn chỉnh Windows thế nào mà chẳng được (mà hầu hết mọi ứng dụng của Microsoft và các ứng dụng khác đều ăn theo Hệ điều hành Windows). Chắc là Excel ko làm được đâu vì trong VB/VBA làm gì có lệnh kiểu như Set Default Date/Time/Numeric format cho cả môi trường.

PS: Hiểu nhầm tthntdm vì bạn post bài mà ko Quote để biết bạn trả lời ai. Sorry nhé :)

SA_DQ
04-03-07, 05:43 AM
Bạn nói mà chẳng hiểu người ta đặt vấn đề gì cả.
Có vậy 2Hai2 mới rút ruột . . . cho mọi người đó mừ!!! Xin cảm ơn Hai2Hai nhiều nha!

Trời ngoài í còn lạnh không; khi nào bưu điện nhận gởi nắng, trong ni gởi cho ít làm quà đầu xuân!

Chúc mọi người như í nhân dịp xuân về!

hai2hai
04-03-07, 11:51 PM
Có vậy 2Hai2 mới rút ruột . . . cho mọi người đó mừ!!! Xin cảm ơn Hai2Hai nhiều nha!

Trời ngoài í còn lạnh không; khi nào bưu điện nhận gởi nắng, trong ni gởi cho ít làm quà đầu xuân!

Chúc mọi người như í nhân dịp xuân về!


Vâng, có lẽ do 222 này hơi kỳ vọng cao quá (hay nói đúng hơn là hơi ...gàn gàn) nên hay rút ruột (và thỉng thoảng yêu cầu này nọ linh tinh hơi ... ko thực tế cho lắm - vì cứ nghĩ ai cũng ở hoàn cảnh như mình :)). Kể ra cái tính này cũng cần phải sửa thôi chứ ko thì hỏng việc. Mà luyện mãi rồi vẫn chưa thành công. Cảm ơn bác SA_DQ đã nhắc nhở em. Thanks!

Ở các lứa tuổi khác nhau, thậm chí ở cái thời kỳ Internet này thì chỉ chênh nhau khoảng 5 tuổi thôi cũng đã có suy nghĩ khác nhau, cũng đã tạo nên 1 generation gap rồi - chứ đừng nói là chênh nhau tới 20 tuổi hay 30 tuổi. Tương tự như vậy, ở những hoàn cảnh, vùng miền, ngành nghề khác nhau cũng đã tạo ra những suy nghĩ, những tính cách hoàn toàn khác nhau - thế mới có thế giới muôn màu muôn vẻ. Mà màu nào, vẻ nào cũng có cái hay, cái dở của nó cả. Liên thiên 1 tý chẳng biết mọi người có cho phép ko nhưng chắc mục này đưa vào tâm sự quá. :)

PS: Trời ngoài này mấy hôm nay đã không còn lạnh nữa. Nhưng mà hay mưa bất chợt quá bác ạ! :)

Đào Việt Cường
05-03-07, 12:53 AM
Các bạn cho mình hỏi trong Excel bây giờ mình có 1 cột ngày tháng đã đánh theo kiểu tháng/ngày/năm rồi và yêu cầu bắt buộc phải làm sao để định dạng lại cột đó theo kiểu ngày/tháng/năm như Việt Nam. Các bạn giúp mình nhé, tối mai thi rồi.Thanks trước!
Dear all,
--------
Vấn đề này em cũng đã từng gặp khi phải xử lý số liệu kế toán giúp một người bạn. Vì bạn đó là "người mới bắt đầu" nên đã dùng theo chuẩn định dạng của hệ thống (MM/dd/yyyy) để nhập liệu vào cột 'Ngày chứng từ' và 'Ngày ghi sổ' mà không biết rằng giá trị mà mình đưa vào đã bị đảo ngược trật tự ngày tháng. Ví dụ: muốn có hiển thị ngày 01/03/2006 (Value= 38.777) thì bạn đó nhập 03/01/2006 (Value = 38.720) mà không biết rằng đó là ngày 01 tháng 03 năm 2006, những ngày sau ngày 12 tháng thì chuyển thành Text bằng cách thêm dấu nháy đơn (').
Việc cập nhật dữ liệu như vậy sẽ rất tai hại, ảnh hưởng lớn đến việc tổng hợp số liệu phát sinh của từng tháng. Nhấn mạnh rằng ngay cả khi chúng ta đã chuyển định dạng ngày hệ thống về 'dd/MM/yyyy' thì kết quả cũng không được đúng như ý muốn.
Có lẽ trungtn1005 cũng giống như bạn em, không biết tí gì về lập trình, thậm trí không biết Regional Options nằm ở đâu, thiết lập Short Date Format như thế nào (thì mới đăng bài vào chuyên mục "Excel dành cho người mới bắt đầu"). Và yêu cầu của bạn trungtn1005 chỉ là làm sao chuyển lại con số 38.720 thành 38.777.
Cách mà em đã convert như sau:
NgayCT= If(IsText(NgayCT);Value(NgayCT);Date(Month(NgayCT) ; Day(NgayCT); Year(NgayCT)))
Diễn giải:
Nếu ngày chứng từ có kiểu dữ liệu là Text thì ngày chứng từ được convert thành Value. Nếu sai thì đảo thứ tự: tháng chuyển thành ngày, ngày chuyển thành tháng.
Trong lập trình VBA, em thấy rằng cũng ít ai giỏi Excel đến mức Set được Short date format vì đối với họ, chỉ cần thiết lập giá trị này thủ công, duy nhất một lần là được rồi. Nếu mà có yêu cầu bắt họ không được can thiệp như vậy thì chắc là cũng phải vắt óc ra thôi:

Dim strDate As String, dtDate As Date
strDate = Date
dtDate = IIf(strDate <> Format(strDate, "dd/mm/yyyy"), DateSerial(Year(strDate), Month(strDate), Day(strDate)), CDate(strDate))

hai2hai
05-03-07, 01:10 AM
Hi Cường,

Thực ra ban đầu là anh cũng định hỏi thôi vì anh gặp trục trặc là KH của anh họ chuyển hết Regional settings sang dạng khác với ban đầu của Windows làm cho các ứng dụng của anh ... ko hoạt động đúng vì khi làm anh toàn làm ở chế độ chuẩn (thế mới chết chứ). Mình cũng ko bảo được KH là ko được thay đổi format ở Regional Settings được vì đó là quyền của họ trừ phi ... họ để nguyên file Excel của họ (Họ có làm VBA bao giờ đâu, chỉ là format các cột trong file của họ thôi) và chỉ thay đổi định dạng format của cái date/numeric của Excel theo ý của người dùng là... tất cả các file excel khi mở ra sẽ thay đổi theo chứ ko cần phải thay đổi regional settings nữa (ý tưởng y chang như Foxpro - anh nghe nói là fox làm được thế thôi chứ có làm Fox bao giờ đâu).

Nhưng có điều chắc là ko thể làm thế được trong Excel (vì nếu làm được thì đã nhiều người làm rồi). Vì thế chắc là phải thay đổi trong CT của mình thôi. (Chỉ có điều code nhiều quá rồi, thay đổi cũng hơi tốn công vì đâu chỉ sử lý mỗi format ở dòng lệnh mà còn cả trong các controls, reports, database nữa. Mọi cái nó đều ăn theo Windows mới chuối chứ).

Thực ra việc anh đặt câu hỏi ở trên ra chủ yếu là nhắc nhở những ai lăm le muốn làm ứng dụng thôi (nhất là muốn làm ứng dụng cho ... muôn vạn người dùng chứ ko chỉ cho 1 vài KH). Làm dâu trăm họ mới khó chứ còn làm dâu của 1 nhà thì đâu có gì.

Thôi đi ngủ thôi Cường, anh thấy em cũng lọ mọ đêm khuy thế :)

saudiec
06-04-07, 10:27 PM
Xin giới thiệu với các bạn Quick Date Entry (QDE) một add-in định dạng ngày tháng trong Excel. Mục đích chính của nó là giúp đỡ người "làm biếng" nhập ngày tháng nhanh hơn. Thí dụ khi bạn gõ 112 sẽ thành 11 Feb 2007 theo kiểu châu Âu (khi set Date là priority), hoặc sẽ thành 2 Nov 2007 theo kiểu Mỹ (khi set Month là priority). Dĩ nhiên cần phải setting trước khi xử dụng.
Tôi post lên để các cao thủ lập trình nghiên cứu xem có thể dùng nó giải bài toán ngày tháng lộn xộn mà bạn hai2hai đã nêu trên không.
Vui lòng đọc file "Quick Date Entry.chm" trong gói zip đính kèm.

Đào Việt Cường
06-04-07, 10:37 PM
Dear saudiec,
-------------
Em chưa xem qua file đính kèm nhưng em đoán là không khả thi lắm:
Chắc em chẳng thể "làm biếng" được nếu em muốn diễn đạt 112 là ngày mùng 1 tháng 12 chứ không phải là ngày 11 tháng 2. Làm sao để giải quyết những vấn đề này nhỉ?
Để em ngó qua xem sao đã!

saudiec
07-04-07, 08:37 AM
Dear saudiec,
-------------
Em chưa xem qua file đính kèm nhưng em đoán là không khả thi lắm:
Chắc em chẳng thể "làm biếng" được nếu em muốn diễn đạt 112 là ngày mùng 1 tháng 12 chứ không phải là ngày 11 tháng 2. Làm sao để giải quyết những vấn đề này nhỉ?
Để em ngó qua xem sao đã!
Dear Cường,
Khi xử dụng QDE, mở file Excel nó yêu cầu active worksheet để bật các chức năng nhập ngày tháng của nó, sau đó quét chọn để xác định vùng nhập liệu (QDE sẽ hiểu là ngày tháng sẽ được nhập vào vùng đó). Bảng Date priority là nơi thiết đặt kiểu gõ (có thể là 3, 5, 7 ký tự) và cách thức QDE hiển thị ngày tháng. Bạn xem hướng dẫn dứoi đây (tôi trích từ file chm của QDE)

"Remember, that in the examples given below, a European date format (dd/mm/yy) is assumed for the dates.

DatePriority determines whether the priority in 3, 5 or 7 digit date inputs is for the days or for the month. To illustrate this, consider a QDE input string of '11204', is this a date of 1 Dec 2004, or 11 Feb 2004? If the DatePriority setting is set to True, the 2 digits will be assumed to relate to the month (that is 1 Dec 2004), if set to False, the 2 digits will be assumed for the days (that is 11 Feb 2004)."

Tôi đã thử trên máy của tôi. Có thể nhập ngày tháng theo kiểu "làm biếng" được. Cách nhập ngày tháng theo kiểu "dd/mm/yy" khá phổ biến ở Việt Nam, add-in nầy có thể hữu ích phần nào. Tuy nhiên vấn đề là file Excel của mình khi chạy trên máy tính khác không có QDE thì sao? Tôi chưa kiểm chứng được. QDE có đề cập đến de-activated worksheet khi gởi file qua các máy tính khác, khi de-activated, code của nó sẽ bị remove khỏi file. Bạn thử nghiên cứu vấn đề nầy xem sao.
Chúc bạn vui.

ltmcustoms
03-09-07, 01:56 AM
Trích
Tôi đã thử trên máy của tôi. Có thể nhập ngày tháng theo kiểu "làm biếng" được. Cách nhập ngày tháng theo kiểu "dd/mm/yy" khá phổ biến ở Việt Nam, add-in nầy có thể hữu ích phần nào. Tuy nhiên vấn đề là file Excel của mình khi chạy trên máy tính khác không có QDE thì sao? Tôi chưa kiểm chứng được. QDE có đề cập đến de-activated worksheet khi gởi file qua các máy tính khác, khi de-activated, code của nó sẽ bị remove khỏi file. Bạn thử nghiên cứu vấn đề nầy xem sao.
Chúc bạn vui.[/quote]
SAUDIEC

+-+-+-+|||||
Kính chào các cao thủ GPE !
Mấy hồi nay em đang theo đuôi vụ nhập ''Ngày/Tháng/Năm" đến ... không yên!
em muốn trợ giúp cho anh em ở cơ quan hàng ngày trực ca làm việc khi nhập dd/mm/yyyy vào 2 cột (cách nhau - cột G và I) ở 1 sheet trong 1 File excel do em tạo ra, nhưng họ đã quá quen với kiểu nhập ddmmyy hoặc ddmmyyyy ở phần mềm khác trong hệ thống máy nghiệp vụ (Regional của HĐH buộc phải là M/D/YYYY). Theo thiển nghĩ của em Excel cũng có thể làm được như các phần mềm khác chứ ạ, vì cùng chạy trong 1 môi trường mà!
Em đã thử Quick Date Entry (Chắc do Tây viết) do bác SAUDIEC (http://www.giaiphapexcel.com/forum/member.php?u=185) post nhưng khi nhập nó cứ loạn cả nên! Bác SAUDIEC (http://www.giaiphapexcel.com/forum/member.php?u=185) có thể hướng dẫn hoặc lưu ý cho em khai thác QDE được ko! Trong QDE dinh dang ngay 2002.zip (http://www.giaiphapexcel.com/forum/attachment.php?attachmentid=1077&d=1175873132) bác post có file "QDE 2002 WS Events" là Code của QDE phải ko ạ! em có chạy nó nhưng báo lỗi! em post lại nhờ các bác cao thủ xem và giúp sửa của Tây thành 1 Code của Ta nhé - Vấn đề ở trên em cũng đã nhờ bác ANHTUAN1066 giúp đỡ Code của bác ấy cũng rất hay và gần ra đc đáp số rồi mong các bác ngó qua nhé http://www.giaiphapexcel.com/forum/showthread.php?t=3338&page=3 ,
(Em có post file "ho_tro_nhap_ngay" trong đó kèm theo y/c) Em muốn 1 Code để khi nhập số liệu sao cho các cell ở 2 cột khi gõ DDMMYY(hoặc DDMMYYYY)-> DD/MM/YYYY định dạng là Date thì tốt còn ko đành Text vậy !?
Vấn đề ''dd/mm/yy" quả thực cũng gian nan! nhưng em thấy trong diễn đàn ta có nhiều cái phi thường lắm ! "d/m/y"chắc nhiều ng gặp phải, còn chỗ em thì thay nhau ngồi gõ DD/MM/YY "hết ngày này sang năm kia" !
Kính mong các bác sớm nghiên cứu, giúp đỡ em!
Thanks - **~**%#^#$ LTMCustoms

anhtuan1066
04-09-07, 11:38 AM
Với bạn Itmcustoms: Tôi thấy cái addIns QDE rất tốt mà, có gì rắc rối, bạn có thể nói rõ hơn dc ko?
ANH TUẤN

ltmcustoms
05-09-07, 03:30 PM
Với bạn Itmcustoms: Tôi thấy cái addIns QDE rất tốt mà, có gì rắc rối, bạn có thể nói rõ hơn dc ko?
ANH TUẤN Cám ơn bác đã quan tâm !
Em hỏi từng vấn đề 1 nhé ! Hi hi
Liệu có Code nào mà khi chạy chương trình EXCEL thì cho thay đổi Regional settings của Windows sang dạng dd/mm/yyyy và khí thoát ctrình thì lại về trạng thái ngầm định (m/d/yyyy) không ạ! Nếu được bác trợ giúp em nhé !
- Cái này cần thiết vì ở chỗ em mọi người "quá quen" tay với dd/mm/yyyy mà máy vẫn phải chạy chương trình của ngành lại là m/d/yyyy (tất nhiên là máy Client rùi) em muốn chỉ cần nói với họ là "thoát nó ra để chạy cái khác" ! hi hi ....
Thanks!

smbsolutions
05-09-07, 05:08 PM
Thực ra việc anh đặt câu hỏi ở trên ra chủ yếu là nhắc nhở những ai lăm le muốn làm ứng dụng thôi (nhất là muốn làm ứng dụng cho ... muôn vạn người dùng chứ ko chỉ cho 1 vài KH). Làm dâu trăm họ mới khó chứ còn làm dâu của 1 nhà thì đâu có gì.
He he, giờ tớ mới đọc cái bài này. Ông bức xúc cũng phải thôi vì ở đây có mấy ai làm ứng dụng đóng gói cho muôn người như ông hay tôi đâu. Tôi cũng vừa dính vụ liên quan tới múi giờ với vài khách hàng ở khu vực Châu Âu kia kìa. Ứng dụng chạy tả lả trên mấy nước và khi mà ở VN, buổi sáng nhân viên post được mấy chứng từ sáng ngày hôm nay thì ở bển họ thấy mãi ko hiện ra (vì ngày máy tính của họ vẫn còn là ngày hôm trước mà). Đó còn chưa kể cái vụ dấu chấm, dấu phẩy trong Regional Setting nữa chứ.


Liệu có Code nào mà khi chạy chương trình EXCEL thì cho thay đổi Regional settings của Windows sang dạng dd/mm/yyyy và khí thoát ctrình thì lại về trạng thái ngầm định (m/d/yyyy) không ạ! Nếu được bác trợ giúp em nhé !
- Cái này cần thiết vì ở chỗ em mọi người "quá quen" tay với dd/mm/yyyy mà máy vẫn phải chạy chương trình của ngành lại là m/d/yyyy (tất nhiên là máy Client rùi) em muốn chỉ cần nói với họ là "thoát nó ra để chạy cái khác"!
-------------------------------------------------------
'// API Declaration

Private Declare Function GetSystemDefaultLCID Lib "KERNEL32" () As Long
Private Const LOCALE_SSHORTDATE = &H1F ' short date format string
Private Declare Function GetLocaleInfo Lib "KERNEL32" Alias "GetLocaleInfoA" (ByVal Locale As Long, ByVal LCType As Long, ByVal lpLCData As String, ByVal cchData As Long) As Long
Private Declare Function SetLocaleInfo Lib "KERNEL32" Alias "SetLocaleInfoA" (ByVal Locale As Long, ByVal LCType As Long, ByVal lpLCData As String) As Long





Public Function ChangeRegionalDateFormat(ByVal strNewFormat As String, Optional ByRef strOldFormat As String) As Boolean
On Error GoTo ChangeRegionalDateFormat_Error

Dim sReturn As String
Dim sOldFormat As String
Dim ret As Long
Dim LCID As Long

'// Assume function fails
ChangeRegionalDateFormat = False

strOldFormat = vbNullString

LCID = GetSystemDefaultLCID()

ret = GetLocaleInfo(LCID, LOCALE_SSHORTDATE, sReturn, Len(sReturn))

If ret Then
'pad the buffer with spaces to create the size of memory buffer
sReturn = Space$(ret)
'and call again passing the buffer
ret = GetLocaleInfo(LCID, LOCALE_SSHORTDATE, sReturn, Len(sReturn))
'if successful (r > 0)
If ret Then
'Ret holds the size of the string
'including the terminating null
sOldFormat = left$(sReturn, ret - 1)
'//If LCase$(sOldFormat) <> LCase$(strNewFormat) Then
If sOldFormat <> strNewFormat Then
If Not IsMissing(strOldFormat) Then strOldFormat = sOldFormat '// Return old format
Call SetLocaleInfo(LCID, LOCALE_SSHORTDATE, strNewFormat)
End If
End If
End If

'// All's well - return True
ChangeRegionalDateFormat = True

ChangeRegionalDateFormat_Done:
On Error GoTo 0
Exit Function

ChangeRegionalDateFormat_Error:
'// Call Process_Error(MODULE_NAME, "ChangeRegionalDateFormat")
Resume ChangeRegionalDateFormat_Done
End Function


How to use:




Public Const fmtDATE_RegionalShortDateFormat = "MM/dd/yyyy" '// Chú ý chữ MM viết hoa nhé.
Public pstrOldRegionalDateFormat AS String

'// 1. When the program start:

'// Change Regional Setting
If Not ChangeRegionalDateFormat(fmtDATE_RegionalShortDate Format, pstrOldRegionalDateFormat) Then
'//MsgBox "Kh«ng thÓ thiÕt lËp ®­îc ®Þnh d¹ng ngµy th¸ng trong Regional and Language Options", vbExclamation, MSG_HDR_APP
End If
....

'// 2. When the program shutdown:
Call ChangeRegionalDateFormat(pstrOldRegionalDateFormat )


Nếu làm ngon hơn thì có thể log lại giá trị pstrOldRegionalDateFormat vào file log (hay file Ini) và khi thoát ra một cách bình thường thì xóa giá trị đó đi.

Nếu lúc start chương trình mà thấy giá trị đó vẫn có trong Log, INI thì tức là chương trình đã shutdown 1 cách bất bình thường (abnomally, kiểu như bị mất điện, hay bị killprocess chẳng hạn). Khi đó, giá trị pstrOldRegionalDateFormat phải là giá trị lấy trong file Log/Ini đó.

Không hiểu nói như vậy các bạn đã thấy rõ chưa nhỉ?

smbsolutions
05-09-07, 05:59 PM
Thực ra đây cũng là 1 ví dụ về việc cung cấp "cần câu" hay cung cấp "cá". Tớ thì có thể thích theo cách "cần câu" này hơn.

Giả sử tớ chưa có cái code ở trên thì tớ thinking theo cách này:

1. Làm thế nào để lấy format cũ trong Regional Settings nhỉ?

2. Lấy được format cũ rồi thì mình lưu nó theo cách nào để khi thoát chương trình ra mình lại update lại nhỉ?

3. Làm thế nào để "Set" format cho Regional Setting nhỉ? (Không chỉ mỗi Date)

4. Tiếng anh của cái việc đó có thể là gì nhỉ? Chắc là Set, Get, hay Change Regional Setting Format gì đó, hoặc có thể cụ thể hơn là. Mà ta cần code trong VB, VBA. Vậy ta cần tìm như thế nào nhỉ. Google thôi (hoặc sục trong đống Source Lib, API Lib để tìm) tỷ như: Google: "Change regional setting format" + DateFormat + Visual Basic + SourceCode (hoặc đại loại như thế)

Và ngày xưa tớ thực hiện theo cách đó. Đó chính là cái "cần câu" để tớ kiếm những con cá như vậy (và rất chủ động trong việc kiếm cá, chỉ khi nào không thể tự kiếm được cá thì sẽ lên mạng hỏi).

Nhân tiện bài này tớ giới thiệu một cách "giải quyết vấn đề" kiểu "cần câu" như vậy.

anhtuan1066
05-09-07, 08:00 PM
Quả đúng nếu là chỉ 1 mình mình xài thì ko thành vấn đề... còn làm đễ cho nhiều người khác xài thì thật nhức đầu... Mỗi người 1 ý khác nhau, khó lóng bắt dc họ theo ý mình (giống như câu nói khách hàng là thượng đế mà)...
Tôi ko biết các bạn chuyên về Excel sẽ lập trình như thế nào chứ riêng trong ngành tự động của tôi là luôn luôn chìu theo ý khách hàng chứ ko bao giờ bắt khách hàng làm theo chương trình có sẳn của chúng ta... Có khi họ đòi hỏi nhửng thứ tưởng chừng rất vô lý nhưng khi ta phục vụ dc sự vô lý này thì mới thấy cái ko thể vẩn trở thành có thể như thường
Với smbsolutions: Việc lấy Regional language settings trong Registry và import lại 1 setting khác theo ý mình bằng 1 file .REG hoặc .INF tôi nghĩ ko khó nhưng tôi ko biết nếu làm nó bằng Excel sẽ như thế nào? Mong dc chỉ giáo!
Mến
ANH TUẤN

tedaynui
06-09-07, 10:26 AM
Hi hi, vậy trong khi chờ đợi giải pháp tối ưu, em xin đưa ra cách làm thay đổi Regional Settings ở "trong rừng" của em nhé.
Mở Regional bằng câu lệnh Call Shell("rundll32.exe shell32.dll,Control_RunDLL intl.cpl,,1") và kết hợp với lệnh Sendkey.

Thân!
TDN

anhtuan1066
06-09-07, 11:00 AM
Ít ra cũng thế chứ... nói nhiều ko bằng 1 LÀM...
Thầy Phước ơi: nếu như để trích xuất date setting trong registry và import lại bằng file .REG thì tôi biết, còn làm nó bằng Excel thì sao? Bạn viết ngắn gọn quá tôi cũng ko biết phải làm thế nào... Có thể cho 1 file VD thật ngắn gọn dc ko? Đại khái nó phải làm dc như sau:
1> Máy tính tôi đang setting cái gì ko cần biết, nhưng khi chạy file excel thì nó tự động chuyển sang dd/mm/yy
2> Sau khi thoát khỏi excel thì trả về setting ban đầu (phần này có càng tốt, ko có cũng ko sao)
Mến
ANH TUẤN

tedaynui
06-09-07, 11:42 AM
Gởi anh Tuấn
1/ Trước mắt anh thử dùng đoạn code này để cài "dd/MM/yyyy"

Sub RegionalSettings()
Shell ("rundll32.exe shell32.dll,Control_RunDLL intl.cpl,,0")
SendKeys "{Tab}"
SendKeys "{Enter}"
SendKeys "+{Tab}"
SendKeys "{Right}{Right}{Right}{Right}{Tab}{Tab}"
SendKeys "{d}{d}{/}{M}{M}{/}{y}{y}{y}{y}"
SendKeys "{Enter}"
SendKeys "{Tab}{Tab}{Enter}"
End Sub2/ Còn việc khôi phục lại Setting ban đầu thì em chưa nghĩ ra, để em cố gắng nghĩ thêm. Hi hi

@ Anh dạy em cách trích xuất date setting trong registry và import lại bằng file .REG với. Cái này em hỏng biết. hi hi

Thân!
TDN

smbsolutions
06-09-07, 12:11 PM
Một số API làm việc với Registry



'// Registry API declarations
Private Declare Function RegCloseKey Lib "advapi32.dll" (ByVal hKey As Long) As Long

Private Declare Function RegCreateKeyEx Lib "advapi32.dll" Alias "RegCreateKeyExA" (ByVal hKey As Long, ByVal lpSubKey As String, ByVal Reserved As Long, ByVal lpClass As String, ByVal dwOptions As Long, ByVal samDesired As Long, lpSecurityAttributes As SECURITY_ATTRIBUTES, phkResult As Long, lpdwDisposition As Long) As Long

Private Declare Function RegQueryValueExString Lib "advapi32.dll" Alias "RegQueryValueExA" (ByVal hKey As Long, ByVal lpValueName As String, ByVal lpReserved As Long, lpType As Long, ByVal lpData As String, lpcbData As Long) As Long

Private Declare Function RegOpenKeyEx Lib "advapi32.dll" Alias "RegOpenKeyExA" (ByVal hKey As Long, ByVal lpSubKey As String, ByVal ulOptions As Long, ByVal samDesired As Long, hKeyHandle As Long) As Long

Private Declare Function RegSetValueEx Lib "advapi32.dll" Alias "RegSetValueExA" (ByVal hKey As Long, ByVal lpValueName As String, ByVal Reserved As Long, ByVal dwType As Long, lpData As Any, ByVal cbData As Long) As Long


Code làm việc với Registry có rất nhiều trên Internet (nhiều đến mức ko đếm xuể) nên tớ nghĩ ko cần chỉ rõ cách Google thế nào.

Khi mình export cái đoạn cần export ra file reg. Dùng notepad để view xem key và value nó là gì.

Tuy nhiên, nếu dùng Registry thì có thể (thông thường) nó ko take effect ngay lập tức.

Và không ai dùng
Shell ("rundll32.exe shell32.dll,Control_RunDLL intl.cpl,,0")
Rồi send mấy cái Tab như trên cả.

Đoạn code ở bài trước của tớ rõ như trong tranh rồi cơ mà. Mình ko hiểu phải giúp thế nào để có thể rõ hơn nữa. Thực sự sợ rồi. Post bài mà ko dám quay lại đọc nữa.

anhtuan1066
06-09-07, 12:30 PM
Thực ra khi viết bài này tôi cũng chưa từng làm công việc Import và Export Regional Language Options vào Registry nhưng tôi biết hướng làm... Ngay khi đọc bài của bạn tôi bắt tay vào làm ngay... Quy trình công việc tôi thực hiện như sau (tự bạn cũng có thể làm dc)
1> Start\Run\Regedit
2> Chọn My Computer, bấm Ctrl + F gõ vào dd/MM/yy (cái này tùy máy bạn à nha, nếu máy tính bạn đang set MM/dd/yy thì gõ vào MM/dd/yy)... Mục đích là tìm ra dc cái KEY chứa thông tin về Regional Language Options
3> Enter cho nó tìm, và trên máy tính của tôi, nó đã tìm dc đến đường dẩn sau đây:
[HKEY_CURRENT_USER\Control Panel\International]
4>Right click trên key International chọn Export, đặt tên và lưu file này vào 1 nơi nào đó... Xong thao tác EXPORT
5> Bây giờ Right click trên file .REG vừa lưu, chọn Edit... File dc mở ra trong cửa sổ Notepad, bạn thích đổi cái gì thì tùy bạn... Chẳng hạn trong trường hợp này tôi đổi MM/dd/yy thành dd/MM/yy
6> Đóng và lưu file lại... Tiếp tục Right click trên file, chọn Merge... OK 2 lần
Vậy là bạn vừa làm xong thao tác IMPORT thông tin mình muốn vào Registry rồi đấy! hi... hi... Ko tin bạn cứ vào Control Panel kiểm tra thử... Chắc ăn 100%
Tôi Export sẳn file, bạn có thể tải về nghiên cứu
Mến
ANH TUẤN

smbsolutions
06-09-07, 01:33 PM
Thực ra khi viết bài này tôi cũng chưa từng làm công việc Import và Export Regional Language Options vào Registry nhưng tôi biết hướng làm... Ngay khi đọc bài của bạn tôi bắt tay vào làm ngay... Quy trình công việc tôi thực hiện như sau (tự bạn cũng có thể làm dc)
1> Start\Run\Regedit
2> Chọn My Computer, bấm Ctrl + F gõ vào dd/MM/yy (cái này tùy máy bạn à nha, nếu máy tính bạn đang set MM/dd/yy thì gõ vào MM/dd/yy)... Mục đích là tìm ra dc cái KEY chứa thông tin về Regional Language Options
3> Enter cho nó tìm, và trên máy tính của tôi, nó đã tìm dc đến đường dẩn sau đây:
[HKEY_CURRENT_USER\Control Panel\International]
4>Right click trên key International chọn Export, đặt tên và lưu file này vào 1 nơi nào đó... Xong thao tác EXPORT
5> Bây giờ Right click trên file .REG vừa lưu, chọn Edit... File dc mở ra trong cửa sổ Notepad, bạn thích đổi cái gì thì tùy bạn... Chẳng hạn trong trường hợp này tôi đổi MM/dd/yy thành dd/MM/yy
6> Đóng và lưu file lại... Tiếp tục Right click trên file, chọn Merge... OK 2 lần
Vậy là bạn vừa làm xong thao tác IMPORT thông tin mình muốn vào Registry rồi đấy! hi... hi... Ko tin bạn cứ vào Control Panel kiểm tra thử... Chắc ăn 100%
Tôi Export sẳn file, bạn có thể tải về nghiên cứu
Mến
ANH TUẤN Đó là cách bạn làm kiểu manual (bằng tay chứ không phải làm bằng phần mềm). Thay vì "Right click trên file, chọn Merge... OK 2 lần", ta phải thực hiện phần mềm lúc phần mềm khởi động và lúc thoát phần mềm thì restore lại. Còn làm với 2 file reg như vậy thì chỉ nhanh hơn vào control panel, regional setting... 2 tý thôi. Hình như bạn ko để ý gì đến cách lập trình mà tớ đã giới thiệu ở mấy bài trên nhỉ?

Về vấn đề "Cá" và "Cần câu". Đó là phép ví von của tôi về việc hướng dẫn mọi người giải quyết vấn đề (tôi cũng hay đi "xin cá" nhưng đó là ở trường hợp tôi "câu" mãi mà "cá" ko "cắn").

Thông thường bao giờ tôi cũng "câu" trước khi xin "cá" (trừ khi có tiền "mua cá"). Nhưng kể cả lúc có tiền "mua cá" thì cũng ko sướng/hứng thú bằng việc sắm "cần" đi "câu" (các tỷ phú trên thế giới thường hay sắm tàu xịn để ra khơi câu cá nhằm hưởng thụ cuộc sống mà).
Gút lại vấn đề: Diển đàn này là CHIA SẼ, tranh luận là đễ tìm ra chân lý trong khoa học, nếu ai đó vì 1 lời nói mà tự ái bỏ diển đàn ra đi thì tôi nghĩ họ quá hẹp hòi rồi...

Ôi trời, mạng thì đã chậm mà...mất thời gian quá. Đành phải xin lỗi Mr Okebab vậy nhé. :(

AnhTuan1066 thử nghĩ 1 phút trước khi post bài xem. Thật đấy.

anhtuan1066
06-09-07, 02:07 PM
Thì đúng rồi... tôi nói trước đây là cách làm bằng tay mà... Còn nếu dùng Excel đễ Import và Export thì tôi thực sự ngu... Vì thế nên mới hỏi các cao thủ!
Còn nếu dùng một phần mềm nào đó đễ Import thì tôi nghĩ cách đơn giản nhất là trước tiên tôi có file .REG này, sau đó dùng lệnh đễ Import là gọn nhất... Để ý 1 vài phần mềm, tôi cũng thấy họ làm như vậy!
Mến
ANH TUẤN

anhtuan1066
06-09-07, 09:04 PM
Thầy Phước nè: Việc Import file .REG thì đơn giản rồi (vì mình đã có file trước)... nhưng làm sao Export 1 cách tự động? Tôi có ý kiến như vầy, cũng đơn giản thôi: Tạo 1 file Export.bat với nội dung:
regedit /e D:\Regional.txt "HKEY_CURRENT_USER\Control\Panel\International"

Khi chạy file này nó sẽ trích xuất key "International" trong Registry và lưu thành file Regional.txt nằm trong ổ D... Đường dẩn này Phước có thể sửa, và cả file Regional.txt nữa, Phước có thể sửa nó thành Regional.REG luôn cũng dc (nhưng tôi ghi .txt cho an toàn)

Nhiệm vụ của Phước là làm sao gọi dc file Export.bat trong Excel... Phước thử xem! Có gì hay cho biết với nhé! Vì món Excel này tôi thật sự ko rành!
Mến
ANH TUẤN

tedaynui
06-09-07, 09:26 PM
Cám ơn anh đã hướng dẫn. Để chạy File Export.bat (trong VBA) anh dùng lệnh này là được Shell Path &"\Export.bat" (Path là đường dẫn chứa file Export.bat)

Thân!

hoangdieu123
31-08-12, 03:08 PM
Mình đưa file Excel mẫu xuống cơ sở để họ lập danh sách, trong mẫu đó có cột ngày tháng năm sinh. Ở cơ sở thì họ nhập đúng định dạng dd/mm/yyyy rồi nhưng khi gửi lên máy của mình thì những trường hợp có ngày sinh <= 12 thì đều nhảy thành thành tháng hết. Ví dụ: ngày sinh của người A là 02/04/1998 thì nhảy thành 04/02/1998.
Các bạn cho mình cách giải quyết với nhé (mình lần đầu tiên làm excel đấy)