Chỉ cho phép nhập số trong TextBox (1 người xem)

Liên hệ QC

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

doanhhoang79

Thành viên hoạt động
Tham gia
31/3/08
Bài viết
142
Được thích
18
Chào các anh chị trên diễn đàn.

Tôi tìm thấy trên diễn đàn có một file (không nhớ tên tác giả) với nội dung chỉ cho phép nhập ký tự số và ký tự ".". Tuy nhiên khi tôi gõ liên tiếp 2 ký tự "o", 2 ký tự "d",...thì nó lại xuất hiện trong textbox (gõ theo kiểu Telex). Tôi không biết nguyên nhân lỗi này. Mong các anh chị kiểm tra giúp và thêm, sửa code để khi gõ liên tiếp ký tự "o" 2 lần nó không xuất hiện trong textbox nữa.

Tôi gửi file đính kèm

Xin cảm ơn.
 

File đính kèm

Chào các anh chị trên diễn đàn.

Tôi tìm thấy trên diễn đàn có một file (không nhớ tên tác giả) với nội dung chỉ cho phép nhập ký tự số và ký tự ".". Tuy nhiên khi tôi gõ liên tiếp 2 ký tự "o", 2 ký tự "d",...thì nó lại xuất hiện trong textbox (gõ theo kiểu Telex). Tôi không biết nguyên nhân lỗi này. Mong các anh chị kiểm tra giúp và thêm, sửa code để khi gõ liên tiếp ký tự "o" 2 lần nó không xuất hiện trong textbox nữa.

Tôi gửi file đính kèm

Xin cảm ơn.
Tôi test thấy bình thường mà bạn!
Có điều nếu chỉ cần cho phép nhập ký tự số và dấu chấm thì tôi nghĩ code đâu dài thế
PHP:
Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
 If InStr("1234567890." + Chr$(vbKeyBack), Chr$(KeyAscii)) = 0 Then
  KeyAscii = 0
 End If
End Sub
 
Upvote 0
Tôi test thấy bình thường mà bạn!
Có điều nếu chỉ cần cho phép nhập ký tự số và dấu chấm thì tôi nghĩ code đâu dài thế
PHP:
Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
 If InStr("1234567890." + Chr$(vbKeyBack), Chr$(KeyAscii)) = 0 Then
  KeyAscii = 0
 End If
End Sub
Với code này thì sẽ xảy ra hiện tượng nhập nhiều dấu chấm vẫn chấp nhận, chính vì thế tác giả phải đưa thêm 1 số tình huống để xét.
Bạn nói là test bình thường nhưng không biết bạn dùng bảng mã nào, kiểu gõ nào, nếu dùng Unicode và Telex thì sẽ bị lôi Chr$(KeyAscii) khi nhập 2 chữ d hoặc 2 chữ o vì lúc đó sẽ là đ và ô
Tôi đổi Chr$(KeyAscii) thành ChrW(KeyAscii) thì không bị lỗi và không hiển thị lên ký tự nhập vào nữa nhưng nó lại xóa luôn ký tự đứng trước, kỳ thật.
Kể ra cũng hơi đau đầu.
 
Upvote 0
Với code này thì sẽ xảy ra hiện tượng nhập nhiều dấu chấm vẫn chấp nhận, chính vì thế tác giả phải đưa thêm 1 số tình huống để xét.
Bạn nói là test bình thường nhưng không biết bạn dùng bảng mã nào, kiểu gõ nào, nếu dùng Unicode và Telex thì sẽ bị lôi Chr$(KeyAscii) khi nhập 2 chữ d hoặc 2 chữ o vì lúc đó sẽ là đ và ô
Tôi đổi Chr$(KeyAscii) thành ChrW(KeyAscii) thì không bị lỗi và không hiển thị lên ký tự nhập vào nữa nhưng nó lại xóa luôn ký tự đứng trước, kỳ thật.
Kể ra cũng hơi đau đầu.

