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

Liên hệ QC
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!
 
Web KT
Back
Top Bottom