Hiện tại, khi ta chuyển các bản vẽ từ tỷ lệ thấp (1/100, 1/200, 1/500) lên bản vẽ có tỷ lệ ( 1/1000, 1/2000, 1/5000 ..v..v..) thì các điểm trên bản vẽ rất dày...
Để đảm bảo các quy phạm khi chuyển bản vẽ, mình định dùng bảng excel để làm... nhưng mình chỉ tính được cách làm thui... chứ còn làm thế nào thì mình chịu rùi...
Nay mình nhờ các bạn giúp A E kỹ thuật nhé...
File word sẽ có các công thức và hướng làm...
file excle sẽ là dạng bản kết quả hay số liệu vào...( Số liệu vào luôn lớn hơn bảng kết quả VD: đưa 20 nghìn số liệu vào thì kết quả tuỳ vào loại bản vẽ sẽ cho số lượng kết quả...)
Thấy tiêu đề hấp dẫn nhưng chưa tải tài liệu về, mới đọc qua, tôi thấy không đơn giản, bạn xem qua cách đếm block của clip này, xin chia sẻ, ứng dụng cho nghành kỹ thuật rất hữu ích
[video=youtube;TdldSvuif0A]http://www.youtube.com/watch?v=TdldSvuif0A[/video]
Clip bạn đưa lên chỉ dạy cách tạo danh sách Block thui...
Bài trên của mình sẽ giả quyết được vấn đề mà dân kỹ thuật hiện tại vẫn đang làm bằng tay một cách thủ công và thường là không đúng theo quy phạm...
mình nghĩ là Excel có thể giải quyết được... nhưng tiếc là kiến thức của mình về Ẽxcel còn kém quá, việc lọc và lặp kết hợp thì mình không biết nên muốn đưa lên nhờ mọi người cùng giúp...
Trong bảng tính Excel mình đã đưa bảng nhập số liệu ( Số liêu nhập ),kết quả xuất ra ( Kết quả) và số e là số so sánh mà...
cái này mình không đưa số cụ thể mà chỉ đưa công thức toán và hướng làm thôi... vì mỗi lần sẽ có những số liệu khác nhau mà..., stt thì có thể vào khoảng 1000 số nhưng cũng có thể lên đến 20.000 số nữa... tùy thuộc bản đồ mình thành lập mà.
Trong bảng tính Excel mình đã đưa bảng nhập số liệu ( Số liêu nhập ),kết quả xuất ra ( Kết quả) và số e là số so sánh mà...
cái này mình không đưa số cụ thể mà chỉ đưa công thức toán và hướng làm thôi... vì mỗi lần sẽ có những số liệu khác nhau mà..., stt thì có thể vào khoảng 1000 số nhưng cũng có thể lên đến 20.000 số nữa... tùy thuộc bản đồ mình thành lập mà.
Thì tức là bạn làm hướng dẫn đúng không, không phải là hỏi?
Vì NẾU muốn người khác giúp thì bạn nên phải có số liệu giả định (có thể cả kết quả kỳ vọng) để người giúp có thể test kiểm tra kết quả ..vv (không phải ai cũng dư thơi gian để làm giúp bạn , hơn nữa có làm thì chắc gì theo đúng các trường hợp mong muốn)
Nếu tôi hiểu được bạn viết gì thì như sau:
1. Ta xét bảng mà ta gọi là Bảng tính toán
2. Ở thời điểm ban đầu thì Bảng tính toán là toàn vùng dữ liệu, tức như trong vd. thì đó là vùng $A$13:$E$32
3. Ta cho dòng đầu của Bảng tính toán vào Bảng kết quả.
4. Ta xét S cho các dòng từ 2 cho tới dòng cuối của Bảng tính toán. Nếu S >= e thì dòng hiện hành sẽ được thêm vào Bảng tính toán "mới" dùng cho vòng "đấu" tiếp theo
5. Nếu sau bước 4 Bảng tính toán "mới" có dữ liệu, tức có số dòng > 0 (do trong bước 4 có dòng nào đó không bị xóa) thì lặp lại bước 3 và 4 với Bảng tính toán "mới". Cứ như thế cho tới khi không có Bảng tính toán "mới" do ở bước 4 tất cả các dòng trong Bảng tính toán đều bị loại.
Nếu thế thì ...
Mã:
Sub DoSomething()
Dim Arr, tmp, index, result, count As Long, k As Long, e As Double, r As Long, c As Long, s As Double, startCell As Range
Arr = Range("[B][COLOR=#ff0000]$A$13:$E$32[/COLOR][/B]").Value
e = [[B][COLOR=#ff0000]B1[/COLOR][/B]]
Set startCell = Range("[B][COLOR=#ff0000]G13[/COLOR][/B]")
ReDim index(1 To 1)
ReDim result(1 To UBound(Arr, 2), 1 To 1)
k = 0
Do
k = k + 1
ReDim Preserve result(1 To UBound(Arr, 2), 1 To k)
For r = 1 To UBound(Arr, 2)
result(r, k) = Arr(1, r)
Next r
count = 0
For r = 2 To UBound(Arr)
s = Sqr((Arr(1, 2) - Arr(r, 2)) ^ 2 + (Arr(1, 3) - Arr(r, 3)) ^ 2)
If s >= e Then
count = count + 1
ReDim Preserve index(1 To count)
index(count) = r
End If
Next r
If count > 0 Then
ReDim tmp(1 To count, 1 To UBound(Arr, 2))
For r = 1 To count
For c = 1 To UBound(Arr, 2)
tmp(r, c) = Arr(index(r), c)
Next c
Next r
Arr = tmp
End If
Loop Until count = 0
ReDim Arr(1 To k, 1 To UBound(result))
For r = 1 To k
For c = 1 To UBound(Arr, 2)
Arr(r, c) = result(c, r)
Next c
Next r
startCell.Resize(k, UBound(Arr, 2)).Value = Arr
End Sub
Tôi nhìn qua, vì không có kiên nhẫn xem hết, thì thực ra bảng dữ liệu của bạn chỉ có 3 điểm phân biệt. Tức nếu xét 3 điểm A(1;3), B(2;5), C(4;7) thì Bảng tính toán chỉ gồm 3 điểm A, B, C lần lượt từ đầu là: A, B, C, A, B, C, ... Nếu dữ liệu ở dòng 48, tức dòng 60 của bảng tính, là
Mã:
48 4 7 c48 d48
thay cho hiện thời là
Mã:
48 1 3 c48 d48
và sau đó không sai nữa (do tôi không dò tiếp) thì bạn sẽ có các dòng liên tiếp hoàn hảo vì lặp lại với chu kỳ (A, B, C): A, B, C, A, B, C, ..., A, B, C
Ta xét chi tiết các tính toán:
Bước 1. Ta có "bảng tính toán1" ở thời điểm "chào buổi sáng" là: A, B, C, A, B, C, ...
1. Ta lấy
Mã:
1 1 3 c1 d1
vào bảng kết quả
2. Ta xét các S => tất cả các dòng ứng với điểm A sẽ bị loại do S = 0. Tất cả các dòng ứng với điểm B và C sẽ được thêm vào "bảng tính toán2". Vì sao?
- Với các điểm B ta có cự li giữa A và B: S = √[(2 - 1)² + (5 - 3)²] = √5 > 2 = e
- Với các điểm C ta có cự li giữa A và C: S = √[(4 - 1)² + (7 - 3)²] = 5 > 2 = e
Bước 2. Ta có "bảng tính toán2" chỉ gồm các dữ liệu ứng với điểm B và C mà dòng đầu là dòng ứng với điểm B.
Mã:
2 2 5 c2 d2
1. Ta lấy dòng trên vào bảng kết quả.
2. Ta xét các S => tất cả các dòng ứng với điểm B sẽ bị loại do S = 0. Tất cả các dòng ứng với điểm C sẽ được thêm vào "bảng tính toán3". Vì sao?
- Với các điểm C ta có cự li giữa B và C: S = √[(4 - 2)² + (7 - 5)²] = √8 > 2 = e
Bước 3. Ta có "bảng tính toán3" với các dữ liệu ứng với toàn điểm C
1. Ta cho dòng
Mã:
3 4 7 c3 d3
vào bảng kết quả.
2. Ta xét các S => tất cả các dòng ứng với điểm C sẽ bị loại do S = 0. Mà "bảng tính toán3" chỉ gồm toàm điểm C nên tất cả các dòng sẽ bị loại.
Cuối cùng ta có bảng kết quả gồm 3 dòng:
Mã:
1 1 3 c1 d1
2 2 5 c2 d2
3 4 7 c3 d3
Bạn chạy code cũng ra kết quả trên.
Vậy "không thể chạy ra kết quả mong muốn" có diện mạo thế nào?
Bạn nên rút kinh nghiệm. Không bao giờ nói: "không thể chạy ra kết quả mong muốn", vì chữ nhiều nhưng thông tin hữu ích = 0. Phải nói: "kết quả nhận được là thế này này nhưng kết quả mong muốn là phải thế này này"
Cám ơn các bạn đã góp ý...
Thực ra mình không biết làm sao để ra kết quả mong muốn chứ không phải mình bảo cách sai đâu...
Mình có nói rõ là mình không biết đã làm sai ở đâu mà...
Dù sao cũng cám ơn sự góp ý của các bạn, và mình sẽ cố gắng không mắc những sai sót đó nữa... Thank!
Cám ơn các bạn đã góp ý...
Thực ra mình không biết làm sao để ra kết quả mong muốn chứ không phải mình bảo cách sai đâu...
Mình có nói rõ là mình không biết đã làm sai ở đâu mà...
Dù sao cũng cám ơn sự góp ý của các bạn, và mình sẽ cố gắng không mắc những sai sót đó nữa... Thank!
Muốn kiểm định 1 chương trình (code) thì bạn phải nghiêm túc trong chuyện chuẩn bị dữ liệu để test để kiểm tra (số liệu gần thực tế một chút, và quét hết các trường hợp có khả năng xảy ra) - việc test các phần mềm chuyên nghiệp người ta phải dành đến 40% tổng quỹ thời gian sx phần mềm mà)
Nói cách khác - bạn chưa thực sự test code đó, số liệu thì vớ vẩn: 1, 2,3 ... lặp đi lặp lại (chính bạn còn không kiểm soát được tính đúng đắn, kq đúng thì sao test được code)
Túm lại, chắc bạn giúp người khác, hoặc đang là SV, hoặc không hiểu vấn đề (như kiểu bịa ra bài toán) - nên không có số liệu thực tế chăng (???) - Nếu đúng thế thì thực sự 1 là phí công người giúp, 2 phí công sự tận tình của người giúp, 3 đã làm người giúp bạn thấy không được tôn trọng công sức họ bỏ ra (cụ thể người giúp ở đây là siwtom)
Chân thành cám ơn bạn siwtom cùng toàn thể các bạn đã ủng hộ mình, giúp đỡ mình giải bài trên...
Nay nhờ các bạn, mình đã giải quyết xong vấn đề trên.
Dưới đây là file đính kèm mà mình đã làm thử.
Mình cũng cám ơn các bạn đã kịp thời nhắc nhở để mình có thể nhanh chóng sửa chữa những sai sót vừa qua...
Một lần nữa xin chân thành cám ơn bạn siwtom cùng toàn thể các bạn trong diễn đàn nhé.
Chân thành cám ơn bạn siwtom cùng toàn thể các bạn đã ủng hộ mình, giúp đỡ mình giải bài trên...
Nay nhờ các bạn, mình đã giải quyết xong vấn đề trên.
Dưới đây là file đính kèm mà mình đã làm thử.
Mình xin lỗi siwtom và cũng chân thành cám ơn các bạn đã có những góp ý chân thành và hữu ích cho mình..
Thực sự mình không hiểu nhiều về ẼXCEL nên mình có những yếu kém khi thử nghiệm...
Nói chung, thời gian mình tham gia diễn đàn khá lâu, nhưng mình không hiểu nhiều nên chỉ dám nghe và mày mò thui...
Có gì mong bạn siwtom cùng các bạn góp ý chân thành, giúp mình nâng cao được kiến thức hơn nhé...
Một lần nữa, chân thành cảm ơn bạn siwtom cùng toàn thể các bạn trong diễn đàn đã ủng hộ mình, góp ý chân thành cho mình ngày càng tiến bộ hơn... Chân thành cảm ơn!