Đúng đấy, lỗi xảy ra đúng y như bạn nói. Tôi cũng đã tim đủ mọi cánh nhưng chăng ăn thua gì. Chẳng lẽ lại botay.com hay sao?. Tôi nghĩ chắc chắn là phải có cách để xử lý lỗi này.

Mong mọi người tiếp tục cho cao kiến.
 
Upvote 0
Với code này thì sẽ xảy ra hiện tượng nhập nhiều dấu chấm vẫn chấp nhận, chính vì thế tác giả phải đưa thêm 1 số tình huống để xét.

Thủ tục này chỉ cho nhập duy nhất 1 dấu chấm và các chữ số.
Mã:
Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
Select Case KeyAscii
Case 46, 48 To 57
  If KeyAscii = 46 And InStr(1, TextBox1, ".") > 0 Then KeyAscii = 0
Case Else
  KeyAscii = 0
End Select
End Sub
 
Upvote 0
Đúng đấy, lỗi xảy ra đúng y như bạn nói. Tôi cũng đã tim đủ mọi cánh nhưng chăng ăn thua gì. Chẳng lẽ lại botay.com hay sao?. Tôi nghĩ chắc chắn là phải có cách để xử lý lỗi này.

Mong mọi người tiếp tục cho cao kiến.
Tôi cũng không rành lắm về Form... tôi dùng cách "củ chuối" này xem thế nào nhé:
PHP:
Private Sub TextBox1_Change()
  On Error Resume Next
  With TextBox1
    If Not IsNumeric(.Text) Then
      .Text = Left(.Text, Len(.Text) - 1): Exit Sub
    End If
  End With
End Sub
PHP:
Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
 On Error Resume Next
 If InStr("1234567890." + Chr$(vbKeyBack), Chr$(KeyAscii)) = 0 Then
  KeyAscii = 0
 End If
End Sub
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Cho em nhận xét tí ti:
  • Cái Textbox1Keypress của Thầy Long và của anh Ndu chạy rất tốt: chỉ cho phép nhập cái chữ số và dấu chấm.

  • Còn cái Textbox1_Change của anh Ndu thì không ổn... Nếu nhập dấu chấm, nó chỉ cho nhập 1 dấu chấm mà thôi, rồi thì cấm. Nhưng nếu nhập dấu phẩy vào đó, thì bao nhiêu dấu phẩy nó cũng OK...
 
Upvote 0
Cho em nhận xét tí ti:
  • Cái Textbox1Keypress của Thầy Long và của anh Ndu chạy rất tốt: chỉ cho phép nhập cái chữ số và dấu chấm.
  • Còn cái Textbox1_Change của anh Ndu thì không ổn... Nếu nhập dấu chấm, nó chỉ cho nhập 1 dấu chấm mà thôi, rồi thì cấm. Nhưng nếu nhập dấu phẩy vào đó, thì bao nhiêu dấu phẩy nó cũng OK...
Sao kỳ vậy ta!
Tôi test trên máy tôi đâu có vụ cho phép nhập dấu phẩy nhỉ?
Có khi nào Regional Language Options trên máy của BNTT định dạng dấu phẩy là dấu thập phân không đó?
 
Lần chỉnh sửa cuối:
Upvote 0
Em thì thường dùng thế này cho nó đơn giản :
PHP:
Private Sub H_TBDKThanhTien_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
    On Error Resume Next
    Select Case KeyAscii
    Case 48 To 57
        'Case vbKeyBack, vbKeyClear, vbKeyDelete
        'Case vbKeyLeft, vbKeyRight, vbKeyUp, vbKeyDown, vbKeyTab
    Case 96 To 105 ' For Numpad
    Case 109, 110 ' For "-", "."
    Case Else
        KeyAscii = 0
    End Select
End Sub
--CV--
 
Upvote 0
Thủ tục này chỉ cho nhập duy nhất 1 dấu chấm và các chữ số.
Mã:
Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
Select Case KeyAscii
Case 46, 48 To 57
  If KeyAscii = 46 And InStr(1, TextBox1, ".") > 0 Then KeyAscii = 0
Case Else
  KeyAscii = 0
