Chương trình chọn thép theo diện tích. (1 người xem)

Liên hệ QC

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

ptlong04x1

Thành viên tích cực
Tham gia
15/10/08
Bài viết
1,031
Được thích
1,531
Nghề nghiệp
Kỹ sư xây dựng
Mình sưu tầm được chương trình chọn thép khi biết diện tích, chương trình đưa ra nhiều phương án lựa chọn phối hợp các Phi thép cho cùng 1 diện tích thép. Chân thành cảm ơn tác giả Đỗ Tuấn Phong.
 

File đính kèm

em không hiểu, giờ có 1 bảng tra thép. Giờ làm trong excel. muốn tìm ra các phương án mà có diện tích cốt thép lớn hơn giá trị cho trước có được không (nhưng khống chế chênh lệch không được quá 10% chẳng hạn)
 

File đính kèm

em không hiểu, giờ có 1 bảng tra thép. Giờ làm trong excel. muốn tìm ra các phương án mà có diện tích cốt thép lớn hơn giá trị cho trước có được không (nhưng khống chế chênh lệch không được quá 10% chẳng hạn)
Em xem file và cho ý kiến thêm thử nhé
 

File đính kèm

Chuẩn rồi anh Hoài ơi. Nhưng chổ Th chọn, Fa chọn, và tỷ lệ chênh lệch anh chưa làm phải không?
 
Chuẩn rồi anh Hoài ơi. Nhưng chổ Th chọn, Fa chọn, và tỷ lệ chênh lệch anh chưa làm phải không?
Đúng rồi nhưng những cái đó thừa sức em làm được mà. Cần thiết anh tải file khác lên
Bổ sung:
- Sau khi nhập Fa (diện tích tính toán) nhấn nút "TRA THÉP" hoặc nhấn phím Enter con trỏ vẫn vị trí nhập Fa để bạn nhập tiếp
- Thể hiện diện tích cốt thép, và tỷ lệ diện tích chọn so với diện tích tính toán
 

File đính kèm

Lần chỉnh sửa cuối:
Trong trường hợp tra nhiều diện tích cùng môt lúc thì tôi làm như thé này bị lỗi. Mong các anh chị xem giúp
- Quét vùng A2:A10
- Nhấn nút Test - Code bị lỗi
Mục đích đưa kết quả tra cứu được thành Validation để người dùng chọn phương án thép thích hợp ở cột D
 

File đính kèm

Trong trường hợp tra nhiều diện tích cùng môt lúc thì tôi làm như thé này bị lỗi. Mong các anh chị xem giúp
- Quét vùng A2:A10
- Nhấn nút Test - Code bị lỗi
Mục đích đưa kết quả tra cứu được thành Validation để người dùng chọn phương án thép thích hợp ở cột D

Có thấy bị lỗi gì đâu chứ? Bạn nói rõ chút đi
 
Báo lỗi tại hàng có code: .Add 3, , , Arr
Xin các anh chị giúp đỡ
Tôi test hổng có bất cứ lỗi nào cả!
Xin hỏi: Bạn dùng Office version nào? Nếu là Office 2003 thì Validation có giới hạn, cụ thể là độ dài chuổi không được vượt quá 255 ký tự ---> Bạn kiểm tra lại xem
 
Tôi test hổng có bất cứ lỗi nào cả!
Xin hỏi: Bạn dùng Office version nào? Nếu là Office 2003 thì Validation có giới hạn, cụ thể là độ dài chuổi không được vượt quá 255 ký tự ---> Bạn kiểm tra lại xem
Dạ, em đang dùng office 2003 nhưng chuỗi không đến nỗi dài đến 255 ký tự được (vì tính sơ qua 1 phần tử 9 ký tự, cộng ký tự "," nữa là 10 như vậy chuỗi của em ít nhất cũng được 25 phần tử như thế, khó đạt đến điều này)
Đúng là em test trên Excel 2007 không bị lỗi, lạ thật
 
