daibangkieuhanh
Thành viên chính thức
- Tham gia
- 5/7/07
- Bài viết
- 55
- Được thích
- 21
Mình muốn tính ngày âm tương ứng với 1 ngày dương cụ thể bất kỳ. Có bạn nào biết cách làm, giúp mình với
Mình muốn tính ngày âm tương ứng với 1 ngày dương cụ thể bất kỳ. Có bạn nào biết cách làm, giúp mình với
Chào Boyxin
Ông có thì cho người ta tham khảo đi.
Nếu có hảo tâm thì cho cộng đồng tham khảo Ver http://www.giaiphapexcel.com/forum/showthread.php?t=9994
Unlook thì càng cám ơn nhiều.
Thân ái.
- FILE CỦA TUI: SHEET THÌ LOCK MÀ LÀ KHÔNG LOCK; SHEET THÌ UNLOCK CHỈ CẦN 1 PHÍM DÀI NHẤT, ĐƠN GIẢN THẾ THOAIMình muốn tính ngày âm tương ứng với 1 ngày dương cụ thể bất kỳ. Có bạn nào biết cách làm, giúp mình với
Tôi nghĩ trong file chả có code âm dương gì đâu... chỉ là:Chào Boyxin
Ông bạn ơi ông làm SUN/Lunar tốt lắm.
Tôi xem http://www.giaiphapexcel.com/forum/s...ead.php?t=9994 của ông rồi.
Open cho cộng đồng xem code đi ông.
Tôi cũng đang làm về Lunar nhưng chưa thành công.
Rất mong ông giúp đỡ bằng cách cho tôi xem qua Code/Function của Lunar đó nhé.
Thân ái
Chào Boyxin
Ông bạn ơi ông làm SUN/Lunar tốt lắm.
Tôi xem http://www.giaiphapexcel.com/forum/s...ead.php?t=9994 của ông rồi.
Open cho cộng đồng xem code đi ông.
Tôi cũng đang làm về Lunar nhưng chưa thành công.
Rất mong ông giúp đỡ bằng cách cho tôi xem qua Code/Function của Lunar đó nhé.
Thân ái
Cảm ơn đã góp ý chân tìnhTuy nhiên xin góp ý: Đã đưa file lên thì tất nhiên bạn muốn mọi người góp ý, vậy ko nên khóa làm gì, trừ phi bạn tin chắc rằng file ấy đã rất hoàn hảo!
Theo cá tính của tôi thì tôi chẳng khi nào mất công vào những file đã khóa (cho dù tôi mở dc tôi cũng chẳng thèm coi)
Mến
ANH TUẤN
TiếpGiải mã Mảng LunarInfo=Array(300 phần tử) của Hồ Ngọc Đức
gửi bởi truongphu vào ngày Chủ nhật 13/04/2008 5:13 pm
Tên bài viết: Giải mã Mảng LunarInfo = Array( &H3C4BD8, &H624AE0, ... tất cả là 300 phần tử... &H33D556) của Hồ Ngọc Đức trong code VB6 Đổi dương lịch sang Âm lịch ("Về cách xây dựng dữ liệu qua phép toán And")
Tác giả: truongphu
1- Ý nghĩa:
-Trong mỗi phần tử nêu trên, ký tự cuối cùng là thông tin về tháng mấy nhuận, do đó không bao giờ có ký tự D,E hay F. Có thể đọc trực tiếp số từ ký tự nầy nầy mà kết quả không sai lạc. Số 0 là không có tháng nhuận và số mấy là có nhuận tháng đó. Và suy ra rằng Function LeapMonth(y) là đơn giản nhất
- Có thể nói ba ký tự kế tiếp chứa thông tin về số ngày trong một tháng: 29 hoặc 30 ngày của 12 tháng trong năm
- Có thể nói Ký tự áp đầu chứa thông tin về tháng nhuận là 29 hay 30 ngày
2- Cách xây dựng: ví dụ 3C4BD8 (năm 1900) = LunarInfo(0)
Khẳng định rằng thông tin về năm đã được biết. Hồ Ngọc Đức chỉ xây dựng mảng 300 cho code VB6 thuận lợi
a- Tháng mấy nhuận = Ký tự cuối: có giá trị từ 0 đến 12
dùng bộ lọc AND, nghĩa là ta đang làm việc trên số nhị phân.
Với giá trị tối đa = 12 sẽ thuộc về 2^4
Để lọc tất cả các số nhỏ thua 2^4, ta dùng bộ lọc (2^4) - 1 Xem Function LeapMonth(y)
--> ví dụ năm đang xét có nhuận tháng 8 = 8 And 15 (nhớ số liệu = 8)
b- Số ngày trong một tháng của 12 tháng trong năm: Dựa trên có hoặc không = If giá trị > 0 thì 30 else thì 29.
Để lọc (có hay không), ta dùng 2^n, 2^(n+1)...
Vì mới dùng bộ lọc 15, Bộ lọc (có hay không) sẽ dùng các số từ 16,32,64...32768
--> ví dụ năm đó 29 30 29 29 30 29 30 30 30 30 29 30
bộ lọc theo chiều thuận: từ nhỏ đến lớn
Hồ Ngọc Đức đang dùng chiều nghịch ở Function MonthDays(y, m)
Lọc tháng 2 là 16384 = có, tháng 5 là 2048 = có, tháng 7 là 512 = có, tháng 8 là 256 = có, tháng 9 là 128 = có, tháng 10 là 64 = có, tháng 12 là 16 = có (nhớ số liệu 16384 + 2048 + 512 +256 + 128 + 64 + 16 = 19408)
c- Số ngày tháng nhuận; tương tự như b- có hay không
Dùng tiếp bộ lọc là 65536 Xem Function LeapDay(y)
--> ví dụ năm đó: lọc 65536 = có (nhớ số liệu = 65536)
d- Vì trong bài viết, Hồ Ngọc Đức có nhắc đến Function CanchiV nhưng không thấy code, do đó tạm dừng!
Tổng hợp các số liệu: 8 + 19408 + 65536 = 84952 chuyển qua Hex là 14BD8
Hai ký tự đầu của LunarInfo(0) là 3C, nghĩa là vẫn còn thông tin. (Hoặc là phép dựng CSDL thừa hay gây nhiễu) . Bốn ký tự sau được giải hoàn toàn
ghi chú: theo ý chủ quan (truongphu) hàm CanchiV (tính cho năm) hoàn toàn không cần đến CSDL
Phụ lục: Mảng của truongphu http://www.caulacbovb.com/forum/viewtopic.php?f=7&t=587#p2998
- Xây dựng Số ngày trong một tháng của 12 tháng trong năm trước, theo chiều thuận có bộ lọc từ 2,4...4096
kết quả là một số deci nhỏ, không cần đổi qua Hex
- Nếu năm không nhuận, để yên số liệu
- Nếu năm nhuận: ghép thêm số Hex (từ 0 đến C), ký tự tiếp là 1 nếu 30 ngày và 0 nếu 29
gửi bởi phongvanvu vào ngày Thứ 5 17/04/2008 1:30 am
Thứ nhất, tác giả Hồ Ngọc Đức dùng mảng số hex vì nó giúp chiếm bộ nhớ rất nhỏ thích hợp tạo chương trình lịch cho điện thoại di động dù có thể dùng kiểu số khác như bác truongphu. Vì chiếm ít bộ nhớ nên thuật toán lại khá phức tạp. Thứ hai, tiểu đệ thấy các mảng khác chỉ dùng số hex bốn số nhưng hóa ra đó là dùng cho lịch Trung Hoa mà lịch Trung Hoa có chút khác biệt so với lịch Việt Nam.
Còn sau đây là quá trình phân tích của tiểu đệ, do trình độ có hạn nên cách trình bày có thể còn rắc rối khó hiểu mong bác và các bạn độc chịu khó nghiền ngẫm vậy.
Trước hết, tôi nhận thấy mảng các số 16,32,64... nếu qui đổi ra số nhị phân sẽ là 10000,100000,10000000... nghĩa là có 4,5,6... số không đứng sau số 1. Vậy phép AND của tác giả chính là để xác định bit thứ 5,6,7... tính từ phải sang trái có phải mang giá trị 1 không. Nếu là 1 thì tháng đó đủ còn không tháng đó thiếu. Vậy 12bit từ bit 5 đến bit 16 tính từ phải qua trái chứa dữ liệu tháng.
Ồ! Vậy 4 bit đầu chứa gì. Xin thưa, đó chính là tháng mấy nhuận. 4bit có thể chứa giá trị từ 0 tới 15 nên dùng chứa 12 tháng là hợp lý còn thừa vài giá trị 13,14,15 do không thể gọn hơn được nữa. Vậy ta and với 4 bit cuối sẽ ra tháng nhuận, 0 là không có tháng nhuận.
Có lẽ lý thuyết suông làm các bạn nản quá nhỉ. Thôi ví dụ cụ thể năm 2008 cho dễ hình dung. Tra trong mảng nó ở vị trí 108 ứng với số hex &H4A92B0.
Số hex cuối cùng là 0=> năm nay không nhuận, chán quá có lẽ phải lấy ví dụ thêm một năm nhuận khác vậy. Không sao, chúng ta đi tiếp chứ!
Mảng của HND giống như bí kíp nội công tâm pháp hiểu thì vất vả nhưng nếu hiểu sâu chúng ta có thể đạt tới cảnh giới cao trong lịch học. Vì vậy, đừng nản, hãy đọc tiếp nhé!
Giờ hãy đổi sô &H4A92B0 ra dạng nhị phân. Chúng ta quy ước bít trái nhất là bit 1 cứ như thế cho tới bit số 24. Một số nguyên integer chiếm 32bit nên tác giả tạo mỗi phần tử vừa đủ chứa trong một số nguyên bằng 4 byte. Tiết kiệm thế. HND chắc là hơi keo?!
Số &H4A92B0 quy đổi ra số nhị phân sẽ là:
010010101001001010110000
Ta mổ xẻ từng bít một nhé.
Bit 21-24: số tháng nhuận(đổi ra thập phân mới biết được)-0 là không có.
Bit 9-20: số ngày trong tháng 1,2... 1 là tháng có 30 ngày
Còn 8 bit mà bác truongphu bảo là thừa thì cũng đem ra mổ nốt xem nó có thừa hay không?
May quá nó không thừa bác ạ. Bit số 8 sẽ thông báo cho ta biết năm nào mà tháng nhuận có 30 ngày. Tôi chưa kiểm chứng toàn bảng nên nhờ mọi người test lại giùm nhưng chắc là đúng.
Vậy thì còn lại 7 bit 0100101? Nó là cái gì nhỉ? Chính 7 bit này ngốn của tôi nhiều thời gian nhất. Tôi chuyển đủ kiểu làm đủ mọi thao tác mất 3 ngày liền mới khám phá ra nó chứa cái gì. Đấy là nhờ tự nhiên thông minh đột xuất nghĩ rằng chắc tác giả muốn áp dụng nó cho lịch VN.
Quả đúng như vậy. Tôi đổi nó ra số thập phân 0100101=37. May quá, 37-31=6 mà 6+1 bằng 7. Như vậy, đó chính là ngày tết với qui ước 01/01/2008=0. Thử với các năm khác vẫn đúng. Nhưng vẫn chưa kiểm tra toàn bảng nên chỉ là giả thuyết thôi dù có lẽ nó đúng 99%.
Tiếp theo, kiểm tra năm 2006 cho chắc. Mảng chứa số &H38A7A7. Đổi ra nhị phân là 001110001010011110100111. Chọn năm này vì nó có tháng nhuận. Tháng nhuận là tháng 7 là số hex bên phải nhất đó. Để ý bít số 8 nó là 0 vậy tháng nhuận này có 29 ngày.Tháng 7 có 30 ngày nhưng nhuận chỉ có 29 ngày. Bác truongphu để ý nhé.. Đổi tiếp 7 số đầu là 28+1=29. Vậy Tết là 29/01/2006.
chào ttphong2007
Ông đã giải quyết thành công Code của Hồ Ngọc Đức qua XLS với VBA.
Ông giúp tôi chuyển chỗ làm việc đó mà không cần code không (chỉ dùng function cơ bản của Excel) không. Giúp cộng đồng tý đi.
cám ơn ông đã cung cấp.
không đọc bài #7 ngay bên trên sao mà còn làm động tác thừa vậy (ai quan tâm đến excel mà không có khả năng unhide thì xem file này với mục đích nghiên cứu cũng bằng thừa)Chào mọi người.
Theo yêu cầu cảu các bạn, và tôi xin phép boyxin để post lại Ver 3.0 của Boyxin để mọi người tham khảo (đã unhide 100%).
có lẽ tôi dựa trên Code của Hồ Ngọc Đức, ttphong2007 để chuyển thành Addin thành 01 myFunction là đơn giản hơn cả (đúng k các Bác)
Thân ái
Chào Anh ttphong2007 và các anh em trên GPELịch âm dương này dùng code VB bên caulacbovb.com (cũng dựa vào cách tính của Hồ Ngọc Đức).
TP.
Đọc thêm các thông tin sau từ caulacbovb.com:
Tiếp
Cám ơn bạn!Bạn thử dùng cái này xem. minh down đc của một bác trong diễn đàn (không biết là ai, nếu có gì bác bỏ quá cho em, hii)
Cái này mình thấy rất hay. Đổi đc cả ngày âm, dương, đọc đc cả số (tất cả các font).
Làm vậy là chuẩn rồi còn gì ---> Dù có viết code đi nữa thì người ta cũng sẽ dùng cách này thôi ---> Bạn tự mình viết lấy đâu có khó khăn gì (thuật toán đã có)Cám ơn bạn!
Ở mấy bài trên đã có code dùng hàm tự tạo để đổi ngày âm lịch thành ngày dương lịch và ngược lại.
ý mình muốn hỏi là có một CT nào như hàm eomonth() để tìm ngày cuối tháng của tháng 12 âm lịch là ngày 29 hay 30.
hiện tại thì mình vẫn đang dùng code hàm tự tạo (ở mấy bài trên) để chuyển đổi ngày đầu năm âm lịch (của năm tới) thành ngày dương lịch, Sau đó trừ đi 1. ngày dương lịch này chính là ngày cuối năm âm lịch,và lại dùng code hàm tự tạo chuyển ngược lại ra ngày âm lịch (ngày này thường là ngày 30, nhưng có một số năm lại là ngày 29.cụ thể là tháng 12 năm 2012 âm lịch chỉ có 29 ngày, có lẽ là nhuận tháng 12)
DIỄN ĐÀN GIẢI PHÁP EXCEL Group 1
DIỄN ĐÀN GIẢI PHÁP EXCEL Group 2