Chương trình chọn thép theo diện tích.

Liên hệ QC
Chính xác là vậy! Như bài này em đã nói:

Hỏng chính xác chút nào.

File bài 6 để nguyên câu lệnh For Each Rng In Selection

Chỉ sửa như chỗ màu đỏ, vẫn dùng nút lệnh.

Nói thêm:

1. Để nguyên code như cũ, thì bị lỗi. Nhưng khi debug, thấy các dòng lệnh phía trên dòng lệnh add vẫn chạy bình thường: Arr đã có 1 giá trị chuỗi nào đó sau vòng lặp For Each Rng in Selection. Rà chuột vào biến Arr sẽ thấy giá trị này.
Nếu lỗi do seletion bị lầm tưởng là commmandbutton, thì sẽ lỗi Type Miss Match ngay câu lệnh For Each Rng in Selection.

2. Record 1 macro gán validation, sau đó thay selection.validation bằng Cells(1, 1).Validation rồi chạy không dùng nút lệnh, vẫn lỗi.
 
Lần chỉnh sửa cuối:
Hỏng chính xác chút nào.

File bài 6 để nguyên câu lệnh For Each Rng In Selection

Chỉ sửa như chỗ màu đỏ, vẫn dùng nút lệnh.

Nói thêm:

1. Để nguyên code như cũ, thì bị lỗi. Nhưng khi debug, thấy các dòng lệnh phía trên dòng lệnh add vẫn chạy bình thường: Arr đã có 1 giá trị chuỗi nào đó sau vòng lặp For Each Rng in Selection. Rà chuột vào biến Arr sẽ thấy giá trị này.
Nếu lỗi do seletion bị lầm tưởng là commmandbutton, thì sẽ lỗi Type Miss Match ngay câu lệnh For Each Rng in Selection.

2. Record 1 macro gán validation, sau đó thay selection.validation bằng Cells(1, 1).Validation rồi chạy không dùng nút lệnh, vẫn lỗi.

Thế Sư phụ giải thích vì sao chạy Macro trực tiếp thì không bị lỗi, kể cả code bài 6? mà bấm nút lệnh thì lỗi.

Đệ hiểu nôm na vì tại thời điểm .Add 3, , , Arr không có đối tượng (range) nào trên Cells được chọn, do trước đó đã bấm nút lệnh (có lẽ Bác Bill đã phát hiện và sửa sai ở phiên bản sau).

Vẫn code bài 6 (hoặc bài nào cũng được), nếu thêm lệnh chọn một ô, hoặc một vùng hoặc thậm chí cả bảng tính miễn sao là range thì sẽ hết lỗi.

Ví dụ: thay câu

.Add 3, , , Arr

Bằng

Range("A100").Select ' thêm vào
.Add 3, , , Arr

Sẽ hết lỗi và cũng không sai kết quả


Nhưng hợp lý nhất là:

ActiveCell.Select ' thêm vào
.Add 3, , , Arr

Vì vậy Hoàng Trọng Nghĩa nói đã gần đúng!


