• Vui lòng đọc nội qui diễn đàn để tránh bị xóa bài viết
  • Tìm kiếm trước khi đặt câu hỏi

Trao đổi về Word VBA Mời vào đây!

Nơi trao đổi về VBA (Visual Basic for Application), lập trình cho ứng dụng Microsoft Office, AutoCAD...

Điều hành viên: tungblt

dvtruyen
Bài viết: 1
Ngày tham gia: T.Sáu 14/03/2014 8:31 pm

Mọi người ai thông thao macro trong excel 2010 thì hộ mình v

Gửi bàigửi bởi dvtruyen » T.Ba 18/03/2014 8:52 am

[quote="truongphu"]Mở hàng cho topic: Mọi người a thông thao macro trong excel 2010 thì hộ mình với.

Mình đang xây dựng quản lý về môn học đào tạo theo tín chỉ, có anh em nào rảnh và biết thì hộ mình với
Các hàm cơ bản trong macro ấy.



Viet Roy
Bài viết: 2
Ngày tham gia: T.Tư 19/03/2014 10:11 am
Has thanked: 2 time

Re: Trao đổi về Word VBA Mời vào đây!

Gửi bàigửi bởi Viet Roy » T.Tư 19/03/2014 10:21 am

Di chuyển toàn bộ các đối tượng là TEXT sang trái 1 khoảng là 10. Có bác nào biết code bài này hông ạ

Hình đại diện của người dùng
truongphu
VIP
VIP
Bài viết: 4758
Ngày tham gia: CN 04/11/2007 10:57 am
Đến từ: Cam Đức, Khánh hòa
Has thanked: 14 time
Been thanked: 513 time

Re: Trao đổi về Word VBA Mời vào đây!

Gửi bàigửi bởi truongphu » T.Sáu 21/03/2014 8:23 am

Viet Roy đã viết:Di chuyển toàn bộ các đối tượng là TEXT sang trái 1 khoảng là 10. Có bác nào biết code bài này hông ạ

Đã trả lời ở bài viết của riêng bạn bên dưới

dvtruyen đã viết:Mọi người a thông thao macro trong excel 2010 thì hộ mình với.
Mình đang xây dựng quản lý về môn học đào tạo theo tín chỉ, có anh em nào rảnh và biết thì hộ mình với
Các hàm cơ bản trong macro ấy.


Macro là các sus thi hành. Muốn tìm các hàm đã dùng trong macro thì phải có macro cụ thể.
Có lẽ ý bạn là các hàm căn bản trong Excel

sau đây là các hàm căn bản. chép từ GPE
Tập tin đính kèm
Căn Bản Excel.rar
(730.64 KiB) Đã tải 228 lần
o0o--truongphu--o0o

.........
Ghé thăm:
Chuyện Linh Tinh

dncldncldncl
Bài viết: 3
Ngày tham gia: T.Hai 21/10/2013 10:40 pm
Has thanked: 1 time

Re: Trao đổi về Word VBA Mời vào đây!

Gửi bàigửi bởi dncldncldncl » CN 08/06/2014 9:08 pm

Cho mình hỏi tí:
1. làm cách nào để tìm hoặc chữ này hoặc chữ kia trong seclection.find
vd:

Mã: Chọn hết

.text = "(Đệ|Thứ)"

thì kết quả tìm được là "Đệ" hoặc "Thứ"
2. nếu không chọn

Mã: Chọn hết

.MatchWildcards = True
thì đoạn này

Mã: Chọn hết

.text = "([0-9])"
sẽ bị sai???
3. nếu sử dụng

Mã: Chọn hết

.MatchWildcards = True
thì khi tìm, nó sẽ phân biệt chữ hoa với chữ thường. vd: tìm "đệ" thì sẽ không tìm được chữ "Đệ" và "đỆ" và "ĐỆ". có cách khắc phục nào không?
Nếu điều thắc mắc của mình chính là điểm yếu của seclection.find => mình chuyển sang dùng "Regular Expressions". Khổ nỗi cái này cũng có điểm yếu là không tự tô đen kết quả tìm được. vd:

Mã: Chọn hết

  Set regEx = New RegExp            ' Create a regular expression.
  regEx.Pattern = "(aaa|bbb|ccc)"         ' Set pattern.
  regEx.IgnoreCase = False           ' Set case insensitivity.
  regEx.Global = True           ' Set global applicability.
 
  Set matches = regEx.Execute(ActiveDocument.Range.text)    ' Execute search.
  Match = matches(1)
  Match.FirstIndex

