Hàm tự tạo tính toán nhanh hơn?

Liên hệ QC

emgaingayngo

Thành viên hoạt động
Tham gia
9/2/07
Bài viết
141
Được thích
5
Minh thấy trên diễn đàn có nhiều bài viết về cách biên dịch một hàm tự tạo (UDF) thành mã máy để tốc độ tính tóan nhanh hơn, nhưng các bài viết còn ở mức độ cao.
Vậy mình mở topic này mong các cao thủ hướng dẫn cụ thể từ cơ bản đến nâng cao để các bạn ở trình độ thấp hơn dễ học.
Ví dụ mình có một hàm như sau : Dùng để tìm khỏang cách lớn nhất của 01 số trong một miền.

PHP:
Public Function MAXCOT(ByVal rngRange As Range, sngNumber As Single) As Long
    Dim lRows As Long, iCols As Integer, iAreasCount As Integer, blnColContentValue As Boolean
    Dim vCellValue
    Dim iDisMax As Integer, iDisMaxCount As Integer  
  'Khoang cach cot lon nhat dua vao so dua vao'
    Dim i As Integer, j As Long, blnStarCount As Boolean
    'Kiem tra xem rngRange nay co bao nhieu Areas?'
    iAreasCount = rngRange.Areas.Count
    If iAreasCount <> 1 Then
        MAXCOT = -1
        Exit Function
    Else
        lRows = rngRange.Rows.Count
        iCols = rngRange.Columns.Count
        iDisMaxCount = 0: iDisMax = 0: blnStarCount = False
        With rngRange
            For j = 1 To iCols
                blnColContentValue = False    'Gia su rang cot nay khong chua gia tri'
                For i = 1 To lRows
                    vCellValue = CSng(.Cells(i, j))
                    If vCellValue = sngNumber Then
                        blnColContentValue = True
                        Exit For
                    End If
                Next i
                If blnColContentValue Then
                    'Neu cot co gia tri thi bat dau dem'
                    blnStarCount = True
                    If iDisMaxCount > iDisMax Then
                        iDisMax = iDisMaxCount
                        'iDisMaxCount = 0'
                    End If
                    iDisMaxCount = 0
                Else
                    'Neu chua tim thay trong cot nay'
                    'Dong thoi cung chua tim thay cot chua gia tri de bat dau dem'
                    If blnStarCount Then
                        iDisMaxCount = iDisMaxCount + 1
                    End If
                End If
            Next j
        End With
        MAXCOT = iDisMax + 1
    End If
End Function
Xin các cao thủ đừng bàn về giải thuật, mà hướng dẫn cụ thể cách biên dịch thành mã máy hay dll... gì đó.
Thánks Much!
 
Biên dịch thành .dll thì dùng VB. Còn trong Excel mà biên dịch thành mã máy ??? mới nghe đó.
 
Upvote 0
emgaingayngo đã viết:
Minh thấy trên diễn đàn có nhiều bài viết về cách biên dịch một hàm tự tạo (UDF) thành mã máy để tốc độ tính tóan nhanh hơn, nhưng các bài viết còn ở mức độ cao.
Vậy mình mở topic này mong các cao thủ hướng dẫn cụ thể từ cơ bản đến nâng cao để các bạn ở trình độ thấp hơn dễ học.
Ví dụ mình có một hàm như sau : Dùng để tìm khỏang cách lớn nhất của 01 số trong một miền.



Xin các cao thủ đừng bàn về giải thuật, mà hướng dẫn cụ thể cách biên dịch thành mã máy hay dll... gì đó.
Thánks Much!
Biến thành mã máy thì tớ chỉ nghe loáng thoáng chứ không biết cách làm.
Tuy nhiên một hàm muốn chạy nhanh phụ thuộc rất nhiều vào giải thuật đó bạn ạ.

Bác nào biết biến thành file dll thì có thể làm 1 bài chi tiết giúp mọi người được không.

Cảm ơn nhiều.

Thân!
 
Upvote 0
Coi chừng bạn ấy muốn biến thành file XLA mà lại nói lộn qua MÃ MÁY gì gì đó ấy chứ...
 
Upvote 0
Cách tạo một ActiveX DLL

