Em dự định làm 1 cái combo box khai báo mác BT và liên kết nó với ô chứa cường độ chịu nén Rn, khi mình chọn mác BT, chẳng hạn M200, thì sẽ có Rn ngay. Ai chỉ giùm với!?!
Những VBA của tôi khó dùng lắm sao
Tôi mở chủ đề này để thảo luận về lập trình trong Excel mà. Có thể một số bạn cho rằng các hàm tôi đã Upload lên có thể viết lại bằng các hàm huẩn của Excel, điều đó cũng đúng thôi. Đã có câu nói là "Mọi con đường đều dẫn đến thành Rome mà". Tuy nhiên, nếu có khi nào mà các bạn ko thể dùng hàm chuẩn của Excel đã lập ứng dụng của các bạn thì gọi tôi nhé
Các chương trình viết bằng VBA khi quét Virus bằng công cụ của anh Nguyễn Tử Quảng thường bị clean luôn. Cái đó muốn khắc phục, các bạn cứ Zip nó lại là ngon lành ngay à. Các chương trình Scan Virus mới hiện nay đều đã tránh được tình trạng này rồi.
Chúc các bạn một năm mới an khang tịnh vượng, chúc diễn đàn sang năm mới có nhiều phát triển.
Cám ơn PMXD đã viêt nhiều hàm cho Excel. Nhưng thật lòng mà nói, mong PMXD đừng giận, các hàm viết bằng VB rất khó dùng. Mặt khác, các hàm này dễ bị các chương trình diệt virut như BKAV hiểu nhầm nên diệt nghéo luôn.
Cũng các hàm này có thể viết bằng các hàm chuẩn của Excel.
Như hàm tra bảng nội suy chỉ cần hàm VLOOKUP hoặc HLOOKUP là được.
Tôi sẽ dành thời gian viết lại các hàm của PMXD từ VB sang hàm chuẩn của Excel.
Chào các anh em trong diễn đàn!
Từ ngày hôm nay, tôi sẽ cố gắng post mỗi tuần một hàm Excel mà tôi đã từng dùng để tính toán thiết kế. Ai ủng hộ tôi xin hãy lên tiếng cho diễn đàn them khí thế!
'==================HÀM SỐ 1===========================
' NỘI SUY MỘT BẢNG THEO GIÁ TRỊ
'====================================================
Function TraBang2Chieu(ByVal Hang, ByVal Cot, VungChon As Range)
Dim i As Long, j As Long
Dim TangAnPha
Dim NoiSuy1 As Double, NoiSuy2 As Double
For i = 1 To UBound(VungChon.Value, 2) ' Theo phuong ngang
If Hang = VungChon(1, i) Then
For j = 1 To UBound(VungChon.Value, 1) - 1
If (Cot - VungChon(j, 1)) * (Cot - VungChon(j + 1, 1)) <= 0 Then
TangAnPha = (VungChon(j + 1, i) - VungChon(j, i)) / (VungChon(j + 1, 1) - VungChon(j, 1))
TraBang2Chieu = VungChon(j, i) + (Cot - VungChon(j, 1)) * TangAnPha
GoTo Thoat:
End If
Next j
ElseIf (Hang - VungChon(1, i)) * (Hang - VungChon(1, i + 1)) < 0 Then
For j = 1 To UBound(VungChon.Value, 1) - 1
If (Cot - VungChon(j, 1)) * (Cot - VungChon(j + 1, 1)) < 0 Then
TangAnPha = (VungChon(j, i + 1) - VungChon(j, i)) / (VungChon(1, i + 1) - VungChon(1, i))
NoiSuy1 = VungChon(j, i) + (Hang - VungChon(1, i)) * TangAnPha
TangAnPha = (NoiSuy2 - NoiSuy1) / (VungChon(j + 1, 1) - VungChon(j, 1))
TraBang2Chieu = NoiSuy1 + (Cot - VungChon(j, 1)) * TangAnPha
GoTo Thoat:
End If
Next j
End If
Next i
Thoat:
'TraBang = UBound(VungChon.Value, 2)
End Function
'=====================================================
Mời các bác Copy hàm này vào Excel và sử dụng theo từng bước như sau:
1- Mở Excel
2- Nhấn Ctrl+F11
3- Insert 1 Module trong môi trường VBA
4- Copy hàm bên trên vào
5- Sử dụng như 1 hàm Excel thông thường với 3 tham số:
+ Giá trị của hàng
+ Giá trị của cột
+ Vùng giá trị của bảng
Ghi chú: Bác nào vẫn còn lơ mơ thì cứ A lô nhé
'===============================
Nguyễn Việt Anh
Phòng KCXD- IBST
047544277
Cho em hoi :
3- Insert 1 Module trong môi trường VBA
là sao? Em không hiểu lắm.Anh có thể chỉ cụ thề hơn. Em chưa biết gì về cái này lắm.
Chào các bạn!
Sau một thời gian không đăng thêm hàm VBA nào trên diễn đàn, PMXD tôi thấy không khí có vẻ lại lắng xuống. Hôm nay, để hâm lại không khí trong những ngày đầu năm mới, PMXD tôi xin đăng hàm Tính thép cột theo TCVN để anh em cùng tham khảo.
'=====================================================
1- Tên hàm: Facot
2- Các tham số chính
M- Mô men (Kgm)
N- Lực dọc (Kg)
b- Bề rộng tiết diện (m)
h- Chiều cao tiết diện (m)
ao- Chiều dày lớp bảo vệ cốt thép
l - Chiều dài (thực tế) cột
Mdh- Thành phần momen dài hạn
Ndh- Thành phần lực dọc dài hạn
MBT- Mác bê tông (nếu ko nhập thì giá trị mặc định là 250)
KieuCotThep- Loại cốt thép (nếu ko nhập thì giá trị mặc định là "AII")
Kieulienket- Hình thức liên kết cua cột
= 1 : hai đầu ngàm
= 2 : hai đầu khớp
= 3 : 1 đầu ngàm, một đầu khớp
= 4 : 1 đầu ngàm, 1 đầu tự do
3- Thuật toán tổng thể của hàm
- Tính toán các thông số ban đầu
- Giả thiết giá trị hàm lượng cốt thép (Muy) ban đầu
- Tính toán giá trị Muy thực tế
- So sánh, tính lặp cho đến khi Muy giả thiết xấp xỉ Muy tính toán
- Tính diện tích cốt thép theo giá trị Muy cuối cùng
- So sánh với diện tích thép tính theo bài toán kéo (nén) đúng tâm
- Lấy giá trị Max của hai trường hợp
4- Nội dung của hàm
Function FaCot(ByVal M As Double, ByVal N As Double, ByVal b As Double, h As Double, _
ByVal ao As Double, ByVal l As Double, Optional Mdh = 0, Optional Ndh = 0, Optional MBT = 250, Optional KieuCotThep = "AII", Optional KieuLienKet = 1)
'============================Don vi tinh toan Kg,m
Dim Lo As Double 'Chieu dai tinh toan cua cau kien(m)
Dim ho As Double
Dim Muy As Double, nuy As Double, MuyGt As Double, NuyMin As Double
Dim Eo As Double, e As Double, eogh As Double, X As Double
Dim s As Double, Nth As Double
Dim Ja As Double, Jb As Double
Dim Phi As Double
Dim Kdh As Double
Dim MuyMin As Double
Dim Rn As Double, Rk As Double, Eb As Double, Ra As Double, Rad As Double, Ea As Double
Dim Fat As Double, HamLuongCot As Double
Dim Fadungtam As Double
If M <> 0 Then Kdh = 1 + Mdh / M
'==============================Xac dinh chieu dai tinh toan cua cot
Select Case KieuLienKet
Case 1 ' Hai dau ngam
Lo = 0.7 * l
Case 2 ' Hai dau khop
Case 3 'Dau ngam dau khop
Case 4 ' Dau ngam va Dau tu do
End Select
'==============================Xac dinh cac thong so cua be tong va thep
BeTong MBT, Rn, Rk, Eb
CotThep KieuCotThep, Ra, Rad, Ea
ho = h - ao
Phi = PhiUD(Lo, b, "R")
FaCot = 0: Fat = 0
'======================
MuyMin = TimMax(Array(HamLuongCot * 100, MuyMinVa(Lo, b, h, 0)))
If N = 0 Then
FaCot = 0: Fat = 0
ElseIf M = 0 And N < 0 Then
'================================Tinh toan cau kien chiu nen trung tam tiet dien chu nhat
N = Abs(N)
FaCot = ((N / Phi - Rn * b * h)) / Ra
Fat = ((N / Phi - Rn * b * h)) / Ra
Muy = 100 * (FaCot + Fat) / (b * ho)
'==========================================================================
ElseIf M <> 0 And N < 0 Then
'==================================Tinh toan cau kien chiu nen lech tam tiet dien chu nhat
M = Abs(M)
N = Abs(N)
'===== Tinh cho truong hop bo qua Momen
Fadungtam = ((N / Phi - Rn * b * h)) / Ra
'===============================
MuyGt = 2 * MuyMin
Muy = MuyGt
Do
MuyGt = (MuyGt + Muy) / 2
If MuyGt < 0 Then Exit Do
Jb = b * h ^ 3 / 12
Ja = 0.01 * MuyGt * b * (h - ao) * (0.5 * h - ao) * (0.5 * h - ao)
'===================================Tinh toan do lech tam eo
If b > 0.25 And h / 25 > 0.02 Then
Eo = (M / N + h / 25)
ElseIf b > 0.25 And h / 25 < 0.02 Then
Eo = (M / N + 0.02)
ElseIf b < 0.25 And h / 25 > 0.015 Then
Eo = (M / N + h / 25)
ElseIf b < 0.25 And h / 25 < 0.015 Then
Eo = (M / N + 0.015)
End If
'================================ Tinh he so anh huong den do lech tam
If Eo < 0.05 * h Then
s = 0.84
ElseIf 0.05 * h <= Eo < 5 * h Then
s = 0.11 / (0.1 + Eo / h) + 0.1
Else
s = 0.122
End If
Nth = 6.4 * ((s * Jb * Eb / Kdh) + Ea * Ja) / (Lo * Lo)
nuy = 1 / (1 - (N / Nth))
If nuy < 0 Then FaCot = "ThiÕu thÐp": Exit Function
eogh = 0.4 * (1.25 * h - Anpha(MBT) * ho)
X = N / Rn / b
If X < Anpha(MBT) * (h - ao) Then
'====================================Tinh toan lech tam lon
If X < 2 * ao Then
FaCot = N * (nuy * Eo - 0.5 * h + ao) / Ra / (ho - ao)
ElseIf X > 2 * ao And X < Anpha(MBT) * ho Then
e = nuy * Eo + 0.5 * h - ao
FaCot = N * (e - ho + 0.5 * X) / (Ra * ho - Ra * ao)
Else
GoTo TinhTheoLechTamBe
End If
Else
TinhTheoLechTamBe:
'=====================================Tinh toan lech tam be
If nuy * Eo <= 0.2 * ho Then
X = h - (1.8 + 0.5 * h / ho - 1.4 * Anpha(MBT)) * Eo
Else
X = 1.8 * (eogh - Eo) + Anpha(MBT) * ho
End If
e = 0.5 * h + nuy * Eo - ao 'Khoang cach tu luc doc den trong tam cot thep chiu keo
FaCot = ((N * e - Rn * b * X * (ho - 0.5 * X)) / Ra / (ho - ao))
End If
'====================================Kiem tra ham luong cot thep
Muy = 200 * FaCot / (b * ho)
Loop Until Abs(Muy - MuyGt) < 0.05
Fat = FaCot
ElseIf M = 0 And N > 0 Then
'===================================Tinh toan cau kien chiu keo trung tam
M = Abs(M)
N = Abs(N)
FaCot = 0.5 * N / Ra
Fat = 0.5 * N / Ra
Muy = 100 * (FaCot + Fat) / (b * ho)
ElseIf M <> 0 And N > 0 Then
M = Abs(M)
N = Abs(N)
Eo = M / N
If Eo <= 0.5 * h - ao Then
'===================================Tinh toan cau kien chiu keo lech tam be
Fat = N * (0.5 * h - Eo - ao) / Ra / (ho - ao)
FaCot = N * (0.5 * h + Eo - ao) / Ra / (ho - ao)
Fat = TimMax(Array(Fat, FaCot))
FaCot = TimMax(Array(Fat, FaCot))
Muy = 100 * (FaCot + Fat) / (b * ho)
Else
'==================================Tinh toan cau kien chiu keo lech tam lon
X = Anpha(MBT) * ho
Fat = (N * (Eo + 0.5 * h - ao) - Anpha(MBT) * (1 - 0.5 * Anpha(MBT)) * Rn * b * ho * ho) / Ra / (ho - ao)
FaCot = (N + Anpha(MBT) * Rn * b * ho + Ra * Fat) / Ra
Fat = TimMax(Array(Fat, FaCot))
FaCot = TimMax(Array(Fat, FaCot))
Muy = 100 * (FaCot + Fat) / (b * ho)
End If
End If
FaCot = TimMax(Array(FaCot, Fadungtam))
If Muy < 1 Then
Muy = 1
Fat = Muy * b * ho / 200
FaCot = Muy * b * ho / 200
Fat = Fat * 10 ^ 4
FaCot = FaCot * 10 ^ 4
Else
FaCot = FaCot * 10 ^ 4
Fat = Fat * 10 ^ 4
End If
End Function
Chào các anh em trong diễn đàn kết cấu! Hôm nay tôi xin giới thiệu đến các anh em hai hàm siêu nhỏ nhưng khả năng của nó thì không nhỏ chút nào, hơn nữa nó lại rất hay dùng trong khi lập trình. Cũng xin chú ý với mọi người, hai hàm này thuần túy là phục vụ lập trình chứ không dùng trong các bảng tính toán của Excel. Đó là hàm Timmax và hàm Timmin
'=====================================================
1- Ý nghĩa của hàm:Tìm giá trị lớn nhất(nhỏ nhất) của các số trong một mảng (mảng có thể có kích thước bất kỳ).
2- Các tham số trong hàm: Thamso- Đây là mảng của các số thực hoặc số nguyên, số phần tử trong mảng là không giới hạn.
3- Nội dung chính của hàm
'====================Hàm Timmax Function TimMax(thamso As Variant)
Dim i As Integer
TimMax = 0
For i = 0 To UBound(thamso)
If thamso(i) > TimMax Then
TimMax = thamso(i)
End If
Next
End Function
'=====================Hàm Timmin 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
'===========Ví dụ về việc sử dụng hàm Timmax và Timmin
' Khai bao cac bien
Dim a as long, b as long, c as long
Dim Max,Min
' Gan cac gia tri cho bien
a=2:b=3:c=5
Max=Timmax(array(a,b,c))
Min=Timmin(array(a,b,c))
'====================================================
Đôi điều bình luận về 2 hàm trên:
Trong quá trình tôi lập trình, hai hàm này xuất hiện với tần suất tương đối lớn, chắc chỉ sau mấy hàm toán học thông thường như +, -, x, : khai căn, lũy thừa, trị tuyệt đối....
Đây cũng là một trong những kinh nghiệm căn bản nhất khi lập trình: Những vấn đề được xử lý thường xuyên thì nên xây dựng thành một hàm.
Chúc các bạn thành công
Hôm nay vào Ketcau.com mới để ý kỹ, một số bài trên diễn đàn có mấy ông sao vàng vàng đẹp ghê trên dòng tiêu đề. Nhìn lại bài của mình chẳng thấy ông sao nào, lạ ghê. Anh Huy trả lời giúp em cái nhẩy
Xin hoan nghênh nhiệt liệt các bác mỗi tuần lại ủng hộ một chương trình Tôi sẽ thử, lúc nào không hiểu gì sẽ nhờ các bác giải thich dùm nhé
Xin góp ý một chút : cho phần chú thích, ngoài việc giải thích tên biến, các bác nên cho thêm một dòng giải thích cái hàm các bác đang tính (tức là gõ nguyên cái công thức hoặc reference của nó), thì có lẽ dễ theo dõi hơn.
To CNPM:
Rất cảm ơn CNPM đã góp ý xây dựng cho bài viết của tôi. Tôi sẽ cố gắng giải thích ý nghĩa của các dòng lệnh trong hàm khi post bài để anh em trong diễn đàn dễ dàng tiếp nhận hơn.
Nhân dây, tôi cũng rất mong anh em nào quan tâm đến VBA, khi đọc các hàm của tôi nếu có chỗ nào khó hiểu thì cứ Post bài để hỏi, tôi sẽ trả lời trong phạm vị kahr năng của tôi.
Chúc các bạn thành công
Leave a comment: