Các bác cho em xin code VBA nhập điểm thi 2 số mà nó tự thêm dấu phẩy vào giữa và nhảy dòng. (2 người xem)

Liên hệ QC

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

jacky_police

Thành viên chính thức
Tham gia
30/7/07
Bài viết
54
Được thích
4
Ai có code VBA để khi nhập điểm thi 2 số nó tự thêm dấu phẩy và giữa và tự xuống dòng cho em xin với.
Em xin cảm ơn!
 
Nếu nhập con số 10 thì bạn muốn nó là 1,0 hay 10 đây?

Chuyện này có khi lại giống với ca dao: 'Bà già đi chợ cầu Đông' không chừng
 
Ví dụ: Khi điểm hs là 1 thì nhập 1 trên màn hình hiển thị là 1,0. Nếu điểm hs là 5,5 thì nhập 55, màn hình hiển thị là 5,5. Tương tự với số lẻ nhập 2 số màn hình hiển thị dấu phẩy ở giữa. Nếu điểm là 10 thì nhập 10 và màn hình hiển thị là 10.
 
Ví dụ: Khi điểm hs là 1 thì nhập 1 trên màn hình hiển thị là 1,0. Nếu điểm hs là 5,5 thì nhập 55, màn hình hiển thị là 5,5. Tương tự với số lẻ nhập 2 số màn hình hiển thị dấu phẩy ở giữa. Nếu điểm là 10 thì nhập 10 và màn hình hiển thị là 10.
Thứ nhất là không chịu khó tạo file.
Thứ hai là viết tắt trong bài viết nên thứ ba là tạm biệt bạn.
 
Đối với bạn thì đương nhiên, đối với Excel thì không, đối với người biết sử dụng excel cũng là không. Gõ 10 và 55 đối với excel là như nhau ở chỗ có 2 con số, làm sao phân biệt khi vầy khi khác.

Điểm thi hiện tại chỉ cao nhất là 10, nếu gõ số lớn hơn 10 thì nó sẽ được hiểu là nhập số có phẩy.
 
Phân biệt bằng được dùng hàm len() right().còn VBA cũng được,Nhưng bài này làm bằng VBA!
Không hài lòng ở chỗ

1.Bài này chả khó khăn gì lập cái bảng tính để viết code,điểm thì chắc chắn chỉ có 2 chứ số tính đến 99 đi,cứ 2 chữ số khác 10 20 30 40 .. thì thêm dấu phẩy.lớn hơn 100 bỏ qua thống báo lỗi
2.Vì sao lại yêu cầu file mẫu của tác giả:
2.1. Thứ nhất đã dùng code thì nó là lập trình sẵn cái gì tự động cũng cần có giới hạn,phải xem vùng nào của bạn cần chạy code vùng nào không tránh sửa đi sửa lại nhiều lần
2.2.Còn tùy vào máy bạn cài nữa,như máy tôi cài dấu phẩy nó là dạng text ,còn dấu chấm mới là dạng số
2.3.Với các số bạn nhập như 9 điểm mà bạn nhập 9 không nói bạn nhập 90 thì nó sẽ là 9 hay giữ nguyên 90 (theo tôi nghĩ sẽ bảo là 9)
 
Điểm thi hiện tại chỉ cao nhất là 10, nếu gõ số lớn hơn 10 thì nó sẽ được hiểu là nhập số có phẩy.
Bài 2 của bác @SA_DQ và bài 8 của tôi dựa trên yêu cầu bài 1: "nhập điểm thi 2 số nó tự thêm dấu phẩy vào giữa", và 10 là "2 số"
Điểm thi tối đa là 10 thì ai cũng biết chứ, nhưng đưa ra yêu cầu phải rõ ràng và tự thấy trước những trường hợp ngoại lệ. Nếu cứ theo yêu cầu "tự thêm dấu phẩy ở giữa" mà làm thì cả ngàn người làm được, sau đó mới "ý quên, còn trường hợp này nữa". Và chưa chắc là "ý quên" 1 lần là xong.
 
2.2.Còn tùy vào máy bạn cài nữa,như máy tôi cài dấu phẩy nó là dạng text ,còn dấu chấm mới là dạng số
2.3.Với các số bạn nhập như 9 điểm mà bạn nhập 9 không nói bạn nhập 90 thì nó sẽ là 9 hay giữ nguyên 90 (theo tôi nghĩ sẽ bảo là 9)
2.2: Viết bằng VBA không cần biết máy cài thế nào, vì nếu len =2 thì chia 10
2.3: Nếu làm đúng yêu cầu bài 1 thì khi gõ 90 chèn dấu phẩy vào giữa thành 9,0 hoặc chia 10 cũng ra 9.
 
Điểm thi hiện tại chỉ cao nhất là 10, nếu gõ số lớn hơn 10 thì nó sẽ được hiểu là nhập số có phẩy.
Bài #2 người ta hỏi nếu gõ đúng 10 thì là 10 điểm hay 1 điểm?
Bài #3 trả lời là 10.

Rốt cuộc, gõ 10 thì là 10 điểm, gõ 11 thì là 1 phẩy 1 điểm.
Ở đời có hệ thống 11 nhỏ hơn 10.
 
Code đại khái như sau:
(Bạn nào đã viết qua ứng dụng cho bên giáo dục, các giáo viên nhập điểm thi sẽ có thủ tục để xử lý nhập liệu kiểu này.)

Mã:
Sub NhapDiem(tgtCell As Range)
   Select Case Len(tgtCell.Value)
       Case 1
              tgtCell.Value = tgtCell.Value
       Case 2
           If tgtCell.Value = 10 Then
              tgtCell.Value = tgtCell.Value
           Else
              tgtCell.Value = tgtCell.Value / 10
           End If
       Case 3
              tgtCell.Value = tgtCell.Value / 100
       Case Else
              MsgBox "So khong duoc lon hon 3 chu so"
   End Select
End Sub
Bài đã được tự động gộp:

Bài #2 người ta hỏi nếu gõ đúng 10 thì là 10 điểm hay 1 điểm?

Gõ 10 thì nhâp vô là 10 bác.
 
Lần chỉnh sửa cuối:
Gõ 10 thì nhâp vô là 10 bác.
Giống như ở bài 3 tác giả trả lời bài 2. Trong khi bài 1 yêu cầu cứ 2 số thì chèn giữa bằng 1 dấu phẩy. Và cách trả lời của tác giả là "đương nhiên phải hiểu" mặc dù người ta đang hỏi để giúp.
 
2.2: Viết bằng VBA không cần biết máy cài thế nào, vì nếu len =2 thì chia 10
2.3: Nếu làm đúng yêu cầu bài 1 thì khi gõ 90 chèn dấu phẩy vào giữa thành 9,0 hoặc chia 10 cũng ra 9.
Cảm ơn bác.Cũng là một cách nhưng dù sao cũng phải tách hay số ra để thêm dấu "," ở giữa .ví dụ như nhập 55 thì thêm dấu phẩy ở giữa là 5,5 .vậy dùng 2 biến tách những số có hai chữ số,thì số có hai chữ số khác 10 và số cuối bằng 0 thì lấy luôn số đầu cũng được Bác
 
Cảm ơn bác.Cũng là một cách nhưng dù sao cũng phải tách hay số ra để thêm dấu "," ở giữa .ví dụ như nhập 55 thì thêm dấu phẩy ở giữa là 5,5 .vậy dùng 2 biến tách những số có hai chữ số,thì số có hai chữ số khác 10 và số cuối bằng 0 thì lấy luôn số đầu cũng được Bác
Đọc code bài 14 xem, có ai lại tách chuỗi rồi nối chuỗi, rồi kiểm tra dấu thập phân của hệ thống cho nó nhiêu khê ra.
 
Giống như ở bài 3 tác giả trả lời bài 2. Trong khi bài 1 yêu cầu cứ 2 số thì chèn giữa bằng 1 dấu phẩy. Và cách trả lời của tác giả là "đương nhiên phải hiểu" mặc dù người ta đang hỏi để giúp.

Đồng ý với bác điểm này. Lỗi của người hỏi là cứ tưởng ai cũng ở cùng lĩnh vực nên diễn giải không chi tiết. Cũng may tôi đã gặp trường hơp này rồi nên hiểu ý đồ thôi.
 
Bài này không phải là khó,và tôi biết bác SA_DQ biết làm,nhưng bạn trả lời vầy người ta phật ý không muốn tiếp tục bài chăng?