Match.FirstIndex trả về giá vị trí của từ kiếm được là sai nếu trong word có table => không có được vị trí để tô đen đoạn văn bản
Xin mọi người chỉ giúp cách giải quyết các vấn đề trên.

thanhthao195
Bài viết: 2
Ngày tham gia: T.Hai 09/06/2014 12:39 pm

Re: Trao đổi về Word VBA Mời vào đây!

Gửi bàigửi bởi thanhthao195 » T.Ba 10/06/2014 9:47 am

*** Viết Macro Word về Heading
Mình có tài liệu file *.docx, trong đó có nhiều chương, đầu đề mỗi chương đều gắn Heading1. Khi đọc tới một đoạn văn bất kỳ trong file, mình muốn biết đoạn văn này nằm ở chương nào ? tên đầu đề là gì ? Nhưng không biết viết Macro như thế nào ? Nhờ các bạn cao minh chỉ giúp với.

dncldncldncl
Bài viết: 3
Ngày tham gia: T.Hai 21/10/2013 10:40 pm
Has thanked: 1 time

Re: Trao đổi về Word VBA Mời vào đây!

Gửi bàigửi bởi dncldncldncl » T.Ba 10/06/2014 4:49 pm

truongphu đã viết:Viết lại Sub TìmThayNgay vì thấy rườm rà...

  1. Sub TìmThayNgay()
  2.  With Selection.Find
  3.     .Execute Replace:=wdReplaceOne
  4.     While .Found
  5.         .Execute Replace:=wdReplaceOne
  6.     Wend
  7.  End With
  8. End Sub


;;)

cả 2 code đều gặp 1 vấn đề là nếu
.text="aaa"
.Replacement.Text = "aaa"
thì sẽ treo máy vì vòng lặp vô hạn. lý do:
lệnh

Mã: Chọn hết

Selection.Find.Wrap = wdFindContinue

Nếu không thấy sẽ tự động về lại đầu trang để tìm mà không cần hỏi
và lệnh

Mã: Chọn hết

While Selection.Find.Found
        .Execute Replace:=wdReplaceOne
Wend

"Selection.Find.Found" sẽ luôn là true nếu ".text" và ".Replacement.Text" giống nhau hoặc chuỗi ".text" là chuỗi con của ".Replacement.Text"
Xin bác cho ý kiến.
ps: Bác truongphu trả lời giúp câu hỏi trước của tôi với

Hình đại diện của người dùng
truongphu
VIP
VIP
Bài viết: 4758
Ngày tham gia: CN 04/11/2007 10:57 am
Đến từ: Cam Đức, Khánh hòa
Has thanked: 14 time
Been thanked: 513 time

Re: Trao đổi về Word VBA Mời vào đây!

Gửi bàigửi bởi truongphu » T.Năm 12/06/2014 7:12 am

dncldncldncl đã viết:...
Xin bác cho ý kiến

Đúng như bạn nhận xét.

1- Nếu văn bản ngắn, bạn có thể thay wdFindContinue với wdFindAsk và xử lý tùy tình huống.
2- Nếu văn bản dài, bạn cứ dùng wdFindContinue: Tôi sử dụng trên doc 20MB (truyện huyễn huyễn), thấy chúng chạy sau một hồi cũng thoát! không treo máy!
vd: tìm chữ lãnh và thế bằng lãnh địa. Kết quả là lãnh địa địa địa địa.
Chịu khó tìm địa địa và thay bằng địa là xong.

dncldncldncl đã viết:ps: Bác truongphu trả lời giúp câu hỏi trước của tôi với


dncldncldncl đã viết:1. làm cách nào để tìm hoặc chữ này hoặc chữ kia trong seclection.find

VBA Word không hổ trợ

dncldncldncl đã viết:.text = "([0-9])"

Khi .MatchWildcards = True thì VBA sẽ đọc text là chữ chỉ có 1 ký tự số.
Không khai báo tức mặc định (.MatchWildcards = False) thì VBA sẽ đọc text là ([0-9])

dncldncldncl đã viết:phân biệt chữ hoa với chữ thường