1. Tạo ActiveX DLL bằng VB6
Khởi động VB6
Nhấn File/ New Project, rồi chọn ActiveX DLL
Với đoạn code của bạn có sử dụng các đối tượng của Excel nên bạn nhấn Project/ References, chọn Microsoft Excel 11.0 Object Library (số 11.0 này có thể khác, tuỳ theo phiên bản Office mà bạn đang sử dụng). Nhấn OK để đóng hộp thoại.
Bạn thêm đoạn code của bạn vào trong Class1 (thay đổi tên Class1 nếu bạn thích...)
Mã:
Option Explicit
Public Function MAXCOT(ByVal rngRange As Range, sngNumber As Single) As Long
Dim lRows As Long, iCols As Integer, iAreasCount As Integer, blnColContentValue As Boolean
Dim vCellValue
Dim iDisMax As Integer, iDisMaxCount As Integer 'Khoang cach cot lon nhat dua vao so dua vao
Dim i As Integer, j As Long, blnStarCount As Boolean
'Kiem tra xem rngRange nay co bao nhieu Areas?
iAreasCount = rngRange.Areas.Count
If iAreasCount <> 1 Then
    MAXCOT = -1
    Exit Function
Else
    lRows = rngRange.Rows.Count
    iCols = rngRange.Columns.Count
    iDisMaxCount = 0: iDisMax = 0: blnStarCount = False
    With rngRange
        For j = 1 To iCols
            blnColContentValue = False 'Gia su rang cot nay khong chua gia tri
            For i = 1 To lRows
                vCellValue = CSng(.Cells(i, j))
                If vCellValue = sngNumber Then
                    blnColContentValue = True
                    Exit For
                End If
            Next i
            If blnColContentValue Then
                'Neu cot co gia tri thi bat dau dem
                blnStarCount = True
                If iDisMaxCount > iDisMax Then
                    iDisMax = iDisMaxCount
                    'iDisMaxCount = 0
                End If
                iDisMaxCount = 0
            Else
                'Neu chua tim thay trong cot nay
                'Dong thoi cung chua tim thay cot chua gia tri de bat dau dem
                If blnStarCount Then
                    iDisMaxCount = iDisMaxCount + 1
                End If
            End If
        Next j
    End With
    MAXCOT = iDisMax + 1
End If
End Function
Đặt tên cho Project bằng cách nhấn Project/ Project1 Properties: gõ tên trong phần ProjectName (tab General).
Biên dịch ra file *.dll bằng cách nhấn File/ Make [ProjectName].dll
(Nếu có lỗi sẽ không biên dịch ra file *.dll được, bạn phải sửa các lỗi đó).

2. Cách sử dụng:
Khởi động Excel
Nhấn Tools/ Add-Ins/ Automation/ Browse đến file *.dll mà bạn vừa tạo trong VB6. Nhấn OK để trở về hộp thoại Automation Servers.
Trong khung Automation Servers available chọn [ProjectName].ClassName rồi nhấn OK để trở về hộp thoại Add-Ins.
Chọn [ProjectName].ClassName rồi nhấn OK để đóng hộp thoại Add-Ins.
Công việc cuối cùng là sử dụng thành quả mà bạn đã tạo ra thôi!
Chú ý: Trong hộp thoại Insert Function sẽ có thêm 1 Category với tên là [ProjectName].ClassName để chứa các hàm đã tạo...
Các bạn tham khảo những bài sau:
- Cách khai báo biến TARGET của thủ tục nằm trong *.DLL
- Gọi thủ tục từ một file *.dll
....
 
Upvote 0
Mình làm theo hướng dẫn của bạn và bị báo lỗi như sau :
User-definded type not definded. xuất hiện ở dòng :
Public Function MAXCOT(ByVal rngRange As Range, sngNumber As Single) As Long
Bạn giúp luôn đi, mình chưa có MSDN để xem Help
 
Upvote 0
emgaingayngo đã viết:
Mình làm theo hướng dẫn của bạn và bị báo lỗi như sau :
User-definded type not definded....
Lỗi đó là do VB không hiểu cách khai báo đối tượng Range đó.
Bạn đọc kỹ nhé!
nvson đã viết:
Nhấn File/ New Project, rồi chọn ActiveX DLL
Với đoạn code của bạn có sử dụng các đối tượng của Excel nên bạn nhấn
Project/ References, chọn Microsoft Excel 11.0 Object Library (số 11.0 này có thể khác, tuỳ theo phiên bản Office mà bạn đang sử dụng). Nhấn OK để đóng hộp thoại.
 
Lần chỉnh sửa cuối:
Upvote 0
Web KT

Bài viết mới nhất

Back
Top Bottom