Lập trình vba trong xay dung (1 người xem)

  • Thread starter Thread starter laiqui
  • Ngày gửi Ngày gửi
Liên hệ QC

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

laiqui

Thành viên mới
Tham gia
13/5/11
Bài viết
11
Được thích
0
Mình tạo ra một chủ đề mới về lap trinh vba trong xay dựng,các bạn nào có điều gì hay thì cho mình thỉnh giáo và chỉ dẫn với,thanks các bác nhiều làm....

Câu hỏi đầu tiên mình mún đưa ra:

ví dụ tính toán cốt thép cho cột chẳng hạn, sau khi giải nội lực bằng etabs,xuất nội lực sang excel, sau đó tiến hành lọc nội lực , lấy các cặp nội lực tương ứng với , Nmax, Mxmax, Mymax, exmax, eymax,các bác có thể chỉ em viết đoạn code này như thế nào ko....
Thanks các bạn nhiều lắm
 
Phải có dữ liệu và yêu cầu cụ thể bạn ạ. Nói chung chung vậy thì không làm được đâu. Vấn đề này cũng đề cập nhiều trong diễn đàn rồi. Bạn dùng chức năng tìm kiếm xem thử.
 
Upvote 0
lap trinh vba trong excel

cảm ơn bạn rất nhiều,đã tham gia vào đề tài này cùng mình,bay h minh up 1 file excel len,minh sieu tap duoc tren mang,nhưng ko hỉu cách viết code lắm,bạn có thể chỉ dùm mình được ko.


Sub sothtai()
Dim tht(100)
Dim cottht As Range
cotttht = ActiveSheet.Range([C2], [c2000])
Dim b As Integer, trung As Boolean, a As Integer
b = 0
For Each clls In cotttht
trung = True
For a = 0 To 100
If tht(a) = clls Then
trung = False
Exit For
End If
Next a
If trung = True Then
tht(b) = clls
b = b + 1
End If
Next clls
MsgBox b
End Sub

có mấy chỗ mình tô đậm,các bác nào có thể nói cho minh hiểu,cho do co y nghia the nao ko
 
Upvote 0
cảm ơn bạn rất nhiều,đã tham gia vào đề tài này cùng mình,bay h minh up 1 file excel len,minh sieu tap duoc tren mang,nhưng ko hỉu cách viết code lắm,bạn có thể chỉ dùm mình được ko.


Sub sothtai()
Dim tht(100)
Dim cottht As Range
cotttht = ActiveSheet.Range([C2], [c2000])
Dim b As Integer, trung As Boolean, a As Integer
b = 0
For Each clls In cotttht
trung = True
For a = 0 To 100
If tht(a) = clls Then
trung = False
Exit For
End If
Next a
If trung = True Then
tht(b) = clls
b = b + 1
End If
Next clls
MsgBox b
End Sub