Đó là .MatchCase = True, nếu false thì hoa hay thường cũng dùng tuốt

dncldncldncl đã viết:chuyển sang dùng "Regular Expressions". Khổ nỗi cái này cũng có điểm yếu là không tự tô đen

Bạn thử dùng code:

Mã: Chọn hết

            For Each strMatch In objRegEx.Execute(strSearch)
                        ''' Làm gì Ðây?
            Next

Tại vị trí Làm gì Ðây? Bạn thử cho Selection.text = strMatch.text (Tôi chưa thử, chỉ là ý tưởng). Nếu êm thì các chữ tìm được highlight cũng OK

Bạn làm VB mấy năm rồi mà nhuyễn thế?
o0o--truongphu--o0o

.........
Ghé thăm:
Chuyện Linh Tinh

dncldncldncl
Bài viết: 3
Ngày tham gia: T.Hai 21/10/2013 10:40 pm
Has thanked: 1 time

Re: Trao đổi về Word VBA Mời vào đây!

Gửi bàigửi bởi dncldncldncl » T.Năm 19/06/2014 7:01 pm

cám ơn ý kiến bác truongphu. VB mình mới làm có mấy tháng thôi. Chủ yếu là có căn bản lập trình pascal C C# nên qua VBA cũng dễ. Mình học VBA từ bác chứ đâu. còn vấn đề của mình thì 1 file truyện chắc hiếm có table lắm nên mình bỏ qua yếu điểm Regular Expressions rồi.
Giờ lại phát sinh vấn đề lớn là find and replace. Nếu sử dụng Ctrl + F để tìm trong Navigation thì có cả SỐ kết quả tìm được và cực nhanh.
Còn nếu tìm bằng code nó không hỗ trợ => tự lập trình.
Mình thử cả 2 phương pháp là
PP1: tìm và đếm từng từ (pp này thì rất lâu vì dùng vòng lặp)
PP2: cho nó replace rồi đếm số chữ thay đổi => tính toán ra số từ Replace (pp này thì càng lâu vì dùng "ActiveDocument.Characters.Count")
Với file Word > 20mb thì chạy tới tối. đùa thôi chứ rất lâu so với nhấn Ctr F.
Có cao thủ nào biết sử dụng Navigation trong lập trình hoặc giải thuật nhanh tìm và thay mà có đếm kq không. xin cám ơn

rooneyp
Bài viết: 1
Ngày tham gia: T.Sáu 20/06/2014 4:13 pm

Re: Trao đổi về Word VBA Mời vào đây!

Gửi bàigửi bởi rooneyp » T.Sáu 20/06/2014 4:17 pm

Chào mọi người.Em cần tìm một người giỏi về VBA làm giúp em một assignment về VBA. Em sẽ trả phí đầy đủ ạ. Em cần gấp ạ.

Ai có thể giúp đc em xin liên lạc: rooneypham91@gmail.com

Hình đại diện của người dùng
truongphu
VIP
VIP
Bài viết: 4758
Ngày tham gia: CN 04/11/2007 10:57 am
Đến từ: Cam Đức, Khánh hòa
Has thanked: 14 time
Been thanked: 513 time

Re: Trao đổi về Word VBA Mời vào đây!

Gửi bàigửi bởi truongphu » T.Sáu 20/06/2014 5:56 pm

dncldncldncl đã viết:tính toán ra số từ Replace (pp này thì càng lâu vì dùng "ActiveDocument.Characters.Count")

Dùng Characters.Count với file lớn sẽ lâu. Trang mvps.org nổi tiếng cũng đề xuất dùng cách nầy, tôi đọc thấy buồn cười! :D
http://word.mvps.org/FAQs/MacrosVBA/GetNoOfReplacements.htm

Khi bảng Dialogs(wdDialogEditReplace) chạy tìm và thay, thực ra chúng cũng đếm! và đếm là phương tiện nhanh cùng chính xác nhất!
Bạn thử dùng:

Mã: Chọn hết

    Dim J&
        Do While Selection.Find.Execute _
        (Replace:=wdReplaceOne, Forward:=True) = True
            J = J + 1
            Selection.MoveRight wdWord, 1, wdMove
        Loop
    Msgbox "Sô lân tìm và thay là: " & J
o0o--truongphu--o0o

.........
Ghé thăm:
Chuyện Linh Tinh

btamsgn
Thành viên chính thức
Thành viên chính thức
Bài viết: 47
Ngày tham gia: T.Năm 10/04/2008 4:40 pm
Has thanked: 3 time

Re: Trao đổi về Word VBA Mời vào đây!

Gửi bàigửi bởi btamsgn » T.Ba 08/07/2014 2:43 pm

Chào a.Phu,
Trong access mình có viết code như sau:
Function houral(ByVal nnt As Long) As String
Canday$("Giasp,AAst,Bisnh,Ddinh,Maaju,Kyr,Canh,Taan,Nhaam,Qusy")
khoiCan$("Giasp,Bisnh,Maaju,Canh,Nhaam,Giasp,Bisnh,Maaju,Canh,Nhaam")
Chi$ = Split("Suwru,Suwru,Suwru,Daafn,Daafn,Maxo,Maxo,Thifn,Thifn,Tij,Tij,Ngoj,Ngoj,Mufi,Mufi,Thaan,Thaan,Daaju,Daaju,Tuaast,Tuaast,Howji,Howji,Tys,Tys,Tys", ",")
houral = VN(Chi(Int(nnt)))
End Function

Tuy nhiên hàm trả về kết quả Chi giờ đúng còn "Can giờ" không đúng.

Làm cách nào để trả về kết quả Can Chi giờ theo ý sau:
Canday$("Giasp,AAst,Bisnh,Ddinh,Maaju,Kyr,Canh,Taan,Nhaam,Qusy")
khoiCan$("Giasp,Bisnh,Maaju,Canh,Nhaam,Giasp,Bisnh,Maaju,Canh,Nhaam")
Tuy nhiên cứ 2 giờ là tăng lên 1 can
vd: 23-1: Tý, Can Ngày : Giáp thì =>Giáp Tý
1-3: Sửu, Can Ngày : Giáp thì =>Ất Sửu
....
21-23: Hợi, Can Ngày : Giáp thì =>Ất Hợi

vd:23-1: Tý, Can Ngày : Bính thì =>Mậu Tý
1-3: Sửu, Can Ngày : Bính thì =>Kỷ Sửu
....
21-23: Hợi, Can Ngày : Bính thì =>Kỷ Hợi


Rất mong nhận được công thức tính trên, thanks

Hình đại diện của người dùng
truongphu
VIP
VIP
Bài viết: 4758
Ngày tham gia: CN 04/11/2007 10:57 am
Đến từ: Cam Đức, Khánh hòa
Has thanked: 14 time
Been thanked: 513 time

Re: Trao đổi về Word VBA Mời vào đây!

Gửi bàigửi bởi truongphu » T.Ba 08/07/2014 8:12 pm

btamsgn đã viết:Làm cách nào để trả về kết quả Can Chi

Cách đây mấy năm bạn có hỏi trong Box thủ thuật, giờ tôi xem mới thấy.... :D
[Tuy nhiên cớ sao bạn lại trao đổi CanChi ở chủ đề MS Word chứ?]

btamsgn đã viết:Canday$("Giasp,AAst,Bisnh,Ddinh,Maaju,Kyr,Canh,Taan,Nhaam,Qusy")
khoiCan$("Giasp,Bisnh,Maaju,Canh,Nhaam,Giasp,Bisnh,Maaju,Canh,Nhaam")
Chi$ = Split("Suwru,Suwru,Suwru,Daafn,Daafn,Maxo,Maxo,Thifn,Thifn,Tij,Tij,Ngoj,Ngoj,Mufi,Mufi,Thaan,Thaan,Daaju,Daaju,Tuaast,Tuaast,Howji,Howji,Tys,Tys,Tys", ",")


Sao bạn viết rối thế? Sửu và Tí bạn cho đến 3 thành phần trong dãy! rồi các chi còn lại mỗi em là 2...

Tôi lục function cũ tôi đã viết:

Mã: Chọn hết

Private Function NamAmLich$(ByVal Year%)
    Dim Can$(), Chi$()  ' truongphu
    Can = Split("Canh Tân Nhâm Qúy Giáp Ât Bính Ðinh Mâu Ky")
    Chi = Split("Thân Dâu Tuât Ho'i Tí Suu Dân Mão Thìn Ty Ngo Mùi")
    NamAmLich = Can(Year Mod 10) & " " & Chi(Year Mod 12)
End Function

Cớ gì Can bắt đầu là Canh và Chi là Thân?
Can có 10, mà năm Can DL có đuôi là 0 nên Can bắt đầu chuỗi, để khi split, Can(0) sẽ là Canh, cứ thế theo thứ tự...
Và Chi có 12. Để khớp với mỗi năm Can, Chi(0) sẽ là Thân.
Đương nhiên function trên chỉ đúng cho đa số ngày giữa năm: Đầu năm DL (hơn 1 tháng) sẽ không đúng!

Ngày cũng tuần tự như năm, để khớp Can Chi trên, tôi tính ra mốc 1/4/1800

Mã: Chọn hết

Private Function NgayAmLich$(ByVal Ngày As Date)
    Dim Can$(), Chi$()  ' truongphu
    Can = Split("Canh Tân Nhâm Qúy Giáp Ât Bính Ðinh Mâu Ky")
    Chi = Split("Thân Dâu Tuât Ho'i Tí Suu Dân Mão Thìn Ty Ngo Mùi")
    NgayAmLich = Can(DateDiff("d", #4/1/1800#, Ngày) Mod 10) & " " & _
    Chi(DateDiff("d", #4/1/1800#, Ngày) Mod 12)
End Function

function nầy thì tuyệt đối đúng, vì nó đếm từng ngày!

Riêng tháng thì phức tạp, vì ÂL có tháng nhuận...

btamsgn đã viết:Tuy nhiên cứ 2 giờ là tăng lên 1 can
vd: 23-1: Tý, Can Ngày : Giáp thì =>Giáp Tý
1-3: Sửu, Can Ngày : Giáp thì =>Ất Sửu
....
21-23: Hợi, Can Ngày : Giáp thì =>Ất Hợi

vd:23-1: Tý, Can Ngày : Bính thì =>Mậu Tý
1-3: Sửu, Can Ngày : Bính thì =>Kỷ Sửu
....
21-23: Hợi, Can Ngày : Bính thì =>Kỷ Hợi


Câu hỏi chính nầy khá phức tạp, vì giờ Giáp tí bắt đầu từ ngày Giáp tí, cứ tuần tự mà tính, hôm sau là ngày Ất Sửu và giờ bắt đầu là Bính tí.
Hẹn ngày mai mốt nha... Tôi sẽ viết lại function giờ cho bạn
o0o--truongphu--o0o

.........
Ghé thăm:
Chuyện Linh Tinh

btamsgn
Thành viên chính thức
Thành viên chính thức
Bài viết: 47
Ngày tham gia: T.Năm 10/04/2008 4:40 pm
Has thanked: 3 time

Re: Trao đổi về Word VBA Mời vào đây!

Gửi bàigửi bởi btamsgn » T.Ba 08/07/2014 10:16 pm

Cảm ơn a.Phú,

còn đây là ý tưởng nhưng viết code thế nào để mảng 12chi mặc định 1 là dần, 2 là mão,...thì mình vẫn chưa biết cách viết.
1.về cách lấy chi tháng âm lịch mặc định: Tháng 1 là Dần, 2 là Mão...đến tháng 12 sửu
về cách lấy can tháng âm lịch theo hồ ngọc đức: năm*12+tháng âm lịch +3 mod 10(với Số dư 0 là Giáp, 1 là Ất v.v. )
hoặc dựa vào Can năm âm lịch để tính như năm Giáp,Kỷ Khởi Bính dần; Ất,canh khởi Mậu dần; Bính,tân khởi Canh dần; Đinh, nhâm khởi Nhâm dần;Mậu,quý khởi Giáp dần
2.về cách lấy chi giờ âm lịch mặc định: 23-1 là Tý, 1-3 là Sửu...đến 21-23 hợi
khi tạo mãng chi giờ như trên thì khi gõ vào textbox thì int(1)=>Sửu hay int(20)=>Tuất v.v
về cách khởi Can giờ theo can ngày âm lịch như năm Giáp,Kỷ Khởi Giáp Tý; Ất,canh khởi Bính Tý; Bính,tân khởi Mậu Tý; Đinh, nhâm khởi Canh Tý;Mậu,quý khởi Nhâm Tý.

về cách viết code ý tưởng trên như thế nào thì mình vẫn chưa biết cách.

Rất mong công thức từ a.Phú, thanks.

Hình đại diện của người dùng
truongphu
VIP
VIP
Bài viết: 4758
Ngày tham gia: CN 04/11/2007 10:57 am
Đến từ: Cam Đức, Khánh hòa
Has thanked: 14 time
Been thanked: 513 time

Re: Trao đổi về Word VBA Mời vào đây!

Gửi bàigửi bởi truongphu » T.Tư 09/07/2014 7:41 am

btamsgn đã viết:Rất mong công thức từ a.Phú, thanks.

Mất 3 tiếng! :P

1- Mỗi ngày 12 Chi giờ, vậy 5 ngày là 60 Chi giờ. Đây là BSCNN của Chi và Can. Do đó mỗi 5 ngày Can giờ bắt đầu sẽ trở lại.
Can giờ bắt đầu ngày là: Giáp, Bính, Mậu, Canh, Nhâm.
2- Dãy "Giáp Ất Bính Đinh Mậu Kỹ canh Tân Nhâm Quý" khi Split đưa vào mảng Chi thì Chi(0) là Giáp, Chi(1) là Ất... Chi(9) là Nhâm. Số phần tử viết gọn lần lượt là 0 1 2 3 4 5 6 7 8 9
Mà Can giờ khởi đầu chỉ 5, đó là Giáp =Chi(0), Bính = Chi(2), Mậu = Chi(4), Chi(6) = Canh và Nhâm = Chi(8). Số phần tử viết gọn lần lượt là 0 2 4 6 8
3- Ta thấy nếu dãy 0 1 2 3 4 5 6 7 8 9 nhân cho 2, có được 0 2 4 6 8 10 12 14 16 18, và nếu chỉ lấy hàng đơn vị thì dãy 10 số nầy biến thành dãy 5 số: 0 2 4 6 8 khớp dãy Can giờ khởi đầu nêu trên.

Thế là OK!
Công thức tính Can Chi của giờ liên quan đến Can ngàygiờ yêu cầu tính

Bạn yêu cầu tính giờ Tí từ 23:00:00 đến 0:59:59 đây là cách tính xưa, không đúng logic của ngày từ 0:00:00 đến 23:59:59
Mà cách tính nầy lại thêm phức tạp. Tôi gọi Function cách tính nầy là GioAmLich23_1

  1. Function GioAmLich23_1$(ByVal Gio%, ByVal Ngày As Date)
  2.     GioAmLich23_1 = Can((((DateDiff("d", #4/1/1800#, Ngày) * 2 - 4) Mod 10) + ((Gio + 1) \ 2)) Mod 10) & " " & _
  3.     Chi((((Gio + 1) \ 2) + 4) Mod 12) ' truongphu
  4. End Function


Nếu bạn muốn tính giờ Tí theo hiện đại từ 0:00:00 đến 1:59:59
Tôi gọi function nầy là GioAmLich0_2

  1. Private Function GioAmLich0_2$(ByVal Gio%, ByVal Ngày As Date)
  2.     GioAmLich0_2 = Can((((DateDiff("d", #4/1/1800#, Ngày) * 2 - 4) Mod 10) + (Gio \ 2)) Mod 10) & " " & _
  3.     Chi(((Gio \ 2) + 4) Mod 12) ' truongphu
  4. End Function


Khai báo 2 mảng Can Chi cho 2 function trên:

  1.     Dim Can$(), Chi$()
  2. Private Sub Form_Load()
  3.     Can = Split("Canh Tân Nhâm Qúy Giáp Ât Bính Ðinh Mâu Ky")
  4.     Chi = Split("Thân Dâu Tuât Ho'i Tí Suu Dân Mão Thìn Ty Ngo Mùi")
  5. End Sub


4- Hai function trên khác nhau ở ((Gio + 1) \ 2)) và (Gio \ 2))
Thêm +1 vì GioAmLich23_1 nhanh hơn 1 giờ. Vd tính 23 giờ, sẽ là 23 + 1 = 24 giờ bắt đầu ngày mới
5- (DateDiff("d", #4/1/1800#, Ngày) là xác định Can ngày đang tính. Công thức nầy có trong function bài viết trước.
6- Sau đó có * 2 đã nói ở mục 3
7- có - 4, Vì Mục 2 và 3 cho Giáp là 0. Mà ở đây đang dùng thì Giáp là 4, nên phải trừ 4
8- Mod 10 vì trước đó là con số rất lớn, ta chỉ cần hàng đơn vị
9- + (Gio \ 2) là Can thay đổi theo mỗi 2 giờ

10- Chi giờ:
(Gio \ 2) là Chi thay đổi theo mỗi 2 giờ
+ 4 để trả giá trị khởi đầu luôn là Tí
Mod 12 lấy số dư của 12 Chi

11- Ứng dụng.
btamsgn đã viết:gửi bởi btamsgn » Chủ nhật 19/12/2010 7:11 pm
...
ví dụ : ngày 19 tháng 12 năm 2010 vào lúc 17:30
Âm lịch: Ngày 14 tháng m/một, năm 2010 (ngày Quý Mão, tháng Mậu Tí, năm Canh Dần; giờ Tân Dậu)

Mã: Chọn hết

MsgBox GioAmLich23_1(17, #12/19/2010)


:>
o0o--truongphu--o0o

.........
Ghé thăm:
Chuyện Linh Tinh

btamsgn
Thành viên chính thức
Thành viên chính thức
Bài viết: 47
Ngày tham gia: T.Năm 10/04/2008 4:40 pm
Has thanked: 3 time

Re: Trao đổi về Word VBA Mời vào đây!

Gửi bàigửi bởi btamsgn » T.Tư 09/07/2014 8:55 am

Chào a.Phú,

Sau khi kiểm tra hàm GioAmLich23_1, nhập giờ từ 23:00:00 đến 0:59:59 thì kết quả bị sai.
Các giờ khác đúng chỉ mỗi giờ Tý là Can bị sai.

Thanks,

Hình đại diện của người dùng
truongphu
VIP
VIP
Bài viết: 4758
Ngày tham gia: CN 04/11/2007 10:57 am
Đến từ: Cam Đức, Khánh hòa
Has thanked: 14 time
Been thanked: 513 time

Re: Trao đổi về Word VBA Mời vào đây!

Gửi bàigửi bởi truongphu » T.Tư 09/07/2014 10:38 am

btamsgn đã viết:Sau khi kiểm tra hàm GioAmLich23_1, nhập giờ từ 23:00:00 đến 0:59:59 thì kết quả bị sai.


Đối số giờ của hàm là số Integer
truongphu đã viết:Function GioAmLich23_1$(ByVal Gio%, ByVal Ngày As Date)


Bạn nhập dạng "hh:mm:ss" là dạng String thì làm sao hàm chạy tốt? Chúng coi chuỗi là số 0, và ra kêt quả trên giờ = 0

Tôi có ví dụ ở trên để bạn quen:
MsgBox GioAmLich23_1(17, #12/19/2010#)

Ngày trong VB6, có dấu thăng # ở hai bên. bên trong là Tháng, ngày, năm hay M/D/YYYY
(Việt Nam quen D/M/YYYY)

Để bạn dùng được dạng "hh:mm:ss", đối số giờ trong hàm phải sửa thành String
và xử lý chuỗi nầy trả về kiểu số: với function B như sau

  1. Function GioAmLich23_1B$(ByVal Gio$, ByVal Ngày As Date)
  2.     Dim GG$(): GG = Split(Gio, ":")
  3.     GioAmLich23_1B = Can((((DateDiff("d", #4/1/1800#, Ngày) * 2 - 4) Mod 10) + ((Int(GG(0)) + 1) \ 2)) Mod 10) & " " & _
  4.     Chi((((Int(GG(0)) + 1) \ 2) + 4) Mod 12) ' truongphu
  5. End Function
o0o--truongphu--o0o

.........
Ghé thăm:
Chuyện Linh Tinh

btamsgn
Thành viên chính thức
Thành viên chính thức
Bài viết: 47
Ngày tham gia: T.Năm 10/04/2008 4:40 pm
Has thanked: 3 time

Re: Trao đổi về Word VBA Mời vào đây!

Gửi bàigửi bởi btamsgn » T.Tư 09/07/2014 11:48 am

Chào a.Phú,

Ý mình muốn nói là hàm GioAmLich23_1 trả về kết quả sai ở Can giờ khi nhập int(23) hay int(24)
vd: ngày 09/07/2014: Tân Tị=> khi nhập 23 thì kết quả trả về "Canh Tý"(đúng : Mậu Tý)
vd:ngày 09/07/1971: Ất Mùi=> khi nhập 23 thì kết quả trả về "Mậu Tý"(đúng : Bính Tý)
...
Thanks,

Hình đại diện của người dùng
truongphu
VIP
VIP
Bài viết: 4758
Ngày tham gia: CN 04/11/2007 10:57 am
Đến từ: Cam Đức, Khánh hòa
Has thanked: 14 time
Been thanked: 513 time

Re: Trao đổi về Word VBA Mời vào đây!

Gửi bàigửi bởi truongphu » T.Tư 09/07/2014 3:26 pm

Chào bạn btamsgn
1- nick của bạn có tiếp vĩ ngữ sgn, bạn đang ở Sài gòn hả?
và nếu đúng, bạn phải lớn tuổi vì trẻ quen dùng TPHCM

2-
btamsgn đã viết:Ý mình muốn nói là hàm GioAmLich23_1 trả về kết quả sai ở Can giờ khi nhập int(23) hay int(24)

Nghĩa là Hàm chạy tốt trong mọi int khác?
Như thế thì Hàm hoạt động tốt!

3- Nếu bạn dùng hàm GioAmLich0_2, Tôi đảm bảo bạn sẽ dùng vô tư!
vì sao? vì nó khớp hệ thống giờ/ngày thông dụng

4- Hôm nay ngày 9/7/2014, cứ mỗi tiếng bạn dùng hàm GioAmLich23_1 một lần, tất cả trả về ok. Nhưng từ 23 giờ hôm nay trở đi, bạn bảo lúc đó vẫn là ngày 9/7/2014 thông dụng, hay theo hàm GioAmLich23_1 đã sang ngày mới?
Thế nên khi bạn nhập 23, hoặc 23:33 trên hàm GioAmLich23_1B, chúng đều trả về Canh Tí, đó là ngày Nhâm Ngọ 10/7/2014. Hàm đã xem rằng qua ngày mới, thế thôi.

Hay ngược lại, trên hàm GioAmLich23_1, muốn có kết quả giờ X mà 23 <= X = < 24 phải là Mậu Tí, bạn phải cho ngày là 8/7/2014; vì từ lúc đó, GioAmLich23_1 (theo yêu cầu của bạn) đã sang ngày mới...

5- Có lẽ bạn thấy lúng túng, bạn dùng thử project sau:
untitled.JPG
untitled.JPG (35.83 KiB) Đã xem 3124 lần


project:
Tập tin đính kèm
Ngày Gio Âm Lich 2.rar
(2.39 KiB) Đã tải 202 lần
o0o--truongphu--o0o

.........
Ghé thăm:
Chuyện Linh Tinh

btamsgn
Thành viên chính thức
Thành viên chính thức
Bài viết: 47
Ngày tham gia: T.Năm 10/04/2008 4:40 pm
Has thanked: 3 time

Re: Trao đổi về Word VBA Mời vào đây!

Gửi bàigửi bởi btamsgn » T.Tư 09/07/2014 4:11 pm

Chào a.Phú,

Cảm ơn anh đã giải thích.

Để 23.59 thuộc ngày trước thì lấy ngày -0.1 và thêm điều kiện thì kết quả trả về đúng.

Function GioAmLich23_1$(ByVal Gio%, ByVal Ngày As Date)
GioAmLich23_1 = Can((((DateDiff("d", #4/1/1800#, Ngày-0.1) * 2 - 4) Mod 10) + ((Gio + 1) \ 2)) Mod 10) & " " & _
Chi((((Gio + 1) \ 2) + 4) Mod 12) ' truongphu
End Function

Thanks,

toancapba
Bài viết: 7
Ngày tham gia: T.Ba 04/03/2014 10:53 pm

Re: Trao đổi về Word VBA Mời vào đây!

Gửi bàigửi bởi toancapba » CN 02/11/2014 8:27 pm

Chào Anh Phú !
Nhờ anh giúp tôi code làm sao mình chuyển một bảng ( một cột ) trong word thành từ file txt, mỗi nội dung một ô thành 1file txt.
Làm sao lấy dữ liệu trong clipboar thành một string
Xin cảm ơn Anh !


Quay về “Visual Basic for Application (VBA)”

Đang trực tuyến

Đang xem chuyên mục này: Không có thành viên nào trực tuyến.2 khách