cần giúp đỡ về hàm lọc nội lực dầm (1 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

nightlight

Thành viên mới
Tham gia
10/6/11
Bài viết
2
Được thích
0
mình mới lập hàm có chức năng lọc nội lực dầm tại 3 vị trí đầu, giữa và cuối nhưng hàm này chạy rất lâu nếu hàm nội lực có số lượng phần tử lớn.mọi người giúp mình viết lại hàm để chạy nhanh hơn:
file code hàm:
 
Public Function momen(a As Double, tendam As String, tang As String, tohop As String)
Dim mang3(1, 100) As Double
Dim i As Double
Dim j As Double
Dim mang2 As Range
Set mang2 = Range("a2:j66487") 'đọc bảng nội lực
b = 1
For i = 1 To 66486
If mang2(i, 2) = tendam And mang2(i, 1) = tang And mang2(i, 3) = tohop Then
mang3(1, b) = mang2(i, 10)
b = b + 1
End If
Next i
If a = 1 Then momen = mang3(1, 1) 'lấy momen đầu dầm
If a = 2 Then momen = mang3(1, b / 2) 'lấy momen giữa dầm
If a = 3 Then momen = mang3(1, b - 1) 'lấy momen cuối dầm
End Function
 
Lần chỉnh sửa cuối:
Upvote 0
ban ui! ban huong dan minh voi, de tai nay minh cung dang tham khao
zay lam lam de code tren hoat dong bay gio
minh de no zo modunl rui ma van ko bit lam sao de no chay duoc?
 
Upvote 0
Public Function momen(a As Double, tendam As String, tang As String, tohop As String)
Dim mang3(1, 100) As Double
Dim i As Double
Dim j As Double
Dim mang2 As Range
Set mang2 = Range("a2:j66487") 'đọc bảng nội lực
b = 1
For i = 1 To 66486
If mang2(i, 2) = tendam And mang2(i, 1) = tang And mang2(i, 3) = tohop Then
mang3(1, b) = mang2(i, 10)
b = b + 1
End If
Next i
If a = 1 Then momen = mang3(1, 1) 'lấy momen đầu dầm
If a = 2 Then momen = mang3(1, b / 2) 'lấy momen giữa dầm
If a = 3 Then momen = mang3(1, b - 1) 'lấy momen cuối dầm
End Function

Bạn có

Mã:
Dim mang3(1, 100) As Double
...
if ...
 mang3(1, b) = mang2(i, 10)
 b = b + 1
end if

Thế nếu b vượt quá 100 thì sao? Sẽ không bao giờ sẩy ra?

Bạn sửa thành (mà Long là được rồi mà bạn)

Mã:
Dim i As Long
Dim mang2
mang2 = Range("a2:j66487").Value


Hiện code của bạn luôn kiểm tra đk 3 lần cho dù a như thế nào (a = 1?, a = 2 ?, a = 3?)
Bạn sửa thành

Mã:
If a = 1 Then 
 momen = mang3(1, 1)
elseIf a = 2 Then 
 momen = [COLOR=#ff0000]mang3(1, b / 2)[/COLOR]
elseIf a = 3 Then 
 momen = mang3(1, b - 1) 
end if

Như thế nếu a = 1 thì code kiểm tra đk 1 lần, với a = 2 thì code kiểm tra đk 2 lần thôi.
Bạn chú ý chỗ tô đỏ. Thế nếu b lẻ thì sao? vd. b = 9 thì bạn tính mang3(1, 4.5)???
Đổi thế này được không?

Mã:
elseIf a = 2 Then 
 momen = mang3(1, (b + 1) \ 2)
 
Upvote 0
Vì bạn chưa đưa đưa cái bảng nội lực ấy lên, nên chỉ fát biểu theo ~ gì hiểu mà thôi

(1) Hàm của bạn nên viết thế này:
PHP:
Option Explicit
Public Function Momen(a As Double, Tang As String, TenDam As String, ToHop As String)
 Dim Mang3(1, 100) As Double:                   Dim Rng As Range
 Dim i As Double, j As Double
 Set Rng = Range("a2:j66487")                   'Doc Bang Noi Luc'
 b = 1
 For i = 1 To 66486
    If Rng(i, 1) = Tang And Rng(i, 2) = TenDam And Rng(i, 3) = ToHop Then
        Mang3(1, b) = Rng(i, 10)
        b = b + 1
    End If
 Next i
 If a = 1 Then Momen = Mang3(1, 1)              'Láy Momen Dàu Dàm'
 If a = 2 Then Momen = Mang3(1, b / 2)          'Láy Momen Giua Dàm'
 If a = 3 Then Momen = Mang3(1, b - 1)          'Láy Momen Cuói Dàm'
End Function

Bạn có thấy nó mạch lạc & chân fương hơn không?

(2) Bạn chỉ cần dò 3 cột đầu trong bảng tra, nhưng lại đưa cả các cột sau vô mảng, chuyện này sẽ làm nặng thêm cho chương trình;
Bạn thử bới đi hẵn, chỉ lấy cột đầu của bảng dò cho vô Rng mà thôi xem sao;

(Lúc đó bạn có thể xài fương thức .Offset(,n) để truy cứu trách nhiệm hình sự các dữ liệu fía fải của ô nào đó cụ thể khi duyệt mà!)

(3) Hình như bạn bắt chương trình lúc nào cũng fải duyệt hết 1 vòng của bảng mới thôi?
Lý ra bạn cần thoát ngay vòng lặp sau khi đã tìn thấy dữ liệu thỏa điều kiện chứ, nhỉ?
(Í mình là bạn chưa xài Exit For lúc cần)

(4) Hình như 3 dòng IF cuối hàm đó ta có thể đưa vô vòng lặp để là điều kiện, lúc đó hàm sẽ chuyên môn tìm dữ liệu cho bạn (1 trong 3) hơn (?) Chuyện này ta có thể thảo luận kỹ hơn khi được bạn mô tả kỹ hơn bản dò.

Thân ái!
 
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
Web KT

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

Back
Top Bottom