Phần mềm ôn thi sát hạch chứng chỉ hành nghề xây dựng

Tiêu đề: [Nhờ] mọi người gỡ rối hộ đoạn mã VBA [In trang]

Tác giả: 506509    Thời gian: 21/10/2016 09:53
Tiêu đề: [Nhờ] mọi người gỡ rối hộ đoạn mã VBA
Đây là tôi viết đoạn mã để ngắt khi hàng rào và cột giao nhau. Nhưng nó lắm khi chỉ chạy được 1 vài cột còn lại thì ngắt sai lung tung phèng cả lên. Ai biết chỉ dùm tôi với. Tôi đã chia sẻ nó ở bên kết cấu nhưng vẫn khó quá:

[url=http://www.ketcau.com/forum/showthread.php?p=412154][/url]


Tác giả: 506509    Thời gian: 21/10/2016 11:52
Đây là Code VBA
[Visual Basic] 纯文本查看 复制代码
Sub A_TrimTuongCot()
On Error Resume Next
Dim ExcelApp As Object
Set ExcelApp = GetObject(, "Excel.Application")
If Err <> 0 Then
Err.Clear
Set ExcelApp = CreateObject("Excel.Application")
End If
ExcelApp.Visible = False
AppActivate ExcelApp.Caption
'ExcelApp.Workbooks.Add ' MO FILE TRANG"
ExcelApp.Workbooks.Add.SaveAs "e:\THO1.XLS"
'ExcelApp.Workbooks.Open "e:\THO.XLSX"
ExcelApp.worksheets("sheet1").Activate
'ExcelApp.range("a2").Value = "aaa"
'ExcelApp.cells(1, k).Value = "aaa"
ExcelApp.Visible = True
Dim MangTuong(0 To 100000) As Variant
Dim MangCot(0 To 100000) As Variant
Dim TapGiao As Variant
Dim MangGiao(0 To 10000000) As Variant
Set objmien = ThisDrawing.SelectionSets.Add("TenMien")
i = -1
j = -1
objmien.SelectOnScreen
' Lay Mang tuong
For Each tt In objmien
If tt.ObjectName = "AcDbLine" Then
i = i + 1
Set MangTuong(i) = tt
End If
Next tt
n = i
'Lay Mang cot
For Each tt In objmien
If tt.ObjectName <> "AcDbLine" Then
j = j + 1
Set MangCot(j) = tt
End If
Next tt
m = j
ThisDrawing.SelectionSets.Item("TenMien").Delete
'============================= TIM TOA DO GIAO DIEM==================================
Dim pa(0 To 2) As Double
Dim TapGiaotb(0 To 2) As Double
Dim diem1(1000000) As String
Dim diem2(1000000) As String
Dim diemtb(1000000) As String
Dim cmd(1000000) As String
nn = 0
sogiao = 0
For ii = 0 To n
stp = MangTuong(ii).StartPoint
EnP = MangTuong(ii).EndPoint
startp1 = stp(0) & "," & stp(1) & "," & stp(2)
For jj = 0 To m
TapGiao = MangTuong(ii).IntersectWith(MangCot(jj), acExtendNone)
Dim iii As Integer, kkk As Integer
iii = 0
'MsgBox nn
If VarType(TapGiao) <> vbEmpty Then
For iii = LBound(TapGiao) To UBound(TapGiao)
'MsgBox sogiao
MangGiao(nn) = Round(TapGiao(iii), 8)
MangGiao(nn + 1) = Round(TapGiao(iii + 1), 8)
MangGiao(nn + 2) = Round(TapGiao(iii + 2), 8)
ExcelApp.cells(sogiao + 1, 1).Value = MangGiao(nn)
ExcelApp.cells(sogiao + 1, 2).Value = MangGiao(nn + 1)
ExcelApp.cells(sogiao + 1, 3).Value = MangGiao(nn + 2)
ExcelApp.cells(sogiao + 1, 4).Value = sogiao
pa(0) = TapGiao(iii)
pa(1) = TapGiao(iii + 1)
pa(2) = TapGiao(iii + 2)
Set gg = ThisDrawing.ModelSpace.AddMText(pa, 500, sogiao)
gg.Height = 50
sogiao = sogiao + 1
iii = iii + 2
nn = nn + 3
Next iii
End If
TapGiaotb(0) = Round((MangGiao(nn - 6) + MangGiao(nn - 3)) / 2, 8)
TapGiaotb(1) = Round((MangGiao(nn - 5) + MangGiao(nn - 2)) / 2, 8)
TapGiaotb(2) = Round((MangGiao(nn - 4) + MangGiao(nn - 1)) / 2, 8)
diem1(sogiao) = MangGiao(nn - 6) & "," & MangGiao(nn - 5) & "," & MangGiao(nn - 4)
diemtb(sogiao) = TapGiaotb(0) & "," & TapGiaotb(1) & "," & TapGiaotb(2)
diem2(sogiao) = MangGiao(nn - 3) & "," & MangGiao(nn - 2) & "," & MangGiao(nn - 1)
ExcelApp.cells(sogiao, 5).Value = TapGiaotb(0)
ExcelApp.cells(sogiao, 6).Value = diemtb(sogiao)
'MsgBox DIEM1
'MsgBox DIEM2
'MsgBox diemtb
cmd(nn / 2) = ".break" & Chr(10) & diemtb(sogiao) & vbCr & "f" & vbCr & diem1(sogiao) & vbCr & diem2(sogiao) & vbCr
'MsgBox cmd
'ThisDrawing.SendCommand cmd
Next jj
'===================BREAK DOI TUONG========================================
Next ii
' =============== HET LAY TOA DO GIAO=============================
ExcelApp.cells(1, 50).Value = sogiao
For y = 1 To nn / 2
If cmd(y) <> "" Then
ThisDrawing.SendCommand cmd(y)
End If
Next y
Set ExcelApp = Nothing
End Sub


Tác giả: tranhoe    Thời gian: 21/10/2016 18:35
Code có tác dụng gì?. Đâu phải ai cũng như Bạn; người giỏi lập trình thì chưa chắc biết xây dựng, người biết xây dựng thì chưa chắc biết lập trình.
Một câu hỏi không có tính chuyên nghiệp - Là điều mà XD360 ghét nhất!
Hỏi thế này thì chuyên gia Lập trình hoặc chuyên gia Xây dựng cũng bó tay.

Tôi đưa vào Xóa tạm!
PS: Bạn copy bài này đưa qua GPE thử rồi biết: Bài sẽ bị đưa vào Hậu viên (tương tự Thùng rác Tạm của XD360)

Tác giả: 506509    Thời gian: 21/10/2016 21:59
Nhờ mọi người gỡ rùm cái.
Tác giả: M@trixs    Thời gian: 23/10/2016 12:07
506509 gửi lúc 21/10/2016 21:59
Anh xóa luôn đi cũng được chả cần gì phải tạm cả. Bây giờ là thế kỷ thứ bao nhiê ...

Hết sức bình tĩnh, đừng manh động, ngồi xuống ta nói chuyện tí.

Thứ 1: Anh TranHoe chắc là lớn tuổi hơn bạn nhiều => Tôn trọng trong giao tiếp là điều cơ bản.

Thứ 2: Bạn viết bài hỏi không rõ ràng thì sao trách người khác được :"Đây là tôi viết đoạn mã để ngắt khi hàng rào và cột giao nhau. Nhưng nó lắm khi chỉ chạy được 1 vài cột còn lại thì ngắt sai lung tung phèng cả lên". Giao nhau để làm gì ? Trước đó thì có gì xảy ra ? Bạn đang làm tren Excel hay trên CAD (Cái này tôi đoán thế thôi chứ tôi cũng chẳng biết bạn làm trên gì, có khi trên Word cũng nên - Đừng nói Word nó không có VBA nha). Nên nghiêm túc đặt mình vào vị trí người đọc để có cái nhìn tổng quát hơn....

Thứ 3: Khi chúng ta làm việc lớn chỉ sợ không có người chê hay góp ý thôi. Có một vĩ nhân đã từng nói:"Thằng nào chê bai tao thì thằng đó mới là bạn thân của tao, còn kẻ thù của tao chúng chỉ chuyên đi khen tao thôi, tao khinh"...

Đôi lời gởi đến bạn....
Tác giả: 506509    Thời gian: 23/10/2016 16:48
Công nhận tôi cũng hơi bị kích động thật. Thành thật mà nói nì cũng xin lỗi ANh Hòe. Nhưng mà 1 đoạn mã mất bao nhiêu tâm huyết viết lên lại bị chê là không có tính chuyên nghiệp thì ức không chịu nổi. Nói đơn giản thì đay là đoạn mã mà ngắt ra đoạn tường giao với cột. với đoạn mã này hoàn thành thì tôi có thể tính luôn được tổng chiều dài các đoạnt tường bằng 1 chương trình VBA hoặc lisp đơn giản. mà dễ dàng tính khối lượng của nó trên mặt bằng nếu biết được chiều cao và chiều rộng. SOng hành với nó là tính thêm được cả sơn, trát, bả cho đoạn tường này. hoặc tính mở rộng thêm cho các đoạn giằng giao cột hay dầm giao cột, hoặc dầm và đài. Nếu 1 người lập trình thì chỉ cần nhìn đoạn mã là họ biết ngay trương trình sai ở đâu thậm chí không cần Debug. Còn tôi đã viết ở trên rõ là ngắt hàng rào với cột giao nhau thì cai cũng biết là trên Cad rồi, ngay cả là người không biết VBA. Còn với 1 người biết VBA thì nhìn qua đoạn mã cũng phân biệt ngay được là chạy trên chương trình Cad hay ofifce rồi, còn những người không biết thì mình cũng không cần hỏi vì đơn giản là họ không đủ trình độ để trả lời rồi. Dân trong nghề nhìn là biết không khó như bạn nghĩ đâu, chỉ có dân ABC mới mất time lâu thôi
Tác giả: fubi    Thời gian: 25/10/2016 10:10
506509 gửi lúc 23/10/2016 16:48
Công nhận tôi cũng hơi bị kích động thật. Thành thật mà nói nì cũng xin lỗi ANh Hò ...

1. Diễn đàn xd360 đang hướng đến và xây dựng 1 cộng đồng xây dựng VN chuyên nghiệp ngay từ việc đặt vấn đề.
Cách bạn đặt vấn đề trợ giúp ngay từ ban đầu mình thấy thiếu tính chuyên nghiệp ở chỗ: bạn nêu vấn đề chung chung, tưởng rằng người không biets gì thì bạn chẳng cần, còn người biết rành sẽ tự khắc hiểu điều bạn nói. Như vậy là chưa ổn. Bởi qua 1 chủ đề bất kỳ, XD360 hướng đến là sẽ có lợi ích (ít nhất là định hình được kiến thức cần giải quyết) cho cả người chưa biết lẫn người đã biết.

2. Với cá nhân mình với sự hiểu biết còn "ABC" về lập trình mình chưa đồng tình với bạn khi cho rằng: "Nếu 1 người lập trình thì chỉ cần nhìn đoạn mã là họ biết ngay trương trình sai ở đâu thậm chí không cần Debug".

Đúng như Anh TranHoe nói: với người lập trình giỏi nhưng họ không có chuyên môn XD thì họ đọc code họ cũng chẳng thể nào hiểu bạn đang giải quyết cho việc gì kể cả code đó được viết rất chuẩn mực. Trong khi đó, code bạn viết chắc gì đã chuẩn mực nên khó mà hiểu được bạn đang viết để giải quyết cái gì. Điều này ví như: bạn đọc bài văn mô tả con cò của 1 người A, nhưng khi bạn đọc bạn lại hiểu rằng người A đang tả con gà chứ k phải con cò (trong khi người A nghĩ chắc chắn rằng họ đang tả con cò chứ không phải con gà).

Vậy nên, để giải quyết vấn đề của bạn bằng lập trình, bạn cần nêu ra đề bài, thuật toán bạn đang giải quyết. Từ đó mới giúp bạn được.
Ví dụ:
- Đề bài: muốn lập trình VBA trong autocad để tính được chiều dài của phần xây tường rào có trụ.
- THuật toán:
+ xác định nét vẽ nét đôi (là nét vẽ tường rào trong cad - Nếu vẽ nét khác thì chịu), bắt điểm đầu điểm cuối của từng đoạn rào, tính ra chiều dài mỗi đoạn.
+ Kết xuất số liệu qua excel để tính tổng hợp KL.

3. Không biết có đúng ý bạn chưa?


Tác giả: 506509    Thời gian: 26/10/2016 14:34
fubi gửi lúc 25/10/2016 10:10
1. Diễn đàn xd360 đang hướng đến và xây dựng 1 cộng đồng xây dựng VN chuyên nghiệ ...

CHỈ CẦN VẼ 1 ĐƯỜNG LINE DUY NHẤT THÔI BẠN Ạ. NGUYÊN TẮC LÀ CỨ GẶP CỘT LÀ BREAK HOẶC TRIM. TA CÓ THỂ KHAI BÁO ĐƯỜNG LINE NÀY LÀ TIM HAY MÉP TƯỜNG TÙY Ý. CÁI KHÓ LÀ VIỆC DÙNG LỆNH TRIM HOẶC BREAK ĐỀU BỊ LỖI KHI NÓ BREAK ĐƯỢC VÀI CÁI CỘT. CÒN VỆC XUẤT RA EXCEL THÌ KHÔNG KHÓ LẮM. CÁI NÀY NẾU VẼ TAY TỪNG ĐƯỜNG 1 LINE THÌ TÔI ĐÃ VIẾT XONG RỒI.




Chào mừng ghé thăm Phần mềm ôn thi sát hạch chứng chỉ hành nghề xây dựng (https://xaydung360.vn/diendan/) Powered by Discuz! X3.2