Lần chỉnh sửa cuối:
Dạ, em đang dùng office 2003 nhưng chuỗi không đến nỗi dài đến 255 ký tự được (vì tính sơ qua 1 phần tử 9 ký tự, cộng ký tự "," nữa là 10 như vậy chuỗi của em ít nhất cũng được 25 phần tử như thế, khó đạt đến điều này)
Đúng là em test trên Excel 2007 không bị lỗi, lạ thật

Bạn kiểm tra thế này nhé:
- Gõ hàm TraCotThep trực tiếp lên sheet rồi dùng hàm LEN kiểm tra độ dài chuổi xem nó dài bao nhiêu?
- Xong, copy giá trị chuổi nhận được rồi Add bằng tay vào Validation xem "nó" có cự nự gì không
 
Bạn kiểm tra thế này nhé:
- Gõ hàm TraCotThep trực tiếp lên sheet rồi dùng hàm LEN kiểm tra độ dài chuổi xem nó dài bao nhiêu?
- Xong, copy giá trị chuổi nhận được rồi Add bằng tay vào Validation xem "nó" có cự nự gì không
Em đã thử
- Chuỗi có độ dài lớn nhất là 93
- Thay thế chuỗi có ký tự "," thành ";" và Copy chuỗi add vào Validation thì vẫn được bình thường
(em cũng đã thử thay đổi hàm Join(ArrKQ, ";") vẫn không được)
 
Em đã thử
- Chuỗi có độ dài lớn nhất là 93
- Thay thế chuỗi có ký tự "," thành ";" và Copy chuỗi add vào Validation thì vẫn được bình thường
(em cũng đã thử thay đổi hàm Join(ArrKQ, ";") vẫn không được)
Hỏi lại:
- Nếu bạn không sửa dấu phẩy thành dấu chấm phẩy, cứ để nguyên vậy copy và Add vào Validation thì có lỗi gì không?
- Trong code của hàm TraCotThep, nếu bạn sửa đoạn TraCotThep = Join(ArrKQ, ",") thành TraCotThep = Join(ArrKQ, ";") thì code có lỗi không?
 
Hỏi lại:
- Nếu bạn không sửa dấu phẩy thành dấu chấm phẩy, cứ để nguyên vậy copy và Add vào Validation thì có lỗi gì không?
- Trong code của hàm TraCotThep, nếu bạn sửa đoạn TraCotThep = Join(ArrKQ, ",") thành TraCotThep = Join(ArrKQ, ";") thì code có lỗi không?
- Nếu không sửa dấu phẩy thành dấu chấm phẩy, cứ để nguyên vậy copy và Add vào Validation thì có lỗi
- Trong code của hàm TraCotThep, nếu sửa đoạn TraCotThep = Join(ArrKQ, ",") thành TraCotThep = Join(ArrKQ, ";") thì code vẫn có lỗi (em nghĩ cái này không quan trọng, nếu dấu sai khác trở thành Validation 1 phần tử)
 
- Nếu không sửa dấu phẩy thành dấu chấm phẩy, cứ để nguyên vậy copy và Add vào Validation thì có lỗi
- Trong code của hàm TraCotThep, nếu sửa đoạn TraCotThep = Join(ArrKQ, ",") thành TraCotThep = Join(ArrKQ, ";") thì code vẫn có lỗi (em nghĩ cái này không quan trọng, nếu dấu sai khác trở thành Validation 1 phần tử)
Rắc rối quá đi mất
Tiếc là tôi không ngồi trên máy bạn, nếu không tôi tin rằng có thể biết được đó là lỗi gì
Vấn đề độ dài ký tự ta loại ra (vì chuổi của bạn không vượt quá 255). Vậy ta có thể nghĩ đến dấu phân cách. Bạn thử vào Control Panel, cho mọi thứ trở về mặc định như lúc mới cài Windows xem (tức dấu thập phân là dấu chấm, dấu phân cách ngàn là dấu phẩy, dấu phân cách công thức là dấu phẩy)... xong thử lại code!
(Tôi dùng Windows 7, Office 2010, có vài thứ không giống trên máy của bạn)
 