/(hông mình chưa từng làm & sẽ không làm, dù để giúp/hại người nhập liệu: CSDL sẽ nhanh chóng thành đống rác!

Câu sau của ngạn ngữ là: Lợi thì có lợi nhưng răng không còn!
 
có ai lại tách chuỗi rồi nối chuỗi,
ý em nói là làm theo cách tách chuỗi,tại bác có thành kiến cứ hay bắt bẻ em thôi
code của em,làm như bác nói
Mã:
Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)
Dim Rng As Range, WorkRng As Range

Set WorkRng = Intersect(Application.ActiveSheet.Range("E1:E99"), Target)
If WorkRng Is Nothing Then Exit Sub
If Len(Target.Value) > 2 Then MsgBox "So ban vua nhap chua dung": Target.Value = "": Target.Offset(-1, 0).Select: Exit Sub
    Application.EnableEvents = False
    Application.ScreenUpdating = False
        For Each Rng In WorkRng
            If Not VBA.IsEmpty(Rng.Value) And Len(Rng.Value) = 2 And Rng.Value <> 10 Then
                               Rng.Value = Rng.Value / 10
            End If
        Next
    Application.EnableEvents = True
    Application.ScreenUpdating = True
End Sub
 
Nên chăng ta làm cái Form với 20 nút lớn nhỏ khác nhau; Khi đó muốn nhập anh nào thì bấm vô nút tương ứng; Khỏi gõ bàn phím luôn!
 
Code đại khái như sau:
(Bạn nào đã viết qua ứng dụng cho bên giáo dục, các giáo viên nhập điểm thi sẽ có thủ tục để xử lý nhập liệu kiểu này.)

Mã:
Sub NhapDiem(tgtCell As Range)
   Select Case Len(tgtCell.Value)
       Case 1
              tgtCell.Value = tgtCell.Value
       Case 2
           If tgtCell.Value = 10 Then
              tgtCell.Value = tgtCell.Value
           Else
              tgtCell.Value = tgtCell.Value / 10
           End If
       Case 3
              tgtCell.Value = tgtCell.Value / 100
       Case Else
              MsgBox "So khong duoc lon hon 3 chu so"
   End Select
End Sub
Bài đã được tự động gộp:



Gõ 10 thì nhâp vô là 10 bác.
Bài này nếu nhập vào số nhỏ hơn 1 thì làm sao nhỉ bạn.Ví dụ được 0.5 Điểm.
 
Bài này nếu nhập vào số nhỏ hơn 1 thì làm sao nhỉ bạn.Ví dụ được 0.5 Điểm.

Code đại khái thôi mà.
Vậy để hỏi chủ thớt xem khi 0.5 điểm thì giáo viên cho thành 1 luôn không rồi tính tiếp.

Thớt mà nhập a, b, c thì tèo thật

Nhập a,b c thì phải bẫy lỗi nhập liệu trước khi xử lý số.
 
Với điểm nhỏ hơn 1 (0.4 điểm) thì sao?
Gõ nhầm a,b,c thì bồ tèo :p
Bài này nếu nhập vào số nhỏ hơn 1 thì làm sao nhỉ bạn.Ví dụ được 0.5 Điểm.

Đúng ra thì có thể nhập 04, 05...

Nhưng tôi đã nêu lên ở bài trước, cái kiểu "lười biếng gõ thêm một vài phím" này chỉ là mời mọc lỗi gõ sai đơn vị thôi.

Nguyên tắc nhập liệu (*) là phải chuẩn cách gõ. Muốn gõ "phần mười" thì tất cả đều phải phần mười (chia cho 10).
0,1 gõ 01.
1 gõ 10
9,5 gõ 95
10 gõ 100

(*) tôi làm việc với giao diện gõ số mấy chục năm rồi. Giao diện của chúng tôi thiết kế nhiều loại gõ theo lô (batch), một phút gõ vài chục số, mỗi số 2-14 chữ số (trung bình 7 chữ số).
Thực sự mỗi lần đọc mấy câu "gõ cho nhanh..." tôi thầm bĩu môi: giới trẻ quý vị chưa biết "gõ nhanh" có nghĩa là gì đâu.
 