End Select
End Sub
Cách làm nào tôi cũng thấy đúng cả nhưng vẫn không triệt để được. Cái của bác cũng vậy mà, bác cứ nhập liên tiếp 2 chữ o hoặc 2 chữ d (hoặc ký tự có dấu bất kỳ) khi TextBox1.SelStart < Len(TextBox1.Text) (nhớ là bảng mã Unicode, kiểu gõ Telext bộ gõ Unikey, bảng mã khác, kiểu gõ khác và bộ gõ khác tôi chưa test.) nó xóa luôn ký tự đứng trước.
Tôi nghĩ củ chuối nằm ở chỗ bị thằng Unikey nó hook trước, vì khi gõ chữ d đầu tiên thì bị đoạn mã trên loại bỏ, đến ký tự thứ 2 thì Unikey quét đến ký tự trước đó và xóa ký tự đó đi để truyền vào ký tự đ để thay thế lúc đó lại bị đoạn mã trên loại bỏ nên xảy ra hiện tượng này.
Nếu tắt chế độ tiếng Việt đi thì Ok luôn.
Cách giải quyết là làm sao tắt được chế độ tiếng Việt đây.
 
Upvote 0
Tôi cũng không rành lắm về Form... tôi dùng cách "củ chuối" này xem thế nào nhé:
PHP:
Private Sub TextBox1_Change()
  On Error Resume Next
  With TextBox1
    If Not IsNumeric(.Text) Then
      .Text = Left(.Text, Len(.Text) - 1): Exit Sub
    End If
  End With
End Sub
Cách này không ổn, bất đắc dĩ lắm mới đưa vào sự kiện change vì sẽ xảy ra trường hợp thủ tục chạy lòng vòng với lại đoạn mã này chỉ xét được trường hợp ký tự nhập vào ở cuối cùng thôi.
 
Upvote 0
Em thì thường dùng thế này cho nó đơn giản :
PHP:
Private Sub H_TBDKThanhTien_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
    On Error Resume Next
    Select Case KeyAscii
    Case 48 To 57
        'Case vbKeyBack, vbKeyClear, vbKeyDelete
        'Case vbKeyLeft, vbKeyRight, vbKeyUp, vbKeyDown, vbKeyTab
    Case 96 To 105 ' For Numpad
    Case 109, 110 ' For "-", "."
    Case Else
        KeyAscii = 0
    End Select
End Sub
--CV--
Kỳ thật, tôi test thử thấy tất cả các ký tự đều nhận hết.
 