có mấy chỗ mình tô đậm,các bác nào có thể nói cho minh hiểu,cho do co y nghia the nao ko
Mình nói ý nghĩa đại khái như thế này:
For Each clls In cotttht
(Cho Clls duyệt qua các phần từ trong range("C2:C200")
Next clls
(Duyệt qua phần tử tiếp theo)
Góp ý với bạn:
1. Bạn phải dùng tiếng Việt có dấu, nếu không bài rất dễ bị xóa
2. Chủ đề về "Lập trình VBA trong xây dựng" nhưng bạn chưa đi vào vấn đề cụ thể nội dung trước, sau đó mới bàn về code
Thân
viehoai
 
Upvote 0
Cảm ơn bạn rất nhiều, mình sẽ cải thiện khuyết điểm, mà mình chưa hiểu bạn nói đi vào vấn đề cụ thể là sao,mình đang học ngành xây dựng, mới tập viết vba trong excel, hiện nay mình đang viết chuẩn bị viết rất nhiều file tính toán cho các cấu kiện trong nhà dân dụng,ví dụ....cột,dầm,sàn,móng... mình không biết đưa những thắc mắc của mình lên như thế nào nữa, vì mình mới tham gia diễn đàn, nếu bạn vui lòng, có thể chỉ giúp minh đưa bài và câu hỏi lên như thế nào cho tiện các bạn khác theo dõi,mình xin cảm ơn rất nhiều....
 
Upvote 0
Cảm ơn bạn rất nhiều, mình sẽ cải thiện khuyết điểm, mà mình chưa hiểu bạn nói đi vào vấn đề cụ thể là sao,mình đang học ngành xây dựng, mới tập viết vba trong excel, hiện nay mình đang viết chuẩn bị viết rất nhiều file tính toán cho các cấu kiện trong nhà dân dụng,ví dụ....cột,dầm,sàn,móng... mình không biết đưa những thắc mắc của mình lên như thế nào nữa, vì mình mới tham gia diễn đàn, nếu bạn vui lòng, có thể chỉ giúp minh đưa bài và câu hỏi lên như thế nào cho tiện các bạn khác theo dõi,mình xin cảm ơn rất nhiều....
Mình muốn nói rằng trước khi bàn đến code chúng ta cần bàn đến nội dung (ý tưởng) công việc chúng ta cần làm, sau đó chúng ta bàn đến thuật toán và sau đó viết thành code như thế nào. Bạn đưa ra đoạn code như trên không hiểu đoạn đó bạn cần làm cái gì (chỉ có bạn biết), hơn nữa với đoạn code trên mình "cảm giác" chưa thấy gì về xây dựng.
Người khác biết ý bạn muốn làm gì họ mới góp ý được code của bạn, đôi lúc họ đưa ra đoạn code khác tối ưu hơn thì sao.v.v..
Thân
viehoai
 
Upvote 0
thanks bạn nhiều,mình hiểu rồi...mình sẽ cố gắng....nice day
 
Upvote 0
thanks bạn nhiều,mình hiểu rồi...mình sẽ cố gắng....nice day
Mình có ý tưởng thế này:
Quảng lý hồ sơ hoàn thành (mới là ý tưởng). Mình chưa lo đến việc viết code bởi vì mình chưa đưa ra được cách làm như thế nào (cần có sự trợ giúp). Cụ thể:
1. Nội dung toàn bộ hồ sơ hoàn thành
2. Chỉ một file quản lý được nhiều công trình
Trong một công trình:
- Trình bày, cập nhật hồ sơ ra sao
- Tự động hóa trong in ấn, kiểm tra hồ sơ Văn bản hồ sơ nghiệm thu các loại
v.v
 
Upvote 0
Gửi riêng laiqui

Tôi viết riêng cho bạn với ý nghĩ bạn đang học ngành xây dựng và có hứng thu với VBA.

Nếu đúng vậy, bạn có rành về xử lý trên Excel không? Hãy xử lý tốt các bài toán tính toán thông thường (có thể của xây dựng) trên excel, sau đó hiểu biết về VBA thì mới hiệu quả.
 
Upvote 0
Đây là code cho hàm tính cột 1 phương

Option Explicit

Dim Rbc, Ebc
Dim Rsc, Es
Dim Lim_vungnen

Public Sub Beton_Steel(beton, thep, Kbt, Kthep) 'Unit Mpa
If beton = "B12.5" Then
Rbc = 7.5 * Kbt: Ebc = 21000
ElseIf beton = "B15" Then
Rbc = 8.5 * Kbt: Ebc = 23000
ElseIf beton = "B20" Then
Rbc = 11.5 * Kbt: Ebc = 27000
ElseIf beton = "B22.5" Then
Rbc = 13 * Kbt: Ebc = 29000
ElseIf beton = "B25" Then
Rbc = 14.5 * Kbt: Ebc = 30000
Else
Rbc = 17 * Kbt: Ebc = 32500
End If
If thep = "CII(AII)" Then
Rsc = 280 * Kthep: Es = 210000
Else
Rsc = 365 * Kthep: Es = 200000
End If
Lim_vungnen = (0.85 - 0.008 * Rbc) / (1 + Rsc / 400 * (1 - (0.85 - 0.008 * Rbc) / 1.1))
End Sub



' Kbd ke den lien ket hai dau Frame
' Kdh ke den tai trong dai han
' He so dieu kien lam viec Kbt, Kthep
' Kbt, Kthep he so dieu kien lam viec

Public Function COT(n, M, L, b, h, a, beton, thep, Kbd, Kdh, Kbt, Kthep)
Dim lo, nuy, S, ea, e1, eo, Teta, Ncr, e, X1, Za, MuyMin
Dim Fatt, Fa
Dim No, Efxilon, Phi1, Gama1, Ko, K1, K2, Anpha2, Gama2, K, A2, D2, Csi2, x ' Phuong Trinh bac 3
Dim tam1, tam2 ' use khi LT be va PT bac 3 khong giai duoc
' He don vi N, cm

'Kiem tra tiet dien la rectangle
If b * h = 0 Then
COT = "Tron" ' Tiet dien hinh tron chua tinh

Exit Function
End If


' Nhap mac be tong va thep
Call Beton_Steel(beton, thep, Kbt, Kthep)



lo = L * Kbd

Select Case lo / (0.288 * b)
Case Is >= 83
MuyMin = 0.25
Case Is > 35
MuyMin = 0.2
Case Is > 17
MuyMin = 0.1
Case Is <= 17
MuyMin = 0.05
End Select
Fatt = 2 * MuyMin * b * (h - a) / 100 ' unit cm2
Fa = Fatt

ea = WorksheetFunction.Max(L / 600, h / 30, 1)

e1 = M / n * 100

' If Lienket = "Sieu tinh" Then
eo = WorksheetFunction.Max(ea, e1)
'Else
' eo = ea + e1 ' He khop-khop
' End If



S = 0.1 + 0.11 / (0.1 + WorksheetFunction.Max(eo / h, 0.5 - 0.01 * lo / h - 0.01 * Rbc))


'-----------------------------------------------

' Tinh nuy
If lo / h <= 8 Then
nuy = 1
' Khoang cach tu luc doc N den trong tam Fa
e = nuy * eo + h / 2 - a
' So bo xac dinh chieu cao vung nen X1
X1 = n / (Rbc * b) * 10
' Cac truong hop co the xay ra cua chieu cao vung nen X1
Za = ((h - a) - a)

Select Case X1
Case Is > Lim_vungnen * (h - a) ' Lech tam be
' Giai phuong trinh bac 3 de xac dinh Csi2 (Trang 45 Nguyen Dinh Cong)

No = n * 10 / (Rbc * b * (h - a)) ' khong don vi. He so trung gian de giai phuong trinh

Efxilon = e / (h - a)
'Phi1 = 0.5 * (1 - Lim_vungnen)
Gama1 = Za / (h - a)

' Cac he so k cua phuong trinh bac 3 x3+K2*X2+K1*X+Ko=0
'Ko = 2 * No * (2 * Phi1 * Efxilon - Gama1 * Phi1 - Efxilon)

'K1 = 2 * (1 + Phi1 * Gama1 + No * Efxilon - 2 * Phi1)

'K2 = (-1) * (Lim_vungnen + 2)

' Giai phuong trinh theo Phu luc 5 Nguyen Dinh Cong
'Anpha2 = K1 - K2 * K2 / 3
'Gama2 = 2 * K2 * K2 * K2 / 27 + Ko - K2 * K1 / 3

'K = Gama2 * Gama2 + 4 * WorksheetFunction.Power(Anpha2 / 3, 3)
' Kiem soat gia tri K truoc khi dung ham Sqr
'If K > 0 Then

'A2 = WorksheetFunction.Power((Gama2 + Sqr(K)) / 2, 1 / 3)
'D2 = WorksheetFunction.Power((Gama2 - Sqr(K)) / 2, 1 / 3)
'Nghiem cua phuong trinh
'Csi2 = -(A2 + D2) - K2 / 3

' Dieu kien chan cua Csi2
'If Csi2 < Lim_vungnen Then Csi2 = Lim_vungnen
'If Csi2 > 1 Then Csi2 = 1
' Chieu cao vung nen tinh toan
' x = Csi2 * (h - a)
'Else ' Use formula 5-28 pape 145 of Pham Quang Minh
' Tinh gan dung theo trang 145 Pham Quang Minh
tam1 = ((1 - Lim_vungnen) * Gama1 * No + 2 * Lim_vungnen * (No * Efxilon - 0.48)) * (h - a)
tam2 = (1 - Lim_vungnen) * Gama1 + 2 * (No * Efxilon - 0.48)
x = tam1 / tam2
If x > h - a Then x = h - a
If x < Lim_vungnen * (h - a) Then x = Lim_vungnen * (h - a)
'End If
Fa = (n * 1000 * e - 100 * Rbc * b * x * (h - a - 0.5 * x)) / (100 * Rsc * (h - a - a))

Case Is >= 2 * a ' Lech tam lon
Fa = n * (e + 0.5 * X1 - (h - a)) / (Rsc * Za) * 10 ' Unit cm2
Case Is < 2 * a
Fa = n * (e - Za) / (Rsc * Za) * 10 'unit cm2
End Select
'--------------------------------------------------------------

'Loop do nuy khac 1
Else
Do
Fatt = 0.5 * (Fatt + Fa)
Ncr = 6.4 * Ebc / (lo * lo) * (S * b * h * h * h / 12 / Kdh _
+ Es / Ebc * 2 * Fatt * (0.5 * h - a) * (0.5 * h - a)) * 100 'Unit N; 100 he so chuyen doi don vi

' Test kha nang chiu luc cua column
If n * 1000 > Ncr Then ' Luc nen > kha nang cua cot
If Fatt > 3 * b * (h - a) / 100 Then ' Lon hon ham luong max
COT = "Redo"

Exit Function
Else
Fatt = Fatt + 0.1
Fa = Fa + 0.1
GoTo LastLine
End If
End If


nuy = 1 / (1 - n * 1000 / Ncr)
' Khoang cach tu luc doc N den trong tam Fa
e = nuy * eo + h / 2 - a
' So bo xac dinh chieu cao vung nen X1
X1 = n / (Rbc * b) * 10
' Cac truong hop co the xay ra cua chieu cao vung nen X1
Za = ((h - a) - a)

Select Case X1
Case Is > Lim_vungnen * (h - a) ' Lech tam be
'****************************************************
' Giai phuong trinh bac 3 de xac dinh Csi2 (Trang 45 Nguyen Dinh Cong)

No = n * 10 / (Rbc * b * (h - a)) ' khong don vi. He so trung gian de giai phuong trinh

Efxilon = e / (h - a)
'Phi1 = 0.5 * (1 - Lim_vungnen)
Gama1 = Za / (h - a)

' Cac he so k cua phuong trinh bac 3 x3+K2*X2+K1*X+Ko=0
'Ko = 2 * No * (2 * Phi1 * Efxilon - Gama1 * Phi1 - Efxilon)

'K1 = 2 * (1 + Phi1 * Gama1 + No * Efxilon - 2 * Phi1)

'K2 = (-1) * (Lim_vungnen + 2)

' Giai phuong trinh theo Phu luc 5 Nguyen Dinh Cong
'Anpha2 = K1 - K2 * K2 / 3
'Gama2 = 2 * K2 * K2 * K2 / 27 + Ko - K2 * K1 / 3

'K = Gama2 * Gama2 + 4 * WorksheetFunction.Power(Anpha2 / 3, 3)
' Kiem soat gia tri K truoc khi dung ham Sqr
'If K > 0 Then
' A2 = WorksheetFunction.Power((Gama2 + Sqr(K)) / 2, 1 / 3)
'D2 = WorksheetFunction.Power((Gama2 - Sqr(K)) / 2, 1 / 3)
'Nghiem cua phuong trinh
'Csi2 = -(A2 + D2) - K2 / 3

' Dieu kien chan cua Csi2
'If Csi2 < Lim_vungnen Then Csi2 = Lim_vungnen
' If Csi2 > 1 Then Csi2 = 1
' Chieu cao vung nen tinh toan
' x = Csi2 * (h - a)

'Else ' Use formula 5-28 pape 145 of Pham Quang Minh
'***************************************
' Tinh gan dung theo trang 145 Pham Quang Minh
tam1 = ((1 - Lim_vungnen) * Gama1 * No + 2 * Lim_vungnen * (No * Efxilon - 0.48)) * (h - a)
tam2 = (1 - Lim_vungnen) * Gama1 + 2 * (No * Efxilon - 0.48)
x = tam1 / tam2
If x > h - a Then x = h - a
If x < Lim_vungnen * (h - a) Then x = Lim_vungnen * (h - a)
'End If



Fa = (n * 1000 * e - 100 * Rbc * b * x * (h - a - 0.5 * x)) / (100 * Rsc * (h - a - a))

Case Is >= 2 * a ' Lech tam lon
Fa = n * (e + 0.5 * X1 - (h - a)) / (Rsc * Za) * 10 ' Unit cm2
Case Is < 2 * a
Fa = n * (e - Za) / (Rsc * Za) * 10 'unit cm2
End Select
'Kiem soat gia tri Fa truoc khi loop
' Khi Fa <0 thi loop khong co y nghia. Tuy nhien khi loop fa<0 thi ket qua Fa cuoi se <0
' nen khong anh huong toi ket qua cuoi cung ( Fa<0 thi chon muymin), nen khong sua code
LastLine:
Loop Until Abs(Fa - Fatt) < 0.01
End If
'-------------------------------------------------------
COT = Fa
End Function
Có gì thắc mắc thì liên lạc theo
SDT: 0914172224 Quang
 
Upvote 0
Public Sub Beton_Steel(beton, thep, Kbt, Kthep) 'Unit Mpa
If beton = "B12.5" Then
Rbc = 7.5 * Kbt: Ebc = 21000
ElseIf beton = "B15" Then
Rbc = 8.5 * Kbt: Ebc = 23000
ElseIf beton = "B20" Then
Rbc = 11.5 * Kbt: Ebc = 27000
ElseIf beton = "B22.5" Then
Rbc = 13 * Kbt: Ebc = 29000
ElseIf beton = "B25" Then
Rbc = 14.5 * Kbt: Ebc = 30000
Else
Rbc = 17 * Kbt: Ebc = 32500
End If
Có thể thay Câu lệnh IF ở trên thanh câu lệnh Select như sau

Select Case beton
Case "B12.5": Rbc = 7.5 * Kbt: Ebc = 21000
Case "B15": Rbc = 8.5 * Kbt: Ebc = 23000
Case "B20": Rbc = 11.5 * Kbt: Ebc = 27000
Case "B22.5": Rbc = 13 * Kbt: Ebc = 29000
Case "B25": Rbc = 14.5 * Kbt: Ebc = 30000
Case Else: Rbc = 17 * Kbt: Ebc = 32500
End Select

Nhưng đọc đoạn mã sau của bạn
Select Case lo / (0.288 * b)
Case Is >= 83
MuyMin = 0.25
Case Is > 35
MuyMin = 0.2
Case Is > 17
MuyMin = 0.1
Case Is <= 17
MuyMin = 0.05
End Select

tôi thấy hay vì hiểu thêm về câu lệnh Select. Cái "biến" Is (trong Is >=83 chẳng hạn), là lạ với tôi. Cảm ơn.
 
Lần chỉnh sửa cuối:
Upvote 0
Thêm 1 cách nữa cho vui cửa nhà!

To haonlh;311398

Có thể thay Câu lệnh IF hay câu lệnh Select bằng hàm SWITCH() như sau

PHP:
 Dim GPE As Double
 GPE= lo / (0.288 * b)
 MuyMin = SWITCH(GPE>=83, 0.25, GPE> 35, 0.2, GPE > 17,  0.1, GPE <= 17, 0.05)

(/ới 1 số người, thì cách này dễ nhồm hơn, nhỉ?!
 
Upvote 0
cam ơn bạn...mình bít thêm được nhiều thứ
 
Upvote 0
cảm ơn bạn rất nhiều,đã tham gia vào đề tài này cùng mình,bay h minh up 1 file excel len,minh sieu tap duoc tren mang,nhưng ko hỉu cách viết code lắm,bạn có thể chỉ dùm mình được ko.


Sub sothtai()
Dim tht(100)
Dim cottht As Range
cotttht = ActiveSheet.Range([C2], [c2000])
Dim b As Integer, trung As Boolean, a As Integer
b = 0
For Each clls In cotttht
trung = True
For a = 0 To 100
If tht(a) = clls Then
trung = False
Exit For
End If
Next a
If trung = True Then
tht(b) = clls
b = b + 1
End If
Next clls
MsgBox b
End Sub

có mấy chỗ mình tô đậm,các bác nào có thể nói cho minh hiểu,cho do co y nghia the nao ko
đó là vong lập thôi bạn ơi
 
Upvote 0

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

Back
Top Bottom