Ứng dụng EXCEL để lọc điểm trên bản vẽ Cad (7 người xem)

Liên hệ QC

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

sanhdieu0911

Thành viên mới
Tham gia
14/12/10
Bài viết
45
Được thích
10
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ả...)
 

File đính kèm

Lần chỉnh sửa cuối:
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...
 
Bài toán này cũng rất khó. Có bác nào giúp với. E làm địa hình nhiều lúc điều kiện cũng như sanhdieu0911 nói.
 
Bài toán này cũng rất khó. Có bác nào giúp với. E làm địa hình nhiều lúc điều kiện cũng như sanhdieu0911 nói.

Bạn xem file kèm chưa,
bạn ấy không đưa tí dữ liệu nào thì ai làm được

TUY vậy, bài này có thể làm luôn thẳng trên CAD với ngôn ngữ Lisp, hay VBA chẳng hạn thì tốt hơn
 
Lần chỉnh sửa cuối:
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)
 
Mình đã sửa lại file rar và thêm file ví dụ rồi... các bạn xem giúp mình nhé.
 
Mình đã sửa lại file rar và thêm file ví dụ rồi... các bạn xem giúp mình nhé.

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

Với dữ liệu cụ thể và cách định vị cụ thể thì bạn sửa chỗ đỏ đỏ ở 3 dòng đẩu - tôi đặt một chỗ cho bạn dễ sửa. startCell là cell mà bạn sẽ "dán" kết quả. Bạn kiểm tra xem có lỗi không. Chú ý là tôi viết code với cách hiểu vấn đề như đã nói ở trên.
 
Cám ơn các bạn, mình đã thử và thấy hiện tại rất tốt...
Mình đang tiếp tục thử với nhiều số liệu khác nhau nữa....
Cám ơn bạn siwtom nhiều nhé!
 
Hik...không biết mình làm sai ở đâu không mà không thể chạy ra kết quả mong muốn...
Các bạn xem giúp mình với nhé...
 

File đính kèm

Lần chỉnh sửa cuối:
Hik...không biết mình làm sai ở đâu không mà không thể chạy ra kết quả mong muốn...
Các bạn xem giúp mình với nhé...

tại sao bạn không thử chạy sub (marcro nhỉ)
Alt+F8 và run DoSomeThing

là có kết quả, tôi thấy kết quả đúng đó???

Tôi nghĩ bạn không có số liệu thực tế ah, vài số liệu lặp đi lặp lại và nhập đại 1, 2, 3, ...vv
 
Hik...không biết mình làm sai ở đâu không mà không thể chạy ra kết quả mong muốn...
Các bạn xem giúp mình với nhé...

Nếu bạn nói chỉ nói: "không thể chạy ra kết quả mong muốn" thì bạn đã không giúp được gì cho người giúp bạn.

Nếu bạn 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", nếu thế thì bạn sẽ giúp người khác định hướng được sự kiểm tra.

Kết quả mong muốn là phải thế nào?

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!

Sai sót hay không là ở chỗ:

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)

vài lời thẳng thắn thế, để bạn khắc phục
 
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é.
 

File đính kèm

Code chạy bao giờ cũng ra kết quả (???). Vậy nếu bạn nói: "không thể chạy ra kết quả mong muốn" thì chỉ có thể là bạn nhìn kết quả trả về và bạn không thấy đúng ... với những gì mong đợi. Nói cách khác bạn phải biết "kết quả mong muốn" nó là thế nào. Vì nếu không biết "kết quả mong muốn" nó thế nào thì làm sao bạn biết kết quả mà code trả về là đúng hay sai?

Ý tôi là bạn nên nói rõ "kết quả mong muốn" nó là thế nào.

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ử.

Có nghĩa là bạn có chút dữ liệu và bạn đã kiểm tra kỹ là kết quả mà code trả về là đúng với sự mong đợi?
Nếu thế thì ta kết thúc ở đây.
 
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!
 
Nhờ các bạn giúp đỡ với!

Để phù hợp hơn với điều kiện công việc nên mình đã thay đổi công thức tính S và code bạn đã viết trong file word và ô so sánh là B2:
http://www.mediafire.com/download/sosjd0v6rq99brq/Giup Do.rar
http://www.mediafire.com/download/sosjd0v6rq99brq/Giup+Do.rar
( Mình không bít cách viết lên trên này công thức... Các bạn thông cảm nhé)
Các bạn giúp mình sửa đoạn code nhé!
cám ơn các bạn rất nhiều!
 

File đính kèm

Để phù hợp hơn với điều kiện công việc nên mình đã thay đổi công thức tính S và code bạn đã viết trong file word và ô so sánh là B2:
http://www.mediafire.com/download/sosjd0v6rq99brq/Giup Do.rar
http://www.mediafire.com/download/sosjd0v6rq99brq/Giup+Do.rar
( Mình không bít cách viết lên trên này công thức... Các bạn thông cảm nhé)
Các bạn giúp mình sửa đoạn code nhé!
cám ơn các bạn rất nhiều!

Bạn không nên gửi tin nhắn.
Và khi nói với người không quen biết thì không nên dùng "tớ".
-----------
Bạn ạ, nếu bạn cần giúp thì cũng nên giải thích kỹ một chút. Bạn nghĩ là bạn cứ tung tập tin lên không một lời diễn giải rồi người ta sẽ nghiên cứu, đoán ý, rồi làm hộ bạn?
Dữ liệu của bạn có 5 cột với tiêu đề là: STT, x, y, H, code. Tôi hiểu x, y chẳng qua là tọa độ trong mặt phẳng Oxy của điểm tương ứng với mỗi dòng.

Trong "phần 1" tôi hiểu là trong mỗi "chu kỳ thao tác" sẽ phải:
1. Cho dòng 1 của "Bảng thao tác" (ở lúc "chào buổi sáng" là cả vùng dữ liệu) vào "Bảng thao tác" mới để dùng trong "chu kỳ thao tác" tiếp theo.
2. Duyệt từ dòng 2 tới cuối của bảng thao tác. Với mỗi dòng ta tính cự li giữa điểm hiện hành có tọa độ (xh, yh) và điểm (x1, y1), với (x1, y1) là tọa độ của điểm ứng với dòng 1.

Vì thế mới có

Mã:
S2= Căn bậc 2(( a 2 - a 1 )^2 + (b 2 - b 1 )^2)
S3= Căn bậc 2(( a 3 - a 1 )^2 + (b 3 - b 1 )^2)
S4= Căn bậc 2(( a 4 - a 1 )^2 + (b 4 - b 1 )^2)
...

với a là x, b là y

Bây giờ bạn muốn có

Mã:
S2= Căn bậc 2(( a 2 - a 1 )^2 + (b 2 - b 1 )^2 + (C 2 - C1)^2)
S3= Căn bậc 2(( a 3 - a 1 )^2 + (b 3 - b 1 )^2 + (C 3 - C1)^2)
S4= Căn bậc 2(( a 4 - a 1 )^2 + (b 4 - b 1 )^2 + (C 4 - C1)^2)
...

vậy tôi hiểu c là z.

Tức bây giờ ta tính cự li giữa 2 điểm trong không gian Oxyz.

Thế z, tức c, nó nằm ở cột nào vậy bạn? Nếu bạn muốn lấy các giá trị của cột có tiêu đề là H làm z thì bạn cũng phải nói một câu. Bạn muốn người khác đoán mò?

Muốn được giúp thì hãy làm cho người khác hiểu mình.
 
Web KT

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

Back
Top Bottom