Rắc rối quá đi mất
Tiếc là tôi không ngồi trên máy bạn, nếu không tôi tin rằng có thể biết được đó là lỗi gì
Vấn đề độ dài ký tự ta loại ra (vì chuổi của bạn không vượt quá 255). Vậy ta có thể nghĩ đến dấu phân cách. Bạn thử vào Control Panel, cho mọi thứ trở về mặc định như lúc mới cài Windows xem (tức dấu thập phân là dấu chấm, dấu phân cách ngàn là dấu phẩy, dấu phân cách công thức là dấu phẩy)... xong thử lại code!
(Tôi dùng Windows 7, Office 2010, có vài thứ không giống trên máy của bạn)
Sư phụ có thể vào TeamVier để can thiệp vào máy em
 
Rắc rối quá đi mất
Tiếc là tôi không ngồi trên máy bạn, nếu không tôi tin rằng có thể biết được đó là lỗi gì
Vấn đề độ dài ký tự ta loại ra (vì chuổi của bạn không vượt quá 255). Vậy ta có thể nghĩ đến dấu phân cách. Bạn thử vào Control Panel, cho mọi thứ trở về mặc định như lúc mới cài Windows xem (tức dấu thập phân là dấu chấm, dấu phân cách ngàn là dấu phẩy, dấu phân cách công thức là dấu phẩy)... xong thử lại code!
(Tôi dùng Windows 7, Office 2010, có vài thứ không giống trên máy của bạn)

Test thấy rất bình thường, đã thử chuyển dấu phân cách từ dấu chấm thành dấu phẩy từ Control Panel ... cũng ... bình thường luôn!

Chẳng thấy lỗi nào phát sinh cho dù mình thử hàng chục dòng có giá trị lớn hơn 0 hay 1 dòng vậy tại sao ta?
 
Test thấy rất bình thường, đã thử chuyển dấu phân cách từ dấu chấm thành dấu phẩy từ Control Panel ... cũng ... bình thường luôn!

Chẳng thấy lỗi nào phát sinh cho dù mình thử hàng chục dòng có giá trị lớn hơn 0 hay 1 dòng vậy tại sao ta?
Anh test trên excel 2003 đấy chứ? Lạ thật code đơn giản thế mà vẫn không tìm ra lỗi gì
 
1. Mình nhập các số đó từ bàn phím (cũng đã kiểm tra kiểu dữ liệu)
2. Cũng file đó Test trên excel 2007 vẫn bình thường

Vậy chịu khó sửa lại code chút đi:

