Office VBA... Câu hỏi và trả lời...

Thảo luận trong 'Ứng dụng Access' bắt đầu bởi paulsteigel, 16 Tháng mười một 2005.

5,996 lượt xem

  1. paulsteigel

    paulsteigel Thành viên thân thiết

    Bài viết:
    103
    Đã được thích:
    0
    Nơi ở:
    Hoà Bình
    Thành thật mong các bạn thông cảm vì có thể trong chừng mực nào đó nội dung mà tôi sẽ theo đuổi trong chủ đề này sẽ không có liên quan nhiều đến các kỹ năng mà các bạn đang trao đổi rất sôi nổi trên diễn đàn - Excel VBA.
    Những nội dung mà tôi dự định trao đổi sẽ ít nhiều bao gồm tất cả các kỹ năng liên quan đến 4 ứng dụng chính của Office đó là Excel, Access, Word và Powerpoint.
    Để tránh sự thụ động trong việc đưa ra nội dung, tôi xin phép được lấy căn cứ ví dụ làm nền tảng cho các thảo luận. Cấu trúc cơ bản của phần này sẽ là:
    + Mỗi tuần sẽ có 1 ví dụ đặc trưng nhất trong bộ công cụ mà tôi hiện có. Tại ví dụ tôi sẽ trình bày khả năng áp dụng các thuật toán vào công việc hàng ngày của các bạn.
    + Nếu khả năng cho phép, tôi sẽ trả lời tất cả các câu hỏi của các bạn liên quan đến ví dụ hoặc các nội dung có tính chất tương đối gần với chủ đề đã trình bày.
    + Những thông tin tôi nhận được từ các email cũng sẽ được đưa ra chủ đề này để mọi người tiện theo dõi.
    Tôi thực sự hy vọng chúng ta sẽ cùng hỗ trợ nhau để nâng cao hiệu quả công việc từ những kinh nghiệm được chia sẻ.
    Để bắt đầu chủ đề,.... tôi xin được bắt đầu với ví dụ đầu tiên về Access với chức năng báo cáo thật mạnh mẽ của nó trước các đối thủ nặng ký là Crystal Report hoặc active report ...
    [========================================================]
    Tôi nhận được 1 câu hỏi từ thành viên của ddth như sau: (Xin phép được

    ----- Original Message -----
    From: khanh quang
    Sent: Wednesday, November 16, 2005 3:13 PM
    Subject: Minh muon hoi ve access
    Hi!
    Minh moi ra truong nen voi lap trinh access con bo ngo lam
    Hien tai,minh dang viet chuong trinh loc du lieu tu danh thiep
    Minh co 1 van de mong ban giup do :
    -Co 1 so danh thiep se khong co day du thong tin ve:Duong,Phuong,Quan,Thanh Pho
    -Vi the,luc xuat ra report,nhung cho khong co du lieu se la khoang trang
    Co cach nao de khi xuat ra report,nhung cho trong do se duoc lap bang du lieu khac.
    Vi du : danh thiep khong co Phuong thi ngay tai do,du lieu cua Quan va Thanh Pho duoc di chuyen len de lap day cho trong.
    Mong tin ban
    Cam on ban da doc tin nay
    K.Q
    --------------------------------------------------------------------------------
    Yahoo! FareChase - Search multiple travel sites in one click.
    --------------------------------------------------------------------------------
    Xin trả lời như sau:
    Chao ban!
    Vang, cau hoi cua ban kha hay, lien quan den van de cung kha phuc tap cua access ve chuc nang bao cao. Nhung day cung la nhung diem noi troi cua access de no khac va tot hon nhung loai bao cao khac do la Dinh dang co dieu kien (conditional Format).
    Co rat nhieu cach de lam, toi gioi thieu voi ban mot cach nhu sau (Giup ban nang cao kha nang tu duy thuat toan):
    Toi xin tra loi nhu sau:
    1. Ban vao che do design cua bao cao, hay chon phan details hoac section chua cac textbox de hien thi huyen, xa ...
    2. Chon Propertys va chon tab Events tren hop thoai Property.
    Tai muc On Format, hay chon combo vao muc [Event Procedure] roi bam nut ben canh.
    Day chinh la cach gian tiep de vao code editor.
    Ban se thay man hinh VBA hien ra voi thu tuc la

    Private Sub Detail_Format(Cancel As Integer, FormatCount As Integer)

    End sub

    Day chinh la thu tuc duoc thuc thi moi khi bao cao duoc goi va hien thi.
    Ban hay dat cac thu tuc cua minh o day. trong do thuc hien cac yeu cau sau:
    + Dat ten nhom text box do la Txt1 cho den 10 (dieu nay de giup ban tham chieu den no mot cach de dang)
    + Kiem tra noi dung cua textbox
    + Neu gia tri la trang thi cho thuoc tinh Height cua no bang 0 vi du
    if Txt1.text="" then
    txt1.height=0
    end if
    Tat nhien la luc do khoang trang van con giua textbox vi the ban can phai co mot thuat toan de keo cac texbox len vi tri moi
    Txt2.top=txt1.top .... txt10.top =txt9.top ....
    Viec nay nen lam bang thuat toan de quy
    Ban co thay tham so formatcount khong? Cai nay de giup ta tranh viec thuc hien nhieu lan qua trinh dich chuyen nen toan bo nhom thu tuc can dat trong cau lenh
    if formatcount=1 then
    ....
    end if

    3. Sau do ban can phai dieu chinh do cao cua detail neu khong lai co khoang trang o cuoi doan bao cao
    Detail.height = TotalHeight
    trong do bien TotalHeight= tong chieu cao tat ca cac texbox co noi dung.
    Toi khong lam giup ban dieu nay, ban hay tu lam va gui cho toi ket qua, toi se comment cho ban.
    Tien day toi gui cho ban mot vi du ve cong cu ve Luoi cua Access nhe.
    GIan nen ra va chay, Nhan Report, dung nhan re-calculate nua, hay chon mot combo nao do va nhan print - ban se thay access rat manh trong ve luoi giong excel.
    THan
    --------------------------------------------------------------------------------

    Bình luận thêm:
    Tất nhiên có nhiều cách để làm được vấn đề trên, và tôi sẽ xin được trình bày từng cách một sau khi nhận được phản hồi của các bạn.
    Để bắt đầu, có lẽ chúng ta cần đi qua một số kiến thức như sau:
    + Nguyên tắc hiển thị báo cáo của access như thế nào?
    Báo cáo của access là một đối tượng lớp giống như form nhưng các đối tượng con của nó không thể sửa được khi ở chế độ hiển thị preview. Tuy vậy ta vẫn hoàn toàn quy định các thuộc tính của đối tượng đó trong quá trình format:
    đầu tiên sự kiện Open của báo cáo được thực thi tiếp theo là các thủ tục liên quan đến section và cuối cùng là details. Sau khi định dạng hết một bản ghi thuộc 1 nhóm, access tiếp tục với bản ghi tiếp theo của nhóm đó cho đến khi hết nhóm thì nhảy sang nhóm tiếp cho đến khi toàn bộ nội dung được duyệt sẵn sàng để in ra màn hình. Lúc này access tiết kiệm tốc độ bằng cách chỉ thực hiện một nhóm thuộc trang đầu rồi chỉ in ra và xử lý với trang tiếp khi ta nhấn nút next.
    Quá trình format được chia thành 2 giai đoạn, giai đoạn lấy dữ liệu, định dạng rồi cuối cùng là giai đoạn gửi thông tin để in ra màn hình hoặc máy in (print).
    Khi đã đến giai đoạn print thì phần lớn các thuộc tính của các đối tượng là không thể điều chỉnh được nữa.
    Vì thế mọi công việc chúng ta cần thực hiện sẽ nằm ở giai đoạn format (chúng ta có thể vẽ đường, định màu, phông chữ và rất nhiều....).
    Trong cách của tôi trên đây, về cách tư duy thì không có gì phải bàn nhiều vì cách này khá thẳng (Straight forward). Nhưng tôi muốn nêu lên thực tế sẽ diễn ra khi các bạn thực hiện thành công những bước theo cách trên:
    1. Access sẽ hiện thành công một số bản ghi đầu, sau đó là không có gì được hiển thị lên màn hình vì qua các bước tôi đã làm cho kích thước các textbox giảm về 0.
    Vậy ta phải ghi nhớ được kích thước thực tế của các đối tượng khi mở báo cáo. Việc này có thể làm tại thủ tục report open(). Sau đó, mỗi khi tiến hành format lại, chúng ta sẽ khôi phục kích thước các đối tượng.
    2. Tuy vậy nếu bản ghi thứ nhất có 2 trường có dữ liệu, bản ghi thứ 2 có 5 trường có dữ liệu. Lỗi sẽ phát sinh do kích thước Section details đã bị thu bé ở lần hiển thị bản ghi đầu tiên, vì thế ta lại phải khôi phục lại kích thước ban đầu của section này ngay khi bắt đầu format từng bản ghi..
    3. Với bản ghi trẳng? Đơn giản chỉ cần đặt các đối tượng về kích thước o cũng như Details.
    Và kết thúc ... hihi
    Để tiện theo dõi, các bạn có thể xem ví dụ ở
    http://www.sfdp.net/Libs/gen/acc/report1.zip

    Đến đây thì em xin mạn phép kết thúc bài 1. Nếu có gì không phải mong các bác lượng thứ ạ.
    Nay kính thư nhé!
     
    Last edited: 13 Tháng tám 2006
    #1
  2. mysterious_girl

    mysterious_girl Thành viên sơ cấp

    Bài viết:
    358
    Đã được thích:
    1
    Nơi ở:
    ...close to you...
    Paulsteigel cho em hỏi "ddth" nghĩa là gì vậy?
     
    #2
  3. hai2hai

    hai2hai VNUNI Makes a difference

    Bài viết:
    2,012
    Đã được thích:
    128
    Nơi ở:
    Hà nội
    Là .... www.ddth.com
    green_field vào đó thử xem nó là gì nhé :)
     
    #3
  4. hai2hai

    hai2hai VNUNI Makes a difference

    Bài viết:
    2,012
    Đã được thích:
    128
    Nơi ở:
    Hà nội
    #4
  5. mysterious_girl

    mysterious_girl Thành viên sơ cấp

    Bài viết:
    358
    Đã được thích:
    1
    Nơi ở:
    ...close to you...
    A, các bác định kéo fan của EFC qua đó à?
     
    #5
  6. hai2hai

    hai2hai VNUNI Makes a difference

    Bài viết:
    2,012
    Đã được thích:
    128
    Nơi ở:
    Hà nội
    #6
  7. paulsteigel

    paulsteigel Thành viên thân thiết

    Bài viết:
    103
    Đã được thích:
    0
    Nơi ở:
    Hoà Bình
    Tiện đây tôi cũng giới thiếu một khả năng in báo cáo khá tốt của Access mà nếu nhìn các bạn có thể thấy nó chẳng thua kém gì Excel.
    Đây là một ví dụ bổ sung thêm cho khả năng điều chỉnh rất năng động các báo cáo của Access.
    Thủ tục chính của báo cáo nằm ở DrawGrid và một số biện pháp tính tổng động của báo cáo.
    Ngoài ra các bạn cũng có thể áp dụng cách tận dụng thuộc tính cangrow của các đối tượng trong báo cáo.
    http://www.sfdp.net/Libs/gen/acc/Grid_Rpt.zip
     
    Last edited: 13 Tháng tám 2006
    #7
  8. Secret_grasses

    Secret_grasses Thành viên sơ cấp

    Bài viết:
    317
    Đã được thích:
    3
    Nơi ở:
    Ngôi nhà nhỏ trên thảo nguyên.
    Sao em mở file ra là nó đòi chọn tên rồi in chứ không có print preview vậy? Em muốn coi cấu trúc bên trong file thì làm như thế nào?
     
    #8
  9. paulsteigel

    paulsteigel Thành viên thân thiết

    Bài viết:
    103
    Đã được thích:
    0
    Nơi ở:
    Hoà Bình
    Bạn hãy chọn bên contract type rồi chọn tên một nhân viên ở bên phải sau đó nhấn Print thôi - cái này tôi trích ra từ một app tôi đang viết dở, các bạn thông cảm nhé.
    Có gì thì hãy mail cho tôi nghen.
    Trong ví dụ này tôi có để access tự động khởi động form frm_report khi bắt đầu. Nếu các bạn muốn không thực hiện thủ tục này thì hãy thoát khỏi CSDL và Nhấn Shift khi mở lại CSDL ra.
    Nếu các bạn muốn hiển thị màn hình CSDL hãy nhấn F11 và Alt+F11 để xem mã nguồn.
     
    Last edited: 18 Tháng mười một 2005
    #9
  10. paulsteigel

    paulsteigel Thành viên thân thiết

    Bài viết:
    103
    Đã được thích:
    0
    Nơi ở:
    Hoà Bình
    Một số ví dụ để các bạn tham khảo

    Tôi muốn gửi tặng các bạn một số ví dụ nhóm theo chủ đề để các bạn có thể tham khảo và sử dụng cho mục đích riêng của mình
    Ví dụ 1: Tạo nhãn với Excel
    Tất nhiên MailMerge với Word là tuyệt vời rồi – nhưng tại sao chúng ta không thử làm một Mailmerge với Excel nhỉ - tất nhiên là để phục vụ mục đích riêng của các bạn thôi.
    Các bạn có thể tải file ở đây: http://www.sfdp.net/Libs/gen/Exl/ExcelLabel.zip
    Ví dụ 2: Bộ công cụ chuyển đổi bảng mã nhúng trong word.
    Cái này tôi làm từ 2002, hồi đó cũng có một vài công cụ để chuyển đổi nhưng mà để có được nó thật là khổ, thế là tôi làm một công cụ dùng chính những chức năng của word để chuyển đổi bảng mã.
    Để dùng được công cụ này, các bạn cần có Office 2000 trở lên nhé.
    Để cài đặt, các bạn nhớ là để Security của Macro ở mức Medium hoặc low khi tiến hành cài đặt và nhớ phải enable macro nếu bạn để ở mức Medium. Rất đơn giản thôi, chỉ cần giãn nén và mở file Unicode.dot bằng word là xong.
    Sau khi cài xong thì bạn có thể điều chỉnh lại mức an ninh về high.
    Các bạn có thể tải file ở đây: http://www.sfdp.net/Libs/gen/wrd/Unicode.zip
    Ví dụ 3: Bộ công cụ thu hoạch mẫu khảo sát trên mạng
    Nếu các bạn có nhu cầu hỏi khách hàng về vấn đề gì đó mà chỉ có thể thực hiện bằng Email, hãy thiết kế một form trong word và gửi cho họ. Khi họ gửi về, bạn có thể dùng một công cụ giống như tôi đưa ra ở đây để thu thập dữ liệu vào CSDL sau đó bạn có thể tiếp tục xử lý.
    Các bạn có thể tải file ở đây: http://www.sfdp.net/Libs/gen/wrd/Questionare.zip
    Nhớ là để chung các tài liệu đã thu hoạch được vào một thư mục nhé.
     
    #10
  11. luongvanluyen

    luongvanluyen Thành viên sơ cấp

    Bài viết:
    27
    Đã được thích:
    0
    Nơi ở:
    HCM CITY
    To: green_field,
    ddth: diễn đàn tin học.
    LVL
     
    #11
  12. mysterious_girl

    mysterious_girl Thành viên sơ cấp

    Bài viết:
    358
    Đã được thích:
    1
    Nơi ở:
    ...close to you...
    Cám ơn luongvanluyen nhé. Cái này bạn coi lại bài #3 anh hai2hai đã trả lời mình rồi.
     
    #12
  13. paulsteigel

    paulsteigel Thành viên thân thiết

    Bài viết:
    103
    Đã được thích:
    0
    Nơi ở:
    Hoà Bình
    Sử dụng phép đệ quy trong một số bài toán văn phòng

    Chào các bạn, hôm nay tôi muốn giới thiệu với các bạn một thủ thuật mới trong một số bài toán văn phòng của các bạn. Thủ thuật này có tên là phép đệ quy hàm (Recursive function). Có lẽ với đa số các bạn đã học nhiều về toán và thuật toán thì thuật ngữ này chẳng xa lạ gì, đặc biệt phương pháp quy nạp (Induction) chẳng hạn. Vậy đệ quy là gì? Ích lợi của nó?
    Có nhiều định nghĩa khác nhau đối với phép đệ quy (Recusive) nhưng đều khá khó để có thể giúp các bạn hiểu rõ theo một cách trực quan vì thế tôi chỉ cung cấp liên kết đến trang định nghĩa đó mà xin phép không dịch. Thay vào đó, tôi xin được giải thích minh họa để chúng ta có thể hiểu rõ hơn:
    Đệ quy có thể giải thích một cách trực quan như sau: Xét ví dụ về con người hay hàm x là con người. Thay vì định nghĩa khái niệm hay hàm này bằng con số hay cách sắp xếp của nó, người ta có thể nói: “Adam và Êva là con người; và bất kỳ người con nào của họ cũng là con người và bất kỳ người con nào của con của họ .... cũng là con người”. Ở đây hai giá trị của hàm “x là con người” được đề cập và mối quan hệ của mỗi yếu tố đối với yếu tố còn lại cũng được xác lập. Thông qua mối quan hệ này của tất cả các yếu tố được coi là những giá trị của “x là con người” được lựa chọn bằng cách tham chiếu ngược hay “Đệ quy” qua rất nhiều bước để rồi về đến Adam và Êva.
    Tính đệ quy trong một hàm hay khái niệm thường liên quan chặt chẽ đến thủ tục được biết như là phương pháp quy nạp toán học và đó là yếu tố quan trọng chính trong logic học và toán học.
    Ví dụ: ta đứng ở gốc cây và ta muốn đếm toàn bộ lá cây. Đầu tiên ta bắt đầu dò từ gốc cây và nếu gốc cây không có nhánh thì ta sẽ đến cành lá cuối cùng và kết thúc. Nhưng nếu có nhiều cành thì ta lại bắt đầu quá trình đi từ cành đó, nếu cành đó không có nhánh thì ta đếm xong là và quay về điểm ta đã rẽ để đếm tiếp cành tiếp theo.... cứ như thế mỗi khi đếm xong ta lại quay về điểm bắt đầu để lại đếm tiếp. Cho đến khi ta đếm đến cành cuối cùng và quay về với tổng số lượng lá trên tay. Điểm dừng lại cũng chính là gốc cây.
    Tại ví dụ này, thao tác được lặp đi lặp lại là Đi lên trên -> đếm xong -> Quay lại điểm bắt đầu. Vì thế ta có thể áp dụng phép đệ quy để thực hiện thao tác này lặp đi lặp lại cho đến hết. Yếu tố quyết định để thực hiện chu trình này là – có phải điểm bắt đầu đi đếm là rẽ nhánh hay không?
    Xét ví dụ tiếp theo, liên quan chặt chẽ hơn đến các bài tập thường nhật của các bạn:
    Ví dụ 1: Đếm số đối tượng shape lồng nhau trong văn bản
    Giả sử trong một tài liệu Word, đầu tiên bạn có 2 textbox, bạn nhóm lại bằng lệnh group, tiếp theo bạn lại thêm một textbox và nhóm tiếp với nhóm vừa tạo, và liên tục khoảng 20 lần nhóm đến đối tượng cuối cùng là một nhóm chung nhất. Nếu ta sử dụng lệnh đếm đối tượng của word thì chỉ có giá trị duy nhất được trả về là 1 đối tượng shape. Vậy làm thế nào bạn có thể đếm số lượng chính xác các textbox đơn lẻ?
    Ở đây có thể có nhiều cách tiếp cận
    1. Bạn đặt lồng nhau rất nhiều cấu trúc if...then để kiểm tra thuộc tính của đối tượng xem nó có phải là nhóm không msoGroup nếu là nhóm thì tiếp tục một cấu trúc if...then nữa. Nếu theo cách này bạn có thể phải đặt đến vô hạn cấu trúc if...then vì có thể có rất nhiều nhóm đối tượng trong một văn bản. Chỉ xét ví dụ trên, bạn cần phải có đến 20 lần cấu trúc if...then
    2. Dùng đệ quy.
    Đầu tiên tôi thực hiện gọi thủ tục đếm các đối tượng shape từ một thủ tục bên ngoài CountTextbox, tại thủ tục này, chúng ta duyệt qua tất các các đối tượng shape của toàn bộ văn bản
    Sau đó khi kiểm tra thấy một đối tượng shape là nhóm thì bắt đầu gọi hàm đếm các đối tượng shape của nhóm đó
    Sub CountTextbox()
    Dim CnvRange as range
    Dim oShape As Object, i as long
    ActiveDocument.Select
    Set CnvRange=Selection
    For Each oShape In CnvRange.InlineShapes
    If oShape.Type = msoGroup Then
    I=i+ CountObject (oShape)
    Else
    I=i+1
    End If
    Next
    Msgbox “There are “ & i “ shape object in the document”
    End sub
    Private Function CountObject(iObj As Object) as long
    ' this funtion will iterate throughout all ranges of object in the document or selection
    Dim iShape As Object, i as long
    For Each iShape In iObj.GroupItems
    If Not iShape.Type = msoGroup Then
    I=i+1
    Else
    CountObject =i+GetSingleObject( iShape)
    End If
    Next
    End Function
    Hàm CountObject sẽ đếm tất cả các đối tượng của nó lần lượt và nếu gặp nhóm, nó gọi chính nó với tham số truyền cho nó là đối tượng chứa nhóm ấy, chon đến khi không còn đối tượng nhóm nào trong đối tượng đang xét thì quay về và trả lại kết quả cuối cùng là tổng số đối tượng shape trong đối tượng đang duyệt từ thủ tục CountTextbox.
    Các bạn có thể thấy là, với cách trên, chúng ta có thể đếm số lượng nhóm bất kỳ trong văn bản mà không sợ bị sót.
    Ví dụ 2: ghi lại thuộc tính của tất cả các đối tượng điều khiển trong thực đơn và thanh công cụ
    Giả sử vì một lý do nào đó, bạn muốn lập danh sách tất cả các lệnh và nút bẩm của thực đơn và thanh công cụ trong Excel, Access hay một ứng dụng office nào khác. Tất nhiên bạn có thể lập danh sách các thanh công cụ và thực đơn rất tốt. Tuy nhiên, vấn đề nằm ở chỗ thanh công cụ có cấu trúc khá hỗn hợp, nó có thể chứa nhiều điều khiển và một số điều khiển trong nó lại chứa tiếp các điều khiển khác và liên tiếp như vậy. Thật khó để bạn có thể tưởng tượng là có bao nhiêu lần lặp như lại như thế để xác định xem mình sẽ cần mấy vòng lặp trong thuật toán xử lý.
    Ví dụ Thực đơn File nằm trong thanh công cụ và trong thực đơn file lại có nhiều mục con của nó và trong các mục con lại có mục sendto lại chứa các mục con tiếp theo.
    Tôi xin giới thiệu một cách dùng đệ quy để tính toán
    Sub BuildMenuList()
    ' Duyệt qua toàn bộ các thực đơn và thanh công cụ
    Dim mnuBar As CommandBar, iStr As String
    For Each mnuBar In Application.CommandBars
    ‘ Gọi hàm liệt kê toàn bộ đối tượng điều khiển trên thực đơn hay thanh công cụ đó
    iStr = iStr & BuildDetails(mnuBar, mnuBar.Name) & vbCrLf
    Next
    Set mnuBar = Nothing
    ‘ Gởi ra màn hình kết quả
    MsgBox iStr
    End Sub

    Private Function BuildDetails(Mnb As Object, cmbName) As String
    Dim Obj As Object
    For Each Obj In Mnb.Controls
    ‘ đây chính là đoạn đệ quy nếu hàm hasubcontrol trả về kết quả là true
    If HasSubControl(Obj) Then BuildDetails Obj, cmbName
    ' Save the details of the bar here
    BuildDetails = BuildDetails & cmbName & "|" & Obj.Caption & vbCrLf
    Next
    End Function

    Function HasSubControl(TestObj As Object) As Boolean
    ' Kiểm tra xem một đối tượng điều khiển có các điều khiển con hay không?
    Dim Obj As Object
    On Error GoTo ErrHandler
    For Each Obj In TestObj.Controls
    Exit For
    Next
    HasSubControl = True
    ErrHandler:
    End Function
    Và còn rất nhiều ví dụ khác bạn có thể áp dụng phương pháp đệ quy này. Các bạn thử tìm xem có ví dụ nào nữa không nhé.
    Chúc các bạn Đêm Giáng sinh vui vẻ và hạnh phúc. Hãy dành cho mọi người xung quanh mình những lời ngọt ngào nhất nhé.
     
    Last edited: 24 Tháng mười hai 2005
    #13
  14. Đào Việt Cường

    Đào Việt Cường Moderator

    Bài viết:
    400
    Đã được thích:
    3
    Giới tính:
    Nam
    Nơi ở:
    Khánh Hòa
    Dear paulsteigel
    ---------------
    Bài viết của bác thật bổ ích!
    Trước đây em cũng có làm thử một số thủ tục để "load" toàn bộ menu do người dùng định nghĩa trong MS Excel lên một sheet. Lúc đó làm thật khó khăn, phải chạy thử rất nhiều lần để tìm ra quy luật rẽ nhánh. Giá như bác đưa chủ đề này từ sớm có lẽ đã giúp em rất nhiều.
    Giờ em cũng hiểu thêm được rất nhiều qua ví dụ của bác. Thật ra thuật ngữ "đệ quy" còn rất xa xôi cho công việc văn phòng của chúng em. Nhưng hiểu về nó như một thuật ngữ mô tả tiến trình rẽ nhánh và ứng dụng nó trong công tác quản lý tài chính cũng thật bổ ích.
    Ở đây, thiết thực nhất trong lý thuyết hàm đệ quy này - trong ví dụ của bác có đề cập - là xây dựng công cụ tạo menu và thanh công cụ. Em thấy cái tiện ích này rất hay! Bác shere luôn cho mọi người tham khảo được không!
     
    #14
  15. hai2hai

    hai2hai VNUNI Makes a difference

    Bài viết:
    2,012
    Đã được thích:
    128
    Nơi ở:
    Hà nội
    prefix "i" present cho cái gì vậy paul? Chú ý coding conventions nhé.

    Hãy tiếp tục nhé, khi post code thì comments (nếu là tiếng việt thì viết ko dấu nhé) cho code ngay trước hoặc dưới tên hàm/thủ tục để mọi người dễ theo dõi. Ex:

    Private Sub Test(strTest As String)
    '//*************************
    '* Muc dich: Thu lam gi do
    '* Tham so:
    '*----------1. strTest: Chuoi gia tri de thu
    '* Cach dung:
    '*----------Call Test("Hello")
    '* Nguoi viet: Paul
    '* Lich su cap nhat:
    '*-----26/12 - by Paul: Them comments cho ham
    '*-----25/12 - by Dao Viet Cuong: Tao moi ham dung de lam vi du
    '//*************************
    Code here​
    End Sub

    Viết như vậy đọc code mới dễ hiểu.
     
    Last edited: 26 Tháng mười hai 2005
    #15
  16. paulsteigel

    paulsteigel Thành viên thân thiết

    Bài viết:
    103
    Đã được thích:
    0
    Nơi ở:
    Hoà Bình
     
    #16
  17. paulsteigel

    paulsteigel Thành viên thân thiết

    Bài viết:
    103
    Đã được thích:
    0
    Nơi ở:
    Hoà Bình
    Lâu quá mới quay lại diễn đàn được, phần vì công việc cũng nhiều lại gặp vài chuyện không hay ho lắm nên nay mới mạn phép quay lại góp vui cùng anh chị.
    Tối hôm qua, em chợt nghĩ đến việc làm ra một MenuBuilder (Bộ dựng Thực đơn) cho ứng dụng Access, nay muốn trao đổi cùng các bạn, chắc một vài người quan tâm.
    =================
    A. Đặt vấn đề:
    =================
    1. Có cách nào thiết kế được bộ thực đơn cho Access một cách đơn giản hơn không? Thay vì phải dùng đến các công cụ thiết kế thực đơn của Access.
    2. Làm thế nào để hiểu đôi chút về nguyên tắc hoạt động của thực đơn và cách gán các hình ảnh khác nhau cho thực đơn, thanh công cụ?
    3. Làm thế nào để kích hoạt thực đơn riêng thay vì sử dụng thực đơn hệ thống?

    Câu hỏi có vẻ phức tạp nhỉ, nhưng đại loại là thế này:
    + Bạn biết làm với Access, bạn muốn xây dựng bộ thực đơn riêng cho ứng dụng của bạn, kích hoạt nó và sử dụng các hàm riêng... Không thèm sử dụng thực đơn của hệ thống.
    + Bạn muốn ứng dụng của bạn trông chuyên nghiệp và không còn tẹo Access nào....

    Câu trả lời là làm được nhưng các bạn cần một vài hỗ trợ tương đối cơ bản về thực đơn.
    Để giản tiện điều này, tôi sẽ cùng các bạn làm một module có tên là Menubuilder.

    =================
    B. Mục tiêu của MenuBuilder là gì?
    =================
    1. Giúp các bạn tạo ra thực đơn dễ dàng hơn, chỉ cần khai báo vài thông số, nhấn chuột và gõ.
    2. Giúp bạn tạo ra một ứng dụng Access trông "có vẻ chuyên nghiệp" ít nhất là ở cách nó hoạt động. (Khi nhấn kép tập tin, nó sẽ không hiển thị các thực đơn hệ thống của Access, rồi hiển thị form chào hỏi nữa chứ .....)
    3. Giúp bạn hiểu đôi chút về phân lớp ứng dụng với thực đơn, thanh công cụ và .... và và hihi thực đơn đẩy lên (PopUp menu)

    =================
    C. Làm thế nào?
    =================
    1. Giới thiệu về thực đơn của Access (đã có chương VBA Dummies số 19-20-21)
    2. Giới thiệu về chức năng StartUp và Macro Autoexec của Access.
    3. Giới thiệu về thuộc tính csdl của access.

    =================
    D. Thời gian?
    =================
    Hihi - 3 tuần nhé, mỗi tuần 1 vấn đề - và cố gắng viết làm 9 bài, không kể bài này.
    Thế đã - hôm nay mình vừa đi tập huấn về - giờ phải nghỉ tí đã.
    Chúc các bạn cuối tuần thật là dzui và Hạnh phúc.
     
    #17
  18. Secret_grasses

    Secret_grasses Thành viên sơ cấp

    Bài viết:
    317
    Đã được thích:
    3
    Nơi ở:
    Ngôi nhà nhỏ trên thảo nguyên.
    Hihi, anh vất vả ha.Em rất mừng khi thấy anh quay trở lại.Mong sớm được đọc bài của anh. :1luvu:
     
    #18
  19. hoangvudb

    hoangvudb Thành viên sơ cấp

    Bài viết:
    57
    Đã được thích:
    0
    Nơi ở:
    đà nẵng
    kinh nghiệm của tôi nhé, bạn nên hạn chế viết lệnh macro, vì khi dùng cái đó lâu ngày sẽ tạo ra 1 checktor bạn ko nhìn thấy được nhưng nó sẽ làm cho chương trình nặng thêm theo thời gian sử dụng, vã lại độ bảo mật ko cao ---> cho dù bạn chuyễn sang .mde vẫn có thể sữa chữ được, và có khi lại bị lỗi nếu chuyễn vs MSaccess #
     
    #19
  20. paulsteigel

    paulsteigel Thành viên thân thiết

    Bài viết:
    103
    Đã được thích:
    0
    Nơi ở:
    Hoà Bình
    Giới thiệu về thực đơn và phân lớp ứng dụng...

    A. Giới thiệu chung
    ============================================
    Quả là tiện khi mà ta có thể tuỳ biến và tạo ra công cụ dựng Menu cho chính ứng dụng của mình. Tất nhiên, sẽ là không thể nếu các nhà lập trình không cho phép chúng ta làm thế, nhưng thật may mắn, họ đã cho phép người dùng có thể tuỳ biến những gì mình thích. Và điều này chính là tác nhân mang lại sự thú vị cho tất cả những ai đang hàng ngày, hàng giờ ngồi dán mắt vào máy tính với những công cụ mà các nhà lập trình đã làm cho chúng ta say mê.
    Thống nhất với chủ đề mà tôi đã lựa chọn, tối sẽ cùng các bạn bàn về Microsoft Office và phần mềm đại diện của nó là Microsoft Access
    Tiện lợi và hữu ích như thế, song cũng phải thừa nhận là đến thời điểm này, các công cụ hỗ trợ về Menu của MS chưa hoàn toàn làm cho tất cả chúng ta thoả mãn. Với các bạn mới làm việc về Access và Office, dường như họ không mấy quan tâm đến việc tạo dựng môi trường làm việc thống nhất có các công cụ riêng như thực đơn (Menu), thanh công cụ, ngôn ngữ giao diện. Nhưng đối với những người làm phần mềm ứng dụng hoặc những người có chuyên môn cao, họ lại luôn muốn làm điều đó. Trong trường hợp này việc xây dựng một bộ thực đơn đôi lúc làm cho chúng ta khá mệt mỏi.
    Với ý tưởng này, một phần cũng là từ công việc, tôi cảm thấy sẽ rất tiện lợi nếu chúng ta tạo ra được một công cụ xây dựng menu cho Office mà bất cứ ai cũng có thể sử dụng được. Và xuất phát từ ý tưởng đó, tôi thấy việc bàn đến nó cũng không quá tốn giấy mực nên thiết nghĩ rât tiện nếu đem chia sẻ ra ở đây. Đối tượng quan tâm sẽ là cả những người có chuyên môn về Access và cả những người mới bắt đầu. Những người có chuyên môn sẽ đóng góp vào cách tiếp cận trong khi những người mới có thể dùng sản phẩm cho công việc của họ.
    Cách tiếp cận của tôi là tạo ra một công cụ hoàn chỉnh và giúp người dùng đóng gói sản phẩm thành một ứng dụng access hoàn chỉnh thông qua bộ dựng menu và tạo các thủ tục khởi động hệ thống cũng như phân lớp ứng dụng. Với cách đó, có thể thời gian 1 tháng không đủ để đi hết mọi vấn đề song ít nhất cũng giúp tất cả có được cách nhìn rõ hơn về ứng dụng lập trình vào công việc hàng ngày.
    Phục vụ việc soạn tài liệu, tôi mong muốn các đại ca chỉ bảo và tham gia cùng để đóng góp ý tưởng.
    2. Thực đơn, thanh công cụ
    ============================================
    Đây là giới thiệu giao diện của một chương trình viết bằng access.
    [​IMG]
    [Xin tạm thời ngâm cứu về việc link hình ảnh vào wkt]
     
    Last edited: 25 Tháng hai 2006
    #20

Chia sẻ trang này