Tóm lại, code bài 6 (code của Nghĩa chắc cũng vậy) chỉ thêm một câu ActiveCell.Select là được:
Mã:
Sub TraThep()
    Dim Arr As String
    Dim Rng As Range, MyRange As Range
    'On Error Resume Next
    For Each Rng In Selection
        If Rng.Value > 0 Then
            Arr = TraCotThep(Rng.Value, Sheet1.Range("L3").Value, Sheet1.Range("L4").Value)
            With Rng.Offset(, 3).Validation
                .Delete
                [B][COLOR=#ff0000]ActiveCell.Select [/COLOR][/B]' thêm vào
                .Add 3, , , Arr
            End With
        End If
    Next
End Sub
 
Lần chỉnh sửa cuối:
Thế Sư phụ giải thích vì sao chạy Macro trực tiếp thì không bị lỗi, kể cả code bài 6? mà bấm nút lệnh thì lỗi.

Đệ hiểu nôm na vì tại thời điểm .Add 3, , , Arr không có đối tượng (range) nào trên Cells được chọn, do trước đó đã bấm nút lệnh (có lẽ Bác Bill đã phát hiện và sửa sai ở phiên bản sau).

Vẫn code bài 6 (hoặc bài nào cũng được), nếu thêm lệnh chọn một ô, hoặc một vùng hoặc thậm chí cả bảng tính miễn sao là range thì sẽ hết lỗi.

Ví dụ: thay câu

.Add 3, , , Arr

Bằng

Range("A100").Select ' thêm vào
.Add 3, , , Arr

Sẽ hết lỗi và cũng không sai kết quả


Nhưng hợp lý nhất là:

ActiveCell.Select ' thêm vào
.Add 3, , , Arr

Vì vậy Hoàng Trọng Nghĩa nói đã gần đúng!


Tóm lại, code bài 6 (code của Nghĩa chắc cũng vậy) chỉ thêm một câu ActiveCell.Select là được:
Mã:
Sub TraThep()
    Dim Arr As String
    Dim Rng As Range, MyRange As Range
    'On Error Resume Next
    For Each Rng In Selection
        If Rng.Value > 0 Then
            Arr = TraCotThep(Rng.Value, Sheet1.Range("L3").Value, Sheet1.Range("L4").Value)
            With Rng.Offset(, 3).Validation
                .Delete
                [B][COLOR=#ff0000]ActiveCell.Select [/COLOR][/B]' thêm vào
                .Add 3, , , Arr
            End With
        End If
    Next
End Sub

Thay vì thêm Select trong vòng lặp thì chuyển nó ra ngoài sẽ nhanh hơn và dĩ nhiên không bị chớp nhiều hơn:

Mã:
Sub TraThep()
    If ActiveSheet.Name = "Sheet1" Then Exit Sub
    Dim Arr As String, Rng As Range
    [COLOR=#0000cd][B]Selection.Select[/B][/COLOR]
    For Each Rng In Selection
        If Val(Rng.Value) > 0 Then
            Arr = TraCotThep(Val(Rng.Value), Sheet1.Range("L3").Value, Sheet1.Range("L4").Value)
            With Rng.Offset(, 3).Validation
                .Delete
                .Add xlValidateList, , , Arr
            End With
        End If
    Next
End Sub

QUÁI LẠ!!!!!!!!!!

 
Đệ hiểu nôm na vì tại thời điểm .Add 3, , , Arr không có đối tượng (range) nào trên Cells được chọn, do trước đó đã bấm nút lệnh

Vậy tại thời điểm For Each Rng in Selection đã bấm nút lệnh chưa? Chắc chắn là cũng đã nhấn rồi chứ?

Nếu selection là nút lệnh thì phải báo lỗi "object doesn't support this property or method" ngay từ câu lệnh này:

For Each Rng In Sheet2.CommandButton2

Nhưng để nguyên selection nó chẳng báo lỗi, vây selection có phải là nút lệnh gì đâu?

Thế Sư phụ giải thích vì sao chạy Macro trực tiếp thì không bị lỗi, kể cả code bài 6? mà bấm nút lệnh thì lỗi.

Đây có thể chính là lỗi của 2003. Lúc thế này, lúc thế khác.
 
Vậy tại thời điểm For Each Rng in Selection đã bấm nút lệnh chưa? Chắc chắn là cũng đã nhấn rồi chứ?

Nếu selection là nút lệnh thì phải báo lỗi "object doesn't support this property or method" ngay từ câu lệnh này:

For Each Rng In Sheet2.CommandButton2

Nhưng để nguyên selection nó chẳng báo lỗi, vây selection có phải là nút lệnh gì đâu?



Đây có thể chính là lỗi của 2003. Lúc thế này, lúc thế khác.

Không biết chắc là lỗi gì! Nhưng có lẽ không phải là do Select nút lệnh mà phát sinh lỗi, cũng không phải lỗi do mảng. Ở bài 43 đã thể hiện điều đó.
 
Vậy tại thời điểm For Each Rng in Selection đã bấm nút lệnh chưa? Chắc chắn là cũng đã nhấn rồi chứ?

Nếu selection là nút lệnh thì phải báo lỗi "object doesn't support this property or method" ngay từ câu lệnh này:

For Each Rng In Sheet2.CommandButton2

Nhưng để nguyên selection nó chẳng báo lỗi, vây selection có phải là nút lệnh gì đâu?



Đây có thể chính là lỗi của 2003. Lúc thế này, lúc thế khác.

Từ lúc bấm nút đến lúc .add nó (thằng app) chưa động gì đến bảng tính cả, mà chỉ "đọc" thôi.
Chắc tại lúc đó thằng App nó đang mơ màng không biết mình đang đứng ở đâu nên quáng gà, mình phải nhắc nó. Ẹc, ẹc ...
Lúc nó báo lỗi đệ quan sát thấy ô địa chỉ trống rỗng


Thay vì thêm Select trong vòng lặp thì chuyển nó ra ngoài sẽ nhanh hơn và dĩ nhiên không bị chớp nhiều hơn:

Mã:
Sub TraThep()
    If ActiveSheet.Name = "Sheet1" Then Exit Sub
    Dim Arr As String, Rng As Range
    [COLOR=#0000cd][B]Selection.Select[/B][/COLOR]
    For Each Rng In Selection
        If Val(Rng.Value) > 0 Then
            Arr = TraCotThep(Val(Rng.Value), Sheet1.Range("L3").Value, Sheet1.Range("L4").Value)
            With Rng.Offset(, 3).Validation
                .Delete
                .Add xlValidateList, , , Arr
            End With
        End If
    Next
End Sub

QUÁI LẠ!!!!!!!!!!


Đúng rồi, mình muốn để vậy cho nó trực quan, còn khi dùng phải dời đi, miễn là phải nằm trước câu lệnh .add đó
 
Rảnh rỗi hãy sửa lại toàn bộ code đi, tôi thấy nó lượm thượm quá ---> Cóc muốn xem luôn
Muốn thành 1 addIn thì nên viết cho thật chuẩn
 
Rảnh rỗi hãy sửa lại toàn bộ code đi, tôi thấy nó lượm thượm quá ---> Cóc muốn xem luôn
Muốn thành 1 addIn thì nên viết cho thật chuẩn

Vậy Thầy "chuẩn hóa" cho bạn ấy luôn đi! Với con mắt tụi em vậy là được rồi hihihihii.
 
Vậy Thầy "chuẩn hóa" cho bạn ấy luôn đi! Với con mắt tụi em vậy là được rồi hihihihii.

Tôi cũng muốn lắm (ngứa mắt). Nhưng điều đầu tiên là tác giả phải giải thích rõ hàm TraCotThep nó làm cái gì? Tính toán thế nào? Ý nghĩa của các biến? vân vân...
Phần còn lại là code chỉ là chuyện nhỏ
 
Tôi cũng muốn lắm (ngứa mắt). Nhưng điều đầu tiên là tác giả phải giải thích rõ hàm TraCotThep nó làm cái gì? Tính toán thế nào? Ý nghĩa của các biến? vân vân...
Phần còn lại là code chỉ là chuyện nhỏ
Em cũng đang định muốn nhờ vấn đề này đây
Em nói qua vấn đề này như sau:
Một cấu kiện bê tông có nhiều mặt cắt có khả năng cịu lực kéo hay nén khác nhau do bê tông không đủ khả năng chịu các lực đó nên người ta đặt cốt thép vào để chịu lực. Ví dụ có một mặt cắt nào đó có vùng chịu kéo sau khi tính toán cốt thép cần đặt vào để chịu lực đó người ta gọi diện tích cốt thép tính toán (Fa ). Từ Fa này người ta tra vào bảng tính ở sheet 1 để chọn ra số lượng cốt thép phù hợp theo các điều kiện sau đây:

  1. Fa chọn >=Fa tính toán nhưng không phải chọn lớn thế nào cũng được (vì tiết kiệm và hàm lượng cốt thép không được quá lớn so với tiết diện bê tông)
  2. Số thanh thép được chọn không quá nhiều (có giới hạn) để rồi trên tiết diện mặt cắt ấy không đủ chỗ để bố trí cốt thép (hay nói cách khác bố trí khó đúng quy phạm).
  3. Trên một mặt cắt lựa chọn không quá 2 loại thép
  4. Chênh lệch đường kính các thanh thép được chọn không quá lớn (VD 2f6+2f12 là không được do chên lệch 12 và 6 quá lớn) (Thầy cứ lấy không quá 5 đi). Trước chữ f là số thanh thép, sau chữ f là đường kính thanh thép
Hàm TraCotThep nó chọn ra được các tổ hợp thép thỏa mãn các điều kiện trên (như file ở bài #5 nhập 1 số nào đó ở Fa tính toán trên Form, nhất Enter cho kết quả tìm kiếm được thể ở ListBox)
Bảng tra ở Sheet: theo hàng là số thanh, cột là đường kính tọa độ tại hàng và cột là diện tích tương ứng. Ví dụ 4f12 có diện tích là 12,556cm2 tại cell E12 của bảng tính
Mong được Sư Phụ và các anh chị khác tối ưu code. Em cảm ơn
 
Lần chỉnh sửa cuối:
Tôi cũng muốn lắm (ngứa mắt). Nhưng điều đầu tiên là tác giả phải giải thích rõ hàm TraCotThep nó làm cái gì? Tính toán thế nào? Ý nghĩa của các biến? vân vân...
Phần còn lại là code chỉ là chuyện nhỏ

Bây giờ chắc vắng tác giả nên mình nói giùm luôn:
Tại một vị trí nào đó trong cấu kiện bê tông cốt thép, khi tính kết cấu người ta đã tính ra được là cẩn phải xử dụng tối thiểu bao nhiêu cm2 thép (Biến Fa). Bây giờ nhiệm vụ đề ra là chọn bao nhiêu thanh thép gì để sử dụng tại vị trí đó. Điều kiện thứ nhất đặt ra là tổng tiết diện của các thanh thép đó không vươtj quá giới hạn nào đó của Fa tránh lãng phí (vì tiết diện các loại thép là các số lẻ và không liên tục nên không thể chọn bẳng Fa được) - Đó là biến tyle (tỷ lệ). Điều kiện thứ hai là số thanh phải được khống chế tối đa là bao nhiêu thanh (biến limsothanh). Điều kiện thứ ba là chỉ được phối hợp bởi hai loại thép.
 
Lần chỉnh sửa cuối:
Trong lúc chờ đợi các anh chị tối ưu code, mình gửi lại file dùng để tra cốt thép để các anh chị tham khảo
Có 2 chức năng để tra thể hiện qua menu để các bạn tra trên bảng tính nào cũng được
1. Tra nhanh từng diện tích
2. Tra theo lựa chọn:
VD: Bảng tính của bạn có kết quả diện tích tính toán là D5:D100, Vùng để chọn cốt thép phù hợp là G5:G100 thì các bạn làm như sau:
- Quét vùng D5:G100
- Vào menu Tra cốt thép\Tra theo lựa chọn\Tra thép
- Vào G5:G100 để chọn thép phù hợp
 

File đính kèm

  • Bangtra thep.rar
    32.2 KB · Đọc: 416
em vẫn chưa hiểu tác dụng của mục tra thép sau để làm gì. em thấy như củ là ok rồi, có diện tích thép, mình đưa ra phương án.
 
Lần chỉnh sửa cuối:
em vẫn chưa hiểu tác dụng của mục tra thép sau để làm gì. em thấy như củ là ok rồi, có diện tích thép, mình đưa ra phương án.
Nh­ư anh đã nói ở bài 6, khi người ta tính toán một loạt rất nhiều mặt cắt thì mình tra từng cái 1 thì khá mất thời gian, nên trường hợp sau là tra một lúc nhiều mặt cắt
 
bác ơi em ko biết dùng cái bảng này của bác như thế nào cả ,mở file ra nó chỉ có mỗi cái nút "đặt tỷ lệ giới hạn"?
 
bác ơi sao bảng của bác nếu nhập giá trị là 87,8 chẳng hạn thì nó báo lỗi không xuất ra kết quả dc,nếu nhập giá trị nhỏ như 14,15 thì lại được?
1. Mình thử với số trên có trường hợp nó không có kết quả vì với diện tích trên, bạn đặt giới hạn tăng diện tích 10%, số thanh là 5 thì làm sao mà có???. Bạn thay đổi các điều kiện giới hạn thử xem
2. Khi mở file có menu để bạn thực hiện
 
giúp em với ạ

Anh ơi giúp em với,em lập 1 bảng excel, nhập các giá trị M,N,các điều kiện khác để tính ra Fa,Fa', bây giờ anh giúp em kết hợp 2 bảng của em với của anh là 1 được không ạ? tức là tính ra được Fa,Fa' ta có thể tra ra luôn thép không ạ?
 

File đính kèm

  • mat cattuan.xls
    48 KB · Đọc: 52
1. Mình thử với số trên có trường hợp nó không có kết quả vì với diện tích trên, bạn đặt giới hạn tăng diện tích 10%, số thanh là 5 thì làm sao mà có???. Bạn thay đổi các điều kiện giới hạn thử xem
2. Khi mở file có menu để bạn thực hiện
anh ơi nếu ví dụ là Fa=67.34 h=300 cm,số lượng thanh thép tối đa 14,tỷ lệ tăng diện tích 5,nếu chọn 1 loại thép kết quả nó ra 9f32 không hợp lý lắm,nếu nó có thể ra 14f25 thì hợp lý hơn? anh có thể sửa lại được không ạ?
 
anh ơi nếu ví dụ là Fa=67.34 h=300 cm,số lượng thanh thép tối đa 14,tỷ lệ tăng diện tích 5,nếu chọn 1 loại thép kết quả nó ra 9f32 không hợp lý lắm,nếu nó có thể ra 14f25 thì hợp lý hơn? anh có thể sửa lại được không ạ?
Chẳng có gì để sửa, chỉ mở rộng vùng dữ liệu là được mà
Anh ơi giúp em với,em lập 1 bảng excel, nhập các giá trị M,N,các điều kiện khác để tính ra Fa,Fa', bây giờ anh giúp em kết hợp 2 bảng của em với của anh là 1 được không ạ? tức là tính ra được Fa,Fa' ta có thể tra ra luôn thép không ạ?
Trong file bạn có vùng thép tính toán F'a tại P14:p16, bạn muốn kết quả thép ở R14:R16 thì bạn làm như sau:
1. Quét chọn vùng P14:R16
2. Vào menu Tra cốt thép\Tra theo lựa chọn\ đặt tỷ lệ giới hạn
3. Vào menu Tra cốt thép\Tra theo lựa chọn\ Tra thép
4. Chọn thép phù hợp tại R14:R16
Tương tự bạn có vùng thép tính toán Fa tại Q14:Q16, bạn muốn kết quả thép ở S14:S16 thì bạn làm như sau:
1. Quét chọn vùng Q14:S16
2. Vào menu Tra cốt thép\Tra theo lựa chọn\ đặt tỷ lệ giới hạn
3. Vào menu Tra cốt thép\Tra theo lựa chọn\ Tra thép
4. Chọn thép phù hợp tại S14:S16
Sau khi chọn thép phù hợp xong, bạn có thể xóa validation của cột chọn thép
Chúc bạn thành công
 

File đính kèm

  • Bangtra thep.rar
    29.9 KB · Đọc: 144
Lần chỉnh sửa cuối:
Web KT
Back
Top Bottom