Mã:
Sub TraThep()
      Dim Arr As String
      Dim Rng As Range, MyRange As Range
      [COLOR=#008000]'On Error Resume Next[/COLOR]
      For Each Rng In Selection
            If [COLOR=#ff0000][B]Val([/B][/COLOR]Rng.Value[B][COLOR=#ff0000])[/COLOR][/B] > 0 Then
                  Arr = TraCotThep([COLOR=#ff0000][B]Val([/B][/COLOR]Rng.Value[B][COLOR=#ff0000])[/COLOR][/B], Sheet1.Range("L3").Value, Sheet1.Range("L4").Value)
                  With Rng.Offset(, 3).Validation
                        .Delete
                        .Add 3, , , Arr
                  End With
            End If
      Next
End Sub
 
Vậy chịu khó sửa lại code chút đi:

Mã:
Sub TraThep()
      Dim Arr As String
      Dim Rng As Range, MyRange As Range
      [COLOR=#008000]'On Error Resume Next[/COLOR]
      For Each Rng In Selection
            If [COLOR=#ff0000][B]Val([/B][/COLOR]Rng.Value[B][COLOR=#ff0000])[/COLOR][/B] > 0 Then
                  Arr = TraCotThep([COLOR=#ff0000][B]Val([/B][/COLOR]Rng.Value[B][COLOR=#ff0000])[/COLOR][/B], Sheet1.Range("L3").Value, Sheet1.Range("L4").Value)
                  With Rng.Offset(, 3).Validation
                        .Delete
                        .Add 3, , , Arr
                  End With
            End If
      Next
End Sub
Vẫn không được anh ạ, cái này cũng đã được thử rồi
 
Vẫn không được anh ạ, cái này cũng đã được thử rồi

Thử tiếp thêm 1 lần nữa xem sao!

Mã:
Sub TraThep()
      Dim Arr As String
      Dim Rng As Range, MyRange As Range
      'On Error Resume Next
      For Each Rng In Selection
            If [B][COLOR=#ff0000]Val[/COLOR](Rng.Value)[/B] > 0 Then
                  Arr = TraCotThep([B][COLOR=#ff0000]Val[/COLOR](Rng.Value), [COLOR=#ff0000]Val[/COLOR](Sheet1.Range("L3").Value), [/B][B][COLOR=#ff0000]Val[/COLOR][/B][B](Sheet1.Range("L4").Value)[/B])
                  With Rng.Offset(, 3).Validation
                        .Delete
                        .Add 3, , , Arr
                  End With
            End If
      Next
End Sub
 
Thử tiếp thêm 1 lần nữa xem sao!

Mã:
Sub TraThep()
      Dim Arr As String
      Dim Rng As Range, MyRange As Range
      'On Error Resume Next
      For Each Rng In Selection
            If [B][COLOR=#ff0000]Val[/COLOR](Rng.Value)[/B] > 0 Then
                  Arr = TraCotThep([B][COLOR=#ff0000]Val[/COLOR](Rng.Value), [COLOR=#ff0000]Val[/COLOR](Sheet1.Range("L3").Value), [/B][B][COLOR=#ff0000]Val[/COLOR][/B][B](Sheet1.Range("L4").Value)[/B])
                  With Rng.Offset(, 3).Validation
                        .Delete
                        .Add 3, , , Arr
                  End With
            End If
      Next
End Sub
Và cái này cũng đã từng thử rồi anh ơi.
Tình hình trông có vẽ căng nhỉ
 
xin lỗi cho mình cắt ngang 1 tí..mình sử dụng bản excel anh hoài, tức là khi dùng hàm tracotthep (Fa,giới hạn tỉ lệ tăng,số thanh tối thiểu ) nó chỉ ra có 1 kết quả..làm sao để có thể hiện thị đủ kết quả trong chương trình test để mình sử dụng công cụ combo box để lựa chọn.Mình xin cảm ơn
 
xin lỗi cho mình cắt ngang 1 tí..mình sử dụng bản excel anh hoài, tức là khi dùng hàm tracotthep (Fa,giới hạn tỉ lệ tăng,số thanh tối thiểu ) nó chỉ ra có 1 kết quả..làm sao để có thể hiện thị đủ kết quả trong chương trình test để mình sử dụng công cụ combo box để lựa chọn.Mình xin cảm ơn
Mỗi số liệu có nhiều nghiệm vậy bạn, các nghiệm ấy đưa vào Validation (không phải combobox) để người dùng chọn tùy ý họ để phù hợp với kết cầu họ đã thiết kế
(Nghĩa vào tin nhắn riêng đọc ID và Pass đi)
 
Ý tưởng của mình là khi mà gõ hàm xong...nó sẽ ra 1 danh sách kết quả...mình sẽ đưa vào cái Combo box làm cái list để lựa chọn.Cái Validation bạn nói tới mình chưa nghiên cứu bao giờ..trước tiên là cái hàm mình gõ xong nó chỉ ra có 1 kết quả à L bạn có thể nói rõ cho mình được không.Mình chỉ là gà mờ trong lĩnh vực này..chân thành cảm ơn bạn
 
Ý tưởng của mình là khi mà gõ hàm xong...nó sẽ ra 1 danh sách kết quả...mình sẽ đưa vào cái Combo box làm cái list để lựa chọn.Cái Validation bạn nói tới mình chưa nghiên cứu bao giờ..trước tiên là cái hàm mình gõ xong nó chỉ ra có 1 kết quả à L bạn có thể nói rõ cho mình được không.Mình chỉ là gà mờ trong lĩnh vực này..chân thành cảm ơn bạn
Mình không muốn là combobox vì sử dụng nó cần đến code của file dữ liệu. Ý mình file này sau chuyển thành AddIn sẽ sử dụng được cho bất kỳ file nào (mà các file này thông không có code) nên mình sử dụng validation
 
Mỗi số liệu có nhiều nghiệm vậy bạn, các nghiệm ấy đưa vào Validation (không phải combobox) để người dùng chọn tùy ý họ để phù hợp với kết cầu họ đã thiết kế
(Nghĩa vào tin nhắn riêng đọc ID và Pass đi)

Hiểu nguyên do rồi! Với Excel 2003 khi bạn dùng nút lệnh đồng thời lại dùng Selection vì thế ta bấm vào nút lệnh nó lại ngầm hiểu nút lệnh chính là cái nó đang select vì thế phát sinh lỗi, nếu chạy bình thường sẽ không sao.

=> Gán phím tắt cho Macro là chắc cú (Ctrl+Shift+W chẳng hạn) và không dùng nút lệnh!

Mã:
Sub TraThep()
    Dim Arr, Rng As Range
        For Each Rng In Selection
            If Val(Rng.Value) > 0 Then
                Arr = TraCotThep(Val(Rng.Value), Val(Sheet1.Range("L3").Value), Val(Sheet1.Range("L4").Value))
                With Rng.Offset(, 3).Validation
                    .Delete
                    .Add xlValidateList, , , Arr
                End With
            End If
        Next
End Sub
 
Hiểu nguyên do rồi! Với Excel 2003 khi bạn dùng nút lệnh đồng thời lại dùng Selection vì thế ta bấm vào nút lệnh nó lại ngầm hiểu nút lệnh chính là cái nó đang select vì thế phát sinh lỗi, nếu chạy bình thường sẽ không sao.

=> Gán phím tắt cho Macro là chắc cú (Ctrl+Shift+W chẳng hạn) và không dùng nút lệnh!

Mã:
Sub TraThep()
    Dim Arr, Rng As Range
        For Each Rng In Selection
            If Val(Rng.Value) > 0 Then
                Arr = TraCotThep(Val(Rng.Value), Val(Sheet1.Range("L3").Value), Val(Sheet1.Range("L4").Value))
                With Rng.Offset(, 3).Validation
                    .Delete
                    .Add xlValidateList, , , Arr
                End With
            End If
        Next
End Sub
Không đúng rồi, cũng như mình nhấn Alt+F8 chạy thủ tục "TraThep" thôi
(Sao không thấy Nghĩa vào máy mình vậy)
 
File của mình bỏ các hàm Val() rồi nhấn Alt+F8 nó không còn lỗi nữa, file Nghĩa nhấn tổ hợp phím Ctrl+Shift+W vẫn bị lỗi, nếu bỏ các hàm Val() thì nhấn Ctrl+Shift+W hết lỗi liền à
Cảm ơn Nghĩa rất nhiều

Sao cũng được, miễn là tìm ra nguyên nhân và giải pháp là OK rồi!
 
Đã test kỹ: 2007, 2010 chạy bình thường. Riêng 2003 bị báo lỗi.

Sửa thế này thì hết:

Mã:
 Rng.Offset(, 3)[COLOR=#ff0000].Select[/COLOR]
  With [COLOR=#ff0000]Selection[/COLOR].Validation
    .Delete
    .Add 3, , , Arr
  End With

Ghi chú:
Test file bài 6
dấu phân cách của hệ thống không liên quan
 
Lần chỉnh sửa cuối:
Đã test kỹ: 2007, 2010 chạy bình thường. Riêng 2003 bị báo lỗi.

Sửa thế này thì hết:

Mã:
 Rng.Offset(, 3)[COLOR=#ff0000].Select[/COLOR]
  With [COLOR=#ff0000]Selection[/COLOR].Validation
    .Delete
    .Add 3, , , Arr
  End With

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

Hiểu nguyên do rồi! Với Excel 2003 khi bạn dùng nút lệnh đồng thời lại dùng Selection vì thế ta bấm vào nút lệnh nó lại ngầm hiểu nút lệnh chính là cái nó đang select vì thế phát sinh lỗi, nếu chạy bình thường sẽ không sao.

=> Gán phím tắt cho Macro là chắc cú (Ctrl+Shift+W chẳng hạn) và không dùng nút lệnh!

Mã:
Sub TraThep()
    Dim Arr, Rng As Range
        For Each Rng In Selection
            If Val(Rng.Value) > 0 Then
                Arr = TraCotThep(Val(Rng.Value), Val(Sheet1.Range("L3").Value), Val(Sheet1.Range("L4").Value))
                With Rng.Offset(, 3).Validation
                    .Delete
                    .Add xlValidateList, , , Arr
                End With
            End If
        Next
End Sub
 
Đã test kỹ: 2007, 2010 chạy bình thường. Riêng 2003 bị báo lỗi.

Sửa thế này thì hết:

Mã:
 Rng.Offset(, 3)[COLOR=#ff0000].Select[/COLOR]
  With [COLOR=#ff0000]Selection[/COLOR].Validation
    .Delete
    .Add 3, , , Arr
  End With

Ghi chú:
Test file bài 6
dấu phân cách của hệ thống không liên quan
Quá chuẩn luôn, kể cả quét chọn rồi nhấn nút vẫn chạy bình thường. Em thấy 2 cách có vẻ giống nhau, Anh có thể nói rõ hơn nguyên nhân được không?
Cảm ơn anh rất nhiều. Ủa, bài anh sao em không thấy nút cảm ơn nhỉ?
 
Không phải lỗi selection. Vì code bài 6 để nguyên, chỉ sửa select các ô cần gán validation trước khi gán.

Nguyên nhân thì cũng chỉ mày mò 1 lát:

Record macro 1 list bất kỳ thấy nó dùng With seletion.validation
Vời macro mới record:
Thử xóa từng dòng thừa, vẫn chạy
Thử thay "selection" bằng Cells(1,1) thấy bị lỗi

Quay lại code chính, thử dùng select và selection: Hết lỗi

Thế thôi
 
Lần chỉnh sửa cuối:
Quá chuẩn luôn, kể cả quét chọn rồi nhấn nút vẫn chạy bình thường. Em thấy 2 cách có vẻ giống nhau, Anh có thể nói rõ hơn nguyên nhân được không?
Cảm ơn anh rất nhiều. Ủa, bài anh sao em không thấy nút cảm ơn nhỉ?

Thông thường, code viết cho Range ít ai sử dụng Select, nhưng trong trường hợp này Range(X).Select là chuẩn nhất bởi vì, như đã nói, khi ta bấm vào nút lệnh, có nghĩa là ta đã Select nút lệnh, vì thế hành động đó được gọi là Selection, mà nút lệnh thì chả có giá trị gì (mà cũng chẳng phải là Rng) nên phát sinh lỗi. Với trường hợp này sau khi select nút lệnh, ta lại chuyển qua select Range cho nên, Range là cái Selection chứ không còn là nút lệnh nữa, vì vậy sẽ không phát sinh lỗi!
 
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

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

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

Lần chỉnh sửa cuối:
em cảm ơn anh rất nhiều,anh ơi nếu bây giờ mà viết nó thành 1 phần mềm mà chỉ cần nhập các thông số M,F1,b,h,các thông số khác mà em bôi màu như trong bảng của em lập ý,để cho ra thép luôn được ko ạ hì,như thế thì quá tiện luôn :)
 
em cảm ơn anh rất nhiều,anh ơi nếu bây giờ mà viết nó thành 1 phần mềm mà chỉ cần nhập các thông số M,F1,b,h,các thông số khác mà em bôi màu như trong bảng của em lập ý,để cho ra thép luôn được ko ạ hì,như thế thì quá tiện luôn :)
Được, nhưng mình thấy không cần thiết do
1. Người ta đã có các file đã tính toán được cốt thép dựa vào số liệu trên
2. Có nhiều người đã làm việc này rồi, bạn cứ tìm kiếm trên mạng
Bạn có thể liên hệ với pham van an, người này là giảng viên đại học kiến trúc Đà Nẵng đã làm một phần mềm lấy số liệu từ các chương trình tính kết cấu sang excel và tính toán cốt thép theo TCVN
 
Lần chỉnh sửa cuối:
Em thấy file Excel này rất hữu ích, xin hỏi tác giả có thể cải tiến thêm nếu giá trị tìm được mà không thỏa có thể chọn 2 thanh thép ở dòng đầu tiên của mảng được không vậy?
 

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

Back
Top Bottom