QUẢNG CÁO ĐẦU TRANG

Collapse

Thông báo

Collapse
No announcement yet.

Thư viện các hàm tự lập bằng VB

Collapse
X
 
  • Lọc
  • Giờ
  • Show
Clear All
new posts

  • Thư viện các hàm tự lập bằng VB

    Chào các anh em!
    Lâu rồi không tạo chủ đề mới, tranh thủ hôm nay trời mưa, tôi post vài hàm trong VB để anh em cùng tham khảo. Cũng rất mong anh em, ai có hàm gì hay hay post lên đây thường xuyên để cũng tra đổi và học tập. Các hàm có thể đơn giản mà hiệu quả cao thì rất hoan nghênh.

    1- Hàm sắp xếp các tành phần trong mảng theo thứ tự ăng dần

    Sub SapXepThuTuMang(Mang)
    Dim i As Long, j As Long

    For i = 0 To UBound(Mang)
    For j = 0 To UBound(Mang)
    If i <> j And Mang(i) < Mang(j) Then
    HoanVi Mang(i), Mang(j)
    End If
    Next j
    Next i
    End Sub
    '=================================================


    2- Hàm tìm Max của nhiều thành phần

    Function TimMax(thamso As Variant)
    Dim i As Integer
    TimMax = -1E+50
    For i = 0 To UBound(thamso)
    If thamso(i) > TimMax Then
    TimMax = thamso(i)
    End If
    Next
    End Function

    '=============================================
    3- Hàm tìm Min của nhiều thành phần

    Function TimMin(thamso As Variant)
    Dim i As Integer
    TimMin = thamso(LBound(thamso))
    For i = LBound(thamso) To UBound(thamso)
    If thamso(i) < TimMin Then
    TimMin = thamso(i)
    End If
    Next
    End Function
    Công ty Cổ phần kỹ thuật công trình- Thương mại C.N.C.C
    Email : cncc.jsc@gmail.com

  • #2
    Ðề: Thư viện các hàm tự lập bằng VB

    Oh, do sơ suất nên quên không post hàm HoanVi, cám ơn anh Phan Tự Hướng nhiều.


    '=====================HAM HOAN VI 2 gia tri
    Sub HoanVi(GiaTri1, GiaTri2)
    Dim GiaTriTam
    GiaTriTam = GiaTri2
    GiaTri2 = GiaTri1
    GiaTri1 = GiaTriTam
    End Sub
    Công ty Cổ phần kỹ thuật công trình- Thương mại C.N.C.C
    Email : cncc.jsc@gmail.com

    Ghi chú


    • #3
      Ðề: Thư viện các hàm tự lập bằng VB

      to bác PMXD: Tôi không biêt VB đâu, nhưng tôi thấy nếu sắp xếp mảng thì nên viết thế này chẳng hạn thì tính toán nó sẽ đơn giản hơn nhiều


      Sub SapXepThuTuMang(Mang)
      Dim i As Long, j As Long, N As Long

      N = UBound(Mang)
      For i = 0 To N-1
      For j = i+1 To N
      if Mang(i) < Mang(j) Then
      HoanVi Mang(i), Mang(j)
      End If
      Next j
      Next i
      End Sub

      Với lại đây là sắp xếp theo thứ tự giảm dần.
      Does engineering need science?

      Ghi chú


      • #4
        Ðề: Thư viện các hàm tự lập bằng VB

        Em thấy đúng là hàm SapXepThuTuMang của bác PMXD là sắp xếp tăng dần đấy chứ (BubbleSort).
        Nếu viết theo cách của bác phu_ho (SelectionSort) thì lại là sắp xếp giảm dần.

        Tuy nhiên vòng lặp sau For j = 0 To UBound(Mang) thì hơi thừa, chỉ cần For j = 0 To i là được.

        Nếu ai quan tâm đến thuật toán sắp xếp, có 1 chương trình nhỏ có 1 số thuật toán sắp xếp và so sánh tốc độ giữa chúng.


        Đây là hàm sưu tầm, không phải em tự lập -> Em bị lạc đề mất rồi.
        Attached Files
        Last edited by minhtu; 23-05-2006, 07:06 PM.

        Ghi chú


        • #5
          Ðề: Thư viện các hàm tự lập bằng VB

          Xin cảm ơn bác phu_ho và minhtu đã đóng góp ý kiến. Do đây là hàm cũng nhỏ nên tôi vẫn dùng thuật toán chưa tối ưu. Nhân đây, tôi đề xuất ý kiến nên lập ra một Box chuyên trao đổi các thuật toán (dù là đơn giản nhất) để chia sẻ các thủ thuật lập trình.
          Công ty Cổ phần kỹ thuật công trình- Thương mại C.N.C.C
          Email : cncc.jsc@gmail.com

          Ghi chú


          • #6
            Ðề: Thư viện các hàm tự lập bằng VB

            Cho em hỏi mấy vấn đề về macro trong excel.
            1>Anh xem code VB(file kèm theo). E nhập data từ file access xuất ra từ sap 2000. Từ vùng data dung lệnh counta đếm được số hang. Anh cho e hỏi dủng lệnh gì để bảng tính chạy từ hang thứ 1 đền hang thứ counta chứ không phải đến hang thứ 10.000 (hay max 65534). Nếu chạy như vậy thì chương trình tính sẽ chậm vì nó tính cả những hàng không có phần tử?
            2>Do chạy từ hang đầu tiên đến hàng thứ 10.000 (or max 645534) nên khó quản lý trang in.
            3>Hạn chế của file này là chỉ cập nhật được file access trong thư mục mặc định khi viết macro, làm sao khắc phục trình trạng này?
            4>Làm sao mỗi khi mở file excel lên thì các macro “deldata”, “inputdata”, “tinhthep” sẽ tự động cập nhật chứ không phải chạy thủ cong từng macro?

            Em thấy mấy file người ta còn tạo mấy cái nút, để khi nhập liệu vào xong thì "bấm" cho no chạy trong excel, làm cái đó như thế nào nhi?
            Attached Files

            Ghi chú


            • #7
              Ðề: Thư viện các hàm tự lập bằng VB

              Nguyên văn bởi alpha_cont
              Cho em hỏi mấy vấn đề về macro trong excel.
              1>Anh xem code VB(file kèm theo). E nhập data từ file access xuất ra từ sap 2000. Từ vùng data dung lệnh counta đếm được số hang. Anh cho e hỏi dủng lệnh gì để bảng tính chạy từ hang thứ 1 đền hang thứ counta chứ không phải đến hang thứ 10.000 (hay max 65534). Nếu chạy như vậy thì chương trình tính sẽ chậm vì nó tính cả những hàng không có phần tử?
              2>Do chạy từ hang đầu tiên đến hàng thứ 10.000 (or max 645534) nên khó quản lý trang in.
              3>Hạn chế của file này là chỉ cập nhật được file access trong thư mục mặc định khi viết macro, làm sao khắc phục trình trạng này?
              4>Làm sao mỗi khi mở file excel lên thì các macro “deldata”, “inputdata”, “tinhthep” sẽ tự động cập nhật chứ không phải chạy thủ cong từng macro?

              Em thấy mấy file người ta còn tạo mấy cái nút, để khi nhập liệu vào xong thì "bấm" cho no chạy trong excel, làm cái đó như thế nào nhi?
              1. MsgBox Application.WorksheetFunction.CountA(Worksheets("DAM").Range("A1:A65536"))
              Cách này cẩn thận khi có dòng dữ liệu trống xen giữa --> khi tính toán dễ gây lẫn
              Có nhiều cách để xác định dòng dưới cùng có dữ liệu.
              3. MsgBox Application.ActiveWorkbook.Path & "\"
              4. Thuộc tính của ThisWorkbook
              Private Sub Workbook_Open()
              DelData
              InputData
              TINHTHEP
              End Sub

              Muốn tạo nút:
              Phải chuột vào toolbar, customize...
              bên tab Commands mục Categories chọn New Menu, mục Commands lôi cái New Menu ra toolbar
              Phải chuột vào nút mới đó Assign Macro.
              OK
              Tuy nhiên nên xem phần tạo menu khi mở, xóa menu khi đóng
              Last edited by minhtu; 29-05-2006, 11:26 PM.

              Ghi chú


              • #8
                Ðề: Thư viện các hàm tự lập bằng VB

                [QUOTE=minhtu]Em thấy đúng là hàm SapXepThuTuMang của bác PMXD là sắp xếp tăng dần đấy chứ (BubbleSort).
                Nếu viết theo cách của bác phu_ho (SelectionSort) thì lại là sắp xếp giảm dần.

                Tuy nhiên vòng lặp sau For j = 0 To UBound(Mang) thì hơi thừa, chỉ cần For j = 0 To i là được.

                QUOTE]

                Các bác không chuyên rồi. Thuật toán "sủi bọt" (bubble sort) này là thuật toán cơ bản nhất khi học tin. Ở đây ta nên dùng với phép lặp điều kiện thì đúng hơn là với phép lặp đếm. Điều này cho phép chủ động dừng vòng lặp khi thuật toán đã hoàn tất (chứ không nhất thiết phải thực hiện toàn bộ 2 phép lặp chồng nhau) và sẽ không sót trường hợp nào.

                Dim Mang() As Double
                Dim i As Integer
                Dim isNotYetSorted As Boolean
                Do
                isNotYetSorted = False
                For i = Lbound(Mang) to Ubound(Mang) - 1
                If Mang(i) > Mang(i + 1) Then
                HoanVi(Mang(i), Mang (i+1))
                isNotYetSorted = True
                End If
                Next
                Loop Until Not isNotYetSorted.

                Các bác check lại xem nhé.

                Ghi chú


                • #9
                  Ðề: Thư viện các hàm tự lập bằng VB

                  Nguyên văn bởi morpheus
                  Các bác không chuyên rồi. Thuật toán "sủi bọt" (bubble sort) này là thuật toán cơ bản nhất khi học tin. Ở đây ta nên dùng với phép lặp điều kiện thì đúng hơn là với phép lặp đếm. Điều này cho phép chủ động dừng vòng lặp khi thuật toán đã hoàn tất (chứ không nhất thiết phải thực hiện toàn bộ 2 phép lặp chồng nhau) và sẽ không sót trường hợp nào.

                  Dim Mang() As Double
                  Dim i As Integer
                  Dim isNotYetSorted As Boolean
                  Do
                  isNotYetSorted = False
                  For i = Lbound(Mang) to Ubound(Mang) - 1
                  If Mang(i) > Mang(i + 1) Then
                  HoanVi(Mang(i), Mang (i+1))
                  isNotYetSorted = True
                  End If
                  Next
                  Loop Until Not isNotYetSorted.

                  Các bác check lại xem nhé.
                  Rất cám ơn morpheus đã đóng góp ý kiến. Ở diễn đàn cũng hầu hết là các anh em xây dựng tự lập trình nên đôi lúc cũng không tránh khỏi việc thiếu tối ưu trong thuật toán. Ở bài viết lần trước, tôi cũng đề xướng mở một chủ đề bàn về các thuật toán hay gặp khi lập trình cho các ứng dụng trong xây dựng, nhưng không thấy ai ủng hộ.
                  Công ty Cổ phần kỹ thuật công trình- Thương mại C.N.C.C
                  Email : cncc.jsc@gmail.com

                  Ghi chú


                  • #10
                    Ðề: Thư viện các hàm tự lập bằng VB

                    Nguyên văn bởi morpheus
                    Các bác không chuyên rồi. Thuật toán "sủi bọt" (bubble sort) này là thuật toán cơ bản nhất khi học tin. Ở đây ta nên dùng với phép lặp điều kiện thì đúng hơn là với phép lặp đếm. Điều này cho phép chủ động dừng vòng lặp khi thuật toán đã hoàn tất (chứ không nhất thiết phải thực hiện toàn bộ 2 phép lặp chồng nhau) và sẽ không sót trường hợp nào.
                    Em cũng được học một ít về tin học thì được biết các bài toán mức độ tính toán phụ thuộc dữ liệu đầu vào thì không có giải thuật nào là tốt nhất. Mỗi giải thuật hay trong trường hợp này nhưng lại chưa hay trong trường hợp khác. Các bác cứ thử với 2 bộ số liệu (9,8,7,6,5,4,3,2,1,0) và (0,1,2,3,4,5,6,7,8,9) rồi dùng thử các hàm sort sẽ thấy mỗi giải thuật hay với bộ 1 nhưng chưa chắc đã hay với bộ 2 và ngược lại.

                    Còn giải thuật nổi bọt theo lý thuyến vẫn có 2 vòng for ***g nhau, không biết có cách 2 như bác viết không.

                    Nguyên văn bởi PMXD
                    Ở bài viết lần trước, tôi cũng đề xướng mở một chủ đề bàn về các thuật toán hay gặp khi lập trình cho các ứng dụng trong xây dựng, nhưng không thấy ai ủng hộ
                    Em ủng hộ.
                    Last edited by minhtu; 30-05-2006, 01:11 PM.

                    Ghi chú


                    • #11
                      Ðề: Thư viện các hàm tự lập bằng VB

                      Nguyên văn bởi PMXD
                      Rất cám ơn morpheus đã đóng góp ý kiến. Ở diễn đàn cũng hầu hết là các anh em xây dựng tự lập trình nên đôi lúc cũng không tránh khỏi việc thiếu tối ưu trong thuật toán. Ở bài viết lần trước, tôi cũng đề xướng mở một chủ đề bàn về các thuật toán hay gặp khi lập trình cho các ứng dụng trong xây dựng, nhưng không thấy ai ủng hộ.
                      Bác PMXD cứ lập ra đi, đồng bào nhiều khi cũng chẳng chủ động lắm đâu. Nếu lập ra một thời gian mà thấy không có hiệu quả thì ta lại đóng lo gì. Bác là mod mà, tiếp thị thêm vài bài ở các chủ đề khác thế nào chả có người quan tâm. Tôi nghĩ mục đó cũng sẽ HOT đấy. Ít nhất bác cũng đã có 2 thành viên rồi nhé.

                      Ghi chú


                      • #12
                        Ðề: Thư viện các hàm tự lập bằng VB

                        Xin chào mọi người!
                        Lâu nay tôi cũng chẳng lập thêm được hàm nào hay ho cả, các hàm thông thường có POST lên chắc cũng không hiệu quả. Để góp vui thêm cho Box, tôi thảo luận với anh em về 1 thuật toán mà trước đây tôi thu thập được.
                        '========
                        Đề bài: Cho một tập hợp N(gồm n phần tử),. Hãy tìm trong tập hợp N phần tử thỏa mãn tính chất A.
                        '========
                        Khi đọc đề bài này, chắc ai cũng nghĩ ngay đến thuật toán "VÉT CẠN", đó là dùng vòng For chạy từ đầu đến cuối tập hợp để tìm ra phần tử có thuộc tính A. Tuy nhiên, nếu số lượng phần tử rất rất nhiều thì vòng lặp này sẽ chạy rất lâu (Đặc biệt khi dùng ngôn ngữ VB) vì số phép tính là n!.
                        '========
                        Thuật toán "CHIA ĐÔI" (tôi quên tên chính xác rồi, cứ tạm gọi như vậy):Chia đôi tập hợp ban đầu thành 2 tập hợp con N1 và N2. Dùng 1 vòng lặp For chạy trong tập hợp N1. Nếu gặp phần tử thỏa mãn thuộc tính A thì kết thúc lặp, nếu chạy hết mà không gặp phần tử đó thì xét đến tập con N2. Trong tập con N2 lại chia thành 2 tập con N21 và N22 và làm tương tự.
                        Cứ như vậy thì số lượng phép toán sẽ giảm đi rất nhiều, tăng tốc độ chạy chương trình.
                        Nếu bạn nào dùng Delphi hoặc C++ chắc cũng chẳng cần để ý đến thuật toán này, nhưng tôi làm VB, nếu cứ "VÉT CẠN" nhiều khi chạy toàn "TREO MÁY"
                        Các bạn xem có gì đóng góp ý kiến
                        Công ty Cổ phần kỹ thuật công trình- Thương mại C.N.C.C
                        Email : cncc.jsc@gmail.com

                        Ghi chú


                        • #13
                          Ðề: Thư viện các hàm tự lập bằng VB

                          Mục đích của bài toán trên là lọc trong 1 tập hợp những phần tử thỏa mãn điều kiện nào đó. Theo tôi, số phép tính duyệt chỉ là n, bằng số phần tử của tập hợp, không phải là n!???

                          Không có cái nào tốt hơn và dễ hơn cách for i:=0 to n-1 do duyet(i)

                          Không cần bàn việc tối ưu ở đây, nếu bàn thì bài toán cần thêm dữ kiện.

                          Ghi chú


                          • #14
                            Ðề: Thư viện các hàm tự lập bằng VB

                            ok. Đúng là n chứ không phải là n! . Khi cho chung chung như thế thì chỉ có cách làm for(i=1 to n). Còn khi muốn tối ưu thì phải xắp xếp theo một quy luật nhất định

                            Ghi chú


                            • #15
                              Ðề: Thư viện các hàm tự lập bằng VB

                              Các bác cho em hỏi sử dụng hàm Redim như thế nào?
                              Có thể khai báo giatri=redim(i,j,k)
                              sau đó tìm giá trị k nào đó thì ta cũng tìm được giá trị i, j tương ứng
                              vd: i là phần tử, j là vị trí mặt cắt, k là giá trị moment
                              Cám ơn các Bác

                              Ghi chú

                              Working...
                              X