Đọc lại yêu cầu ở bài 1 thì còn có nội dung "tự xuống dòng". (nhập điểm thi 2 số nó tự thêm dấu phẩy vào giữa và tự xuống dòng)
Nghĩa là gõ không cần enter. Khi đang gõ
- Gõ được 1 ký số thì chưa làm gì
- Gõ được 2 ký số thì "chèn dấu phẩy vào giữa", không cần gõ nữa và cũng không cần enter, phải tự xuống dòng.
- Không có cơ hội gõ 3 ký số vì mới 2 số đã nhảy ra khỏi ô.
Do đó những code nào viết dựa trên sự kiện Worksheet Change là không đạt yêu cầu, vì sự kiện sheet change chỉ xảy ra sau khi nhấn enter hoặc nhấn tab, hoặc nhấn các phím mũi tên, hoặc click chuột vào ô khác.
Giả sử vẫn lập trình được cho yêu cầu trên, thì cũng không nhanh hơn được bao nhiêu vì:
- Các số điểm tròn vẫn phải gõ 2 con 10, 20, 30, ... Nếu chỉ gõ 1 con vẫn phải nhấn enter
- Số nhỏ hơn 1 cũng phải gõ 2 con 03, 05, 08, so với không lập trình cũng không bớt được lần nhấn nào.
- 10 điểm không có cửa gõ 100, gõ 10 bị coi là 1.0.
Tóm lại yêu cầu này: một là không khả thi, 2 là hiệu quả không cao, 3 là hậu quả do sai sót còn lớn hơn hiệu quả mang lại.
 
Đọc lại yêu cầu ở bài 1 thì còn có nội dung "tự xuống dòng". (nhập điểm thi 2 số nó tự thêm dấu phẩy vào giữa và tự xuống dòng)
Nghĩa là gõ không cần enter. Khi đang gõ
- Gõ được 1 ký số thì chưa làm gì
- Gõ được 2 ký số thì "chèn dấu phẩy vào giữa", không cần gõ nữa và cũng không cần enter, phải tự xuống dòng.
- Không có cơ hội gõ 3 ký số vì mới 2 số đã nhảy ra khỏi ô.
Do đó những code nào viết dựa trên sự kiện Worksheet Change là không đạt yêu cầu, vì sự kiện sheet change chỉ xảy ra sau khi nhấn enter hoặc nhấn tab, hoặc nhấn các phím mũi tên, hoặc click chuột vào ô khác.
Giả sử vẫn lập trình được cho yêu cầu trên, thì cũng không nhanh hơn được bao nhiêu vì:
- Các số điểm tròn vẫn phải gõ 2 con 10, 20, 30, ... Nếu chỉ gõ 1 con vẫn phải nhấn enter
- Số nhỏ hơn 1 cũng phải gõ 2 con 03, 05, 08, so với không lập trình cũng không bớt được lần nhấn nào.
- 10 điểm không có cửa gõ 100, gõ 10 bị coi là 1.0.
Tóm lại yêu cầu này: một là không khả thi, 2 là hiệu quả không cao, 3 là hậu quả do sai sót còn lớn hơn hiệu quả mang lại.
Đại loại là tác giả có muốn làm nhanh ( chưa nói tới lười nha) nhưng không tính được trường hợp xẩy ra để bẫy lỗi trong code và chưa tính đến sai sót.Và hậu quả thì cũng chưa biết luôn
 
Đại loại là tác giả có muốn làm nhanh ( chưa nói tới lười nha) nhưng không tính được trường hợp xẩy ra để bẫy lỗi trong code và chưa tính đến sai sót.Và hậu quả thì cũng chưa biết luôn
.
Thực tế thì lúc lên GPE người ta rất chủ quan và đã có thành kiến. Muốn làm như ý mình là như ý mình, không bao giờ nghe lời người khác phân tích lợi hại.
Code thì có người code giùm. Gõ dữ liệu sai thì lỗi do người gõ. Người thiết kế đâu có mất mát gì.

Khi tôi bàn, phân tích lợi hại là tôi bàn cho các bạn khác,. Trước khi nhắm mắt cóp code/công thức về dùng thì cũng nên biết rõ rằng giải pháp của thớt chỉ áp dụng được cho thớt. Làm theo giống vậy thì nát bét có ngày.
 

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

Back
Top Bottom