• 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...

Moderator: tungblt

dvtruyen
Posts: 1
Joined: Fri 14/03/2014 8:31 pm

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

Postby dvtruyen » Tue 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
Posts: 2
Joined: Wed 19/03/2014 10:11 am
Has thanked: 2 times

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

Postby Viet Roy » Wed 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 ạ

User avatar
truongphu
VIP
VIP
Posts: 4766
Joined: Sun 04/11/2007 10:57 am
Location: Cam Đức, Khánh hòa
Has thanked: 14 times
Been thanked: 520 times

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

Postby truongphu » Fri 21/03/2014 8:23 am

Viet Roy wrote: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 wrote: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
Attachments
Căn Bản Excel.rar
(730.64 KiB) Downloaded 307 times
o0o--truongphu--o0o

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

dncldncldncl
Posts: 3
Joined: Mon 21/10/2013 10:40 pm
Has thanked: 1 time

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

Postby dncldncldncl » Sun 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:

Code: Select all

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

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

Code: Select all

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

Code: Select all

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

Code: Select all

.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:

Code: Select all

  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
Posts: 2
Joined: Mon 09/06/2014 12:39 pm

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

Postby thanhthao195 » Tue 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
Posts: 3
Joined: Mon 21/10/2013 10:40 pm
Has thanked: 1 time

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

Postby dncldncldncl » Tue 10/06/2014 4:49 pm

truongphu wrote: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

Code: Select all

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

Code: Select all

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

User avatar
truongphu
VIP
VIP
Posts: 4766
Joined: Sun 04/11/2007 10:57 am
Location: Cam Đức, Khánh hòa
Has thanked: 14 times
Been thanked: 520 times

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

Postby truongphu » Thu 12/06/2014 7:12 am

dncldncldncl wrote:...
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 wrote:ps: Bác truongphu trả lời giúp câu hỏi trước của tôi với


dncldncldncl wrote: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 wrote:.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 wrote: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 wrote: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:

Code: Select all

            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
Posts: 3
Joined: Mon 21/10/2013 10:40 pm
Has thanked: 1 time

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

Postby dncldncldncl » Thu 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
Posts: 1
Joined: Fri 20/06/2014 4:13 pm

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

Postby rooneyp » Fri 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

User avatar
truongphu
VIP
VIP
Posts: 4766
Joined: Sun 04/11/2007 10:57 am
Location: Cam Đức, Khánh hòa
Has thanked: 14 times
Been thanked: 520 times

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

Postby truongphu » Fri 20/06/2014 5:56 pm

dncldncldncl wrote: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:

Code: Select all

    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
Posts: 47
Joined: Thu 10/04/2008 4:40 pm
Has thanked: 3 times

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

Postby btamsgn » Tue 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

User avatar
truongphu
VIP
VIP
Posts: 4766
Joined: Sun 04/11/2007 10:57 am
Location: Cam Đức, Khánh hòa
Has thanked: 14 times
Been thanked: 520 times

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

Postby truongphu » Tue 08/07/2014 8:12 pm

btamsgn wrote: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 wrote: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:

Code: Select all

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

Code: Select all

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 wrote: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
Posts: 47
Joined: Thu 10/04/2008 4:40 pm
Has thanked: 3 times

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

Postby btamsgn » Tue 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.

User avatar
truongphu
VIP
VIP
Posts: 4766
Joined: Sun 04/11/2007 10:57 am
Location: Cam Đức, Khánh hòa
Has thanked: 14 times
Been thanked: 520 times

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

Postby truongphu » Wed 09/07/2014 7:41 am

btamsgn wrote: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

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

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

[vb] Dim Can$(), Chi$()
Private Sub Form_Load()
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")
End Sub[/vb]

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 wrote: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)

Code: Select all

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
Posts: 47
Joined: Thu 10/04/2008 4:40 pm
Has thanked: 3 times

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

Postby btamsgn » Wed 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,

User avatar
truongphu
VIP
VIP
Posts: 4766
Joined: Sun 04/11/2007 10:57 am
Location: Cam Đức, Khánh hòa
Has thanked: 14 times
Been thanked: 520 times

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

Postby truongphu » Wed 09/07/2014 10:38 am

btamsgn wrote: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 wrote: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
Posts: 47
Joined: Thu 10/04/2008 4:40 pm
Has thanked: 3 times

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

Postby btamsgn » Wed 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,

User avatar
truongphu
VIP
VIP
Posts: 4766
Joined: Sun 04/11/2007 10:57 am
Location: Cam Đức, Khánh hòa
Has thanked: 14 times
Been thanked: 520 times

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

Postby truongphu » Wed 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 wrote:Ý 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) Viewed 10047 times


project:
Attachments
Ngày Gio Âm Lich 2.rar
(2.39 KiB) Downloaded 266 times
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
Posts: 47
Joined: Thu 10/04/2008 4:40 pm
Has thanked: 3 times

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

Postby btamsgn » Wed 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
Posts: 7
Joined: Tue 04/03/2014 10:53 pm

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

Postby toancapba » Sun 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 !


Return to “Visual Basic for Application (VBA)”

Who is online

Users browsing this forum: No registered users and 2 guests