Upvote 0
Sao kỳ vậy ta!
Tôi test trên máy tôi đâu có vụ cho phép nhập dấu phẩy nhỉ?
Có khi nào Regional Language Options trên máy của BNTT định dạng dấu phẩy là dấu thập phân không đó?
Hông... Em vẫn xài định dạng số kiểu Mỹ thì hồi nảo hồi nao.
Vả lại, em copy cả 2 cái code của anh, dán chung vào một chỗ, sau đó em test từng cái một (chạy cái này thì đánh dấu ' vào cái kia, không sợ chuyện 2 cái đụng nhau). Nếu như cái Change mà sai thì cái Keypress cũng sai chứ? Đằng này, cái Keypress chạy rất ngon (không thể nhập dấu phẩy vào trong textbox), chỉ có cái Change là bị trục trặc thôi.
 
Upvote 0
Hông... Em vẫn xài định dạng số kiểu Mỹ thì hồi nảo hồi nao.
Vả lại, em copy cả 2 cái code của anh, dán chung vào một chỗ, sau đó em test từng cái một (chạy cái này thì đánh dấu ' vào cái kia, không sợ chuyện 2 cái đụng nhau). Nếu như cái Change mà sai thì cái Keypress cũng sai chứ? Đằng này, cái Keypress chạy rất ngon (không thể nhập dấu phẩy vào trong textbox), chỉ có cái Change là bị trục trặc thôi.
Ah... không! 2 code phải chạy cùng lúc BNTT à!
 
Upvote 0
Với code này:
PHP:
Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
  Select Case KeyAscii
    Case 48 To 57
    Case 45
      If InStr(1, Me.TextBox1.Text, "-") > 0 Or Me.TextBox1.SelStart > 0 Then KeyAscii = 0
    Case 46
      If InStr(1, Me.TextBox1.Text, ".") > 0 Then KeyAscii = 0
    Case Else
      KeyAscii = 0
  End Select
End Sub
Chạy From lần thứ nhất sẽ bị lổi gõ 2 chử d hoặc 2 chử o
Nhưng nếu đóng Form rồi chạy lại lần nữa thì... hết bị...
Kỳ lạ thật!
----------------
Ủa... mà sao bây giờ test lại không lổi nữa ta?
Các bạn test dùng file đính kèm này với!
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Vẫn chết đứ đừ, lúc được lúc không có nghĩa là vẫn chưa được triệt để.
Tóm lại nếu nhập ký tự có dấu bằng các bộ gõ thông thường thì đều bị chết khi gõ ký tự có dấu, không riêng gì d hay o. Như bài trên tôi đã nói, nguyên nhân chính là do bị bộ gõ đã tiến hành hook bàn phím trước, nên các sự kiện khác đều phụ thuộc vào chế độ hook của bộ gõ.
về code thì cái nào tôi cũng thấy đúng dù là chr(keycode) hay chrw(keycode) hay chr$(keyascii).. select case, instr(...) thì cũng thế bản chất đều như nhau là kiểm tra mã ký tự xuất hiện.
Theo tôi, vấn đề ở đây là làm thế nào để tắt chế độ nhập TV của bộ gõ, còn nếu ai đó đưa ra được thủ pháp không cần tắt chế độ nhập TV mà vẫn đảm bảo được các tình huống thì đó mới là tối ưu.
 
Upvote 0
Vẫn chết đứ đừ, lúc được lúc không có nghĩa là vẫn chưa được triệt để.
Tóm lại nếu nhập ký tự có dấu bằng các bộ gõ thông thường thì đều bị chết khi gõ ký tự có dấu, không riêng gì d hay o. Như bài trên tôi đã nói, nguyên nhân chính là do bị bộ gõ đã tiến hành hook bàn phím trước, nên các sự kiện khác đều phụ thuộc vào chế độ hook của bộ gõ.
về code thì cái nào tôi cũng thấy đúng dù là chr(keycode) hay chrw(keycode) hay chr$(keyascii).. select case, instr(...) thì cũng thế bản chất đều như nhau là kiểm tra mã ký tự xuất hiện.
Theo tôi, vấn đề ở đây là làm thế nào để tắt chế độ nhập TV của bộ gõ, còn nếu ai đó đưa ra được thủ pháp không cần tắt chế độ nhập TV mà vẫn đảm bảo được các tình huống thì đó mới là tối ưu.
Vậy theo tôi, tối ưu nhất có lẽ là nên cho nhập thoải mái... dù gì đến lúc xử lý dử liệu mới cần kiểm tra... Khi ấy sẽ "tính" vẫn chưa muộn!
 
Upvote 0
Vâng, đúng thế, đó là cái cuối cùng ta cần. Khổ nỗi nhiều khi người thiết kế muốn chuẩn hóa ngay nên mới đau đầu. Tôi cũng làm nhiều về cái này nhưng hạn chế được chừng nào thì hạn chế, còn cuối cùng khi động đến dữ liệu đó hoặc khi exit textbox ta mới xét.
 
Upvote 0
Cách làm nào tôi cũng thấy đúng cả nhưng vẫn không triệt để được. Cái của bác cũng vậy mà, bác cứ nhập liên tiếp 2 chữ o hoặc 2 chữ d (hoặc ký tự có dấu bất kỳ) khi TextBox1.SelStart < Len(TextBox1.Text) (nhớ là bảng mã Unicode, kiểu gõ Telext bộ gõ Unikey, bảng mã khác, kiểu gõ khác và bộ gõ khác tôi chưa test.) nó xóa luôn ký tự đứng trước.
Tôi nghĩ củ chuối nằm ở chỗ bị thằng Unikey nó hook trước, vì khi gõ chữ d đầu tiên thì bị đoạn mã trên loại bỏ, đến ký tự thứ 2 thì Unikey quét đến ký tự trước đó và xóa ký tự đó đi để truyền vào ký tự đ để thay thế lúc đó lại bị đoạn mã trên loại bỏ nên xảy ra hiện tượng này.
Nếu tắt chế độ tiếng Việt đi thì Ok luôn.
Cách giải quyết là làm sao tắt được chế độ tiếng Việt đây.

Đau đầu thật, không ngờ lại có tình huống này. Nhập oo hay dd lại ra lệnh xóa ký tự bên trái (<--). Xử lý bằng cách vô hiệu hóa phím <--
Mã:
Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
If KeyCode = 8 Then KeyCode = 0
End Sub
Cách này chỉ đối phó, vì phím <-- rất cần cho việc chỉnh dữ liệu nhập vào textbox
 
Upvote 0
Hì, chỉ tại cái tiếng Việt nhà mình lằng nhằng nên mới thế.
Em cũng nghĩ đến việc loại bỏ <- nhưng như thế thì rất bất tiện.
 
Upvote 0
Hiện tại bây giờ tôi cũng đang phải dùng cách cho nhập thỏa mái rồi bắt lỗi sau. Tuy nhiên tôi vẫn thắc mắc tại sao không có phương án tối ưu, xử lý triệt để vụ này. Lỗi này tuy nhỏ nhưng nó vẫn là lỗi.
 
Upvote 0
Hiện tại bây giờ tôi cũng đang phải dùng cách cho nhập thỏa mái rồi bắt lỗi sau. Tuy nhiên tôi vẫn thắc mắc tại sao không có phương án tối ưu, xử lý triệt để vụ này. Lỗi này tuy nhỏ nhưng nó vẫn là lỗi.
Như đã nói ở trên, lổi này không phải do code của ta khống chế... nó xuất phát từ 1 chương trình khác, cụ thể là Unikey.. vì thế muốn triệt để có lẽ phải liên hệ với... Phạm Kim Long!
Oh.. ho...
(Bạn TuanVNUNI cũng đã từng bị tình trạng tương tự đấy thôi)
 
Upvote 0
Như đã nói ở trên, lổi này không phải do code của ta khống chế... nó xuất phát từ 1 chương trình khác, cụ thể là Unikey.. vì thế muốn triệt để có lẽ phải liên hệ với... Phạm Kim Long!
Oh.. ho...
(Bạn TuanVNUNI cũng đã từng bị tình trạng tương tự đấy thôi)

Đành vậy chứ biết làm sao?????????+-+-+-+
 
Upvote 0
Như đã nói ở trên, lổi này không phải do code của ta khống chế... nó xuất phát từ 1 chương trình khác, cụ thể là Unikey.. vì thế muốn triệt để có lẽ phải liên hệ với... Phạm Kim Long!
Oh.. ho...
(Bạn TuanVNUNI cũng đã từng bị tình trạng tương tự đấy thôi)
Khi gõ phím, Unikey xử lý trước, đến sự kiện KeyDown thì nó đã thành phím khác rồi ! KeyDown, KeyPress không kiểm soát được phím gõ trong trường hợp này.
 
Upvote 0
Tôi nghĩ đến việc dùng sendkeys để bật tắt chế độ tiếng việt nhưng lại khổ nỗi làm sao biết được bộ gõ đang ở chế độ nào để mà bật tắt.
Ví dụ trong bộ gõ ta thiết lập phím chuyển đổi là Alt+z thì ta có thể dùng sendkeys "%z" nhưng nếu bộ gõ đăng tắt mà ta sendkeys thì lại trở thành bật. Dở ở chỗ là bộ gõ lại sử dụng phím bật tắt cùng 1 tổ hợp phím.
 
Upvote 0
Chào các bạn,mình không rành về Excel lắm, mình đang muốn set 1 vùng trong bảng tính của mình chỉ cho phép nhập dữ liệu kiểu ngày thôi, vùng khác chỉ cho nhập số .Mình không biết giải quyết vấn đề này ra sao hết,mong các bạn chỉ mình với .Thank :D
 
Upvote 0
Bạn thử dùng cách này xem sao nhé
PHP:
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
    If Target.Column <> 1 Then Exit Sub 'Giả sử cần kiểm tra trên cột A'
    If Not IsDate(Target.Value) Then
        MsgBox "Giá trị nhập vào không hợp lệ." & vbCrLf & "Hãy nhập lại."
        Range(Target.Address).Select
    End If
End Sub
 
Upvote 0
Chào các bạn,mình không rành về Excel lắm, mình đang muốn set 1 vùng trong bảng tính của mình chỉ cho phép nhập dữ liệu kiểu ngày thôi, vùng khác chỉ cho nhập số .Mình không biết giải quyết vấn đề này ra sao hết,mong các bạn chỉ mình với .Thank :D
Có thể dùng chức năng có sẳn của Excel để làm điều này:
- Quét chọn vùng dử liệu
- Vào menu Data\Validation và làm giống như hình dưới đây

attachment.php
 

File đính kèm

  • untitled.JPG
    untitled.JPG
    49.7 KB · Đọc: 168
Upvote 0
Giá trị của textbox bị hạn chế

Cho em hỏi. (tưởng đơn giản mà ko hiểu sao làm mãi không được)

Giá trị nhập vào ô textbox nếu lớn hơn giá trị của shee1.cells(1,1).value thì thông báo lỗi msgbox "gia tri ban nhap khong chinh xac"

Em viết như sau:
PHP:
if textbox1.value > sheets("sheet1").cells(1,1).value then msgbox "gia tri ban nhap khong chinh xac"
Lạ một cái là em nhập giá trị vào textbox rõ ràng là nhỏ hơn giá trị ở cells(1,1) rồi mà nó vẫn hiện ra msg thông báo lỗi là sao ạ.
Hjc, ai biết xin mách dùm.
 
Upvote 0
Cho em hỏi. (tưởng đơn giản mà ko hiểu sao làm mãi không được)

Giá trị nhập vào ô textbox nếu lớn hơn giá trị của shee1.cells(1,1).value thì thông báo lỗi msgbox "gia tri ban nhap khong chinh xac"

Em viết như sau:
PHP:
if textbox1.value > sheets("sheet1").cells(1,1).value then msgbox "gia tri ban nhap khong chinh xac"
Lạ một cái là em nhập giá trị vào textbox rõ ràng là nhỏ hơn giá trị ở cells(1,1) rồi mà nó vẫn hiện ra msg thông báo lỗi là sao ạ.
Hjc, ai biết xin mách dùm.
Bạn thử sửa như vầy xem:
Mã:
If [COLOR=#ff0000][B]Val(TextBox1.Value)[/B][/COLOR] > Sheets("sheet1").Cells(1, 1).Value Then MsgBox "gia tri ban nhap khong chinh xac"
 
Upvote 0
Ok ,được rồi hihi. Cảm ơn bạn nhiều, bạn giỏi quá. Cho mình hỏi chút được không?
PHP:
Val(textbox1.value)
PHP:
textbox1.value
khác nhau ở chỗ nào :(
 
Lần chỉnh sửa cuối:
Upvote 0
Ok ,được rồi hihi. Cảm ơn bạn nhiều, bạn giỏi quá. Cho mình hỏi chút được không?
PHP:
Val(textbox1.value)
PHP:
textbox1.value
khác nhau ở chỗ nào :(
Cho dù bạn nhập một giá trị số vào Textbox1 thì bản thân Textbox1.Value vẫn là một giá trị kiểu Text. Do vậy, khi bạn so sánh Textbox1.Value với một số thì nó luôn lớn hơn, hay nói cách khác: biểu thức TextBox1.Value > Sheets("sheet1").Cells(1, 1).Value luôn luôn đúng, và Msgbox luôn hiện ra dù bạn nhập số mấy vào Textbox1. Bạn thử nghiệm một chút nhé: Nhập A1=5, B1='1 (có dấu nháy ở trước số 1) và nhập vào C1 công thức =B1>A1. Kết quả là C1 luôn cho giá trị TRUE mặc dù A1 lớn cỡ nào.
Val(Textbox1.Value) sẽ chuyển giá trị (số) Textbox1.Value thành một số thực. Khi đó, phép so sánh trên sẽ chính xác.
 
Upvote 0
Cho dù bạn nhập một giá trị số vào Textbox1 thì bản thân Textbox1.Value vẫn là một giá trị kiểu Text. Do vậy, khi bạn so sánh Textbox1.Value với một số thì nó luôn lớn hơn, hay nói cách khác: biểu thức TextBox1.Value > Sheets("sheet1").Cells(1, 1).Value luôn luôn đúng, và Msgbox luôn hiện ra dù bạn nhập số mấy vào Textbox1. Bạn thử nghiệm một chút nhé: Nhập A1=5, B1='1 (có dấu nháy ở trước số 1) và nhập vào C1 công thức =B1>A1. Kết quả là C1 luôn cho giá trị TRUE mặc dù A1 lớn cỡ nào.
Val(Textbox1.Value) sẽ chuyển giá trị (số) Textbox1.Value thành một số thực. Khi đó, phép so sánh trên sẽ chính xác.

oh, cảm ơn bạn nhiều. Mình hiểu ra vấn đề rồi. Ngoài cách của bạn, còn có thể khắc phục khác như sau:
PHP:
Dim i as integer
   ' dua gia tri cua textbox1 ve dang integer
i = textbox1.value
if i > sheets("sheet1").cells(1,1).value then msgbox "gia tri ban nhap khong chinh xac"  
end if
 
Lần chỉnh sửa cuối:
Upvote 0
Tiện thể cho mình hỏi.
Nếu chỉ cho nhập chữ thôi. Không cho nhập số và bất kì ký tự khác trong Textbox thì làm sao.
 
Upvote 0
Với code này:
PHP:
Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
  Select Case KeyAscii
    Case 48 To 57
    Case 45
      If InStr(1, Me.TextBox1.Text, "-") > 0 Or Me.TextBox1.SelStart > 0 Then KeyAscii = 0
    Case 46
      If InStr(1, Me.TextBox1.Text, ".") > 0 Then KeyAscii = 0
    Case Else
      KeyAscii = 0
  End Select
End Sub
Chạy From lần thứ nhất sẽ bị lổi gõ 2 chử d hoặc 2 chử o
Nhưng nếu đóng Form rồi chạy lại lần nữa thì... hết bị...
Kỳ lạ thật!
----------------
Ủa... mà sao bây giờ test lại không lổi nữa ta?
Các bạn test dùng file đính kèm này với!
chào bác
em muốn hỏi làm thế nào text box nó có chức năng cộng như một ô trên excel . ví dụ: + (=) 20.3+50.7+1000
sau đó text box tự xử lý cho giá trị tổng:1071
em cảm ơn bác
 
Upvote 0
chào bác
em muốn hỏi làm thế nào text box nó có chức năng cộng như một ô trên excel . ví dụ: + (=) 20.3+50.7+1000
sau đó text box tự xử lý cho giá trị tổng:1071
em cảm ơn bác
Lập topic mới đi bạn. Nội dung của bạn không liên quan đến topic này đâu.
 
Upvote 0
Kính chào anh chị em trên diễn đàn!
Tôi có thắc mắc nhờ ace giúp đỡ, về code vba excel định dạng số TexBox.
Tôi muốn khi nhập số trong TexBox sẽ hiển thị dấu phẩy (,) - phân cách hàng nghìn; dấu chấm (.) - phân cách 02 số thập phân; thêm điều kiện nữa là chỉ cho phép nhập số và dấu chấm (.) - phân cách 02 số thập phân.
ví dụ: trong TexBox khi tôi nhập sẽ hiển thị là: 123,456.78
Xin cảm ơn nhiều ạ!
 
Upvote 0

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

Back
Top Bottom