Xin code chuyển từ số nguyên sang số thập phân nếu nhập số nguyên lớn hơn 10 (1 người xem)

Liên hệ QC

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

manhhung0710

Thành viên mới
Tham gia
21/5/10
Bài viết
10
Được thích
1
Xin chào các bạn!
Mình có ý kiến muốn hỏi là khi mình nhập vào số 88 thì tự động chuyển thành 8.8 còn khi mình nhập là 8.8 thì nó vẫn giữ nguyên. (Lưu ý là trên Excel 2003)
Cụ thể là khi mình nhập vào một số nguyên nhỏ hơn hoặc bằng 10 thì nó giữ nguyên còn khi nhập vào số nguyên lớn hơn 10 thì nó tự động chuyển thành số thập phân nhỏ hơn 10.
Mong các bạn chỉ giáo, bạn nào có code chuyển đổi này thì càng tốt
Xin cảm ơn!
 
Bạn tham khảo macro sự kiện sau:
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
 If Not Intersect(Target, Range("X2:X9999")) Then
    If Target.Value > 10 Then
        Target.Value = Target.Value / 10
    End If
 End If
End Sub

(Vùng hiệu nghiệm có ở dòng lệnh đầu của macro)
 
Upvote 0
Bạn tham khảo macro sự kiện sau:
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
 If Not Intersect(Target, Range("X2:X9999")) Then
    If Target.Value > 10 Then
        Target.Value = Target.Value / 10
    End If
 End If
End Sub

(Vùng hiệu nghiệm có ở dòng lệnh đầu của macro)
1. Điều kiện của bác thiếu Is Nothing.
2. Sửa lại như vầy thì sẽ có tác dụng "lớn" hơn, đáp ứng cả trường hợp Copy nơi khác dán vào:
[GPECODE=vb]Private Sub Worksheet_Change(ByVal Target As Range)
Dim Cll As Range
If Not Intersect(Target, Range("X2:X9999")) Is Nothing Then
For Each Cll In Intersect(Target, Range("X2:X9999"))
If Cll.Value > 10 Then Cll.Value = Cll.Value / 10
Next
End If
End Sub[/GPECODE]
3. Cũng nên nói thêm, trong đa số trường hợp có tác động đến giá trị của Target, ta thường có câu lệnh Application.EnableEvents = False ở đầu và Application.EnableEvents = True ở cuối để đảm bảo những câu lệnh trong code chỉ hoạt động 1 lần, tránh hiện tượng code lặp vô tận và tràn bộ nhớ. Tuy nhiên với trường hợp này thì không cần dùng 2 câu lệnh trên vì nó chắc chắn đã có điểm dừng (khi Target.Value <= 10)

Gửi chủ topic: Lần sau khi mở 1 topic, bạn nên tránh những từ tiếng Anh "nửa mùa" kiểu HELF ấy đi vì có thể chính những từ này sẽ đưa topic của bạn vào hậu viên đấy. Xin đọc lại nội quy diễn đàn trước khi tạo một topic mới.
 
Lần chỉnh sửa cuối:
Upvote 0
...
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
    Dim Cll As Range
    If Not Intersect(Target, Range("X2:X9999")) Is Nothing Then
        For Each Cll In Intersect(Target, Range("X2:X9999"))
            [COLOR=#ff0000][B]If Cll.Value > 10 Then Cll.Value = Cll.Value / 10[/B][/COLOR]
        Next
    End If
End Sub
..i.

Tôi chưa thử (tôi ngại thử code event trigger lắm), nhưng nhìn code có vẻ không ổn.

Điều kiện của chủ thớt có bao mệnh đề "nhập vào số nguyên lớn hơn 10". Code không có chỗ nào xét xem số nguyên nay số thập phân cả.

Theo code này, nếu nhập 88888.8 thì sẽ bị đổi thành 8.88888

Code trên, không rõ vô tình hay cố ý, nhưng vì không có phần điều khiển "Application.EnableEvents" cho nên nó sẽ chạy đến bao giờ số nhỏ hơn hoặc bằng 10 mơi thoát ra.

@chủ thớt: bạn cũng có nói "đổi thành số thập phân nhỏ hơn 10". Cái này rất là kỳ quặc. Tức là nếu nhập 100 thì đổi thành 1 (?). Và điều kiện của banj không đả dộng đên số âm. Khi nói chuyện về độ lớn/nhỏ của dữ liệu, bạn luôn luôn phải để ý đến những trường hợp này.
 
Lần chỉnh sửa cuối:
Upvote 0
Tôi chưa thử (tôi ngại thử code event trigger lắm), nhưng nhìn code có vẻ không ổn.

Điều kiện của chủ thớt có bao mệnh đề "nhập vào số nguyên lớn hơn 10". Code không có chỗ nào xét xem số nguyên nay số thập phân cả.

Theo code này, nếu nhập 88.8 thì sẽ bị đổi thành 8.88

(*) chủ thớt cũng có nói "đổi thành số thập phân nhỏ hơn 10". Cái này rất là kỳ quặc. Tức là nếu nhập 100 thì đổi thành 1 (?).
Thừa nhận với anh code trên còn thiếu sót ở vấn đề kiểm tra dữ liệu nhập vào, ngoài trường hợp anh chỉ ra thì nếu dữ liệu kiểu text là code "tèo".

Còn vấn đề "đổi thành số thập phân nhỏ hơn 10" thì có lẽ tác giả gõ thiếu, đúng ra phải là "đổi thành số thập phân nhỏ hơn hoặc bằng 10". Đây là một bài toán khá hay gặp trong giáo dục, cụ thể là vấn đề nhập điểm, chẳng hạn thay vì nhập 6.5 thì chỉ cần nhập 65, 4.75 thì nhập 475,...
 
Upvote 0
1. Điều kiện của bác thiếu Is Nothing.
2. Sửa lại như vầy thì sẽ có tác dụng "lớn" hơn, đáp ứng cả trường hợp Copy nơi khác dán vào:
[GPECODE=vb]Private Sub Worksheet_Change(ByVal Target As Range)
Dim Cll As Range
If Not Intersect(Target, Range("X2:X9999")) Is Nothing Then
For Each Cll In Intersect(Target, Range("X2:X9999"))
If Cll.Value > 10 Then Cll.Value = Cll.Value / 10
Next
End If
End Sub[/GPECODE]
3. Cũng nên nói thêm, trong đa số trường hợp có tác động đến giá trị của Target, ta thường có câu lệnh Application.EnableEvents = False ở đầu và Application.EnableEvents = True ở cuối để đảm bảo những câu lệnh trong code chỉ hoạt động 1 lần, tránh hiện tượng code lặp vô tận và tràn bộ nhớ. Tuy nhiên với trường hợp này thì không cần dùng 2 câu lệnh trên vì nó chắc chắn đã có điểm dừng (khi Target.Value <= 10)

Gửi chủ topic: Lần sau khi mở 1 topic, bạn nên tránh những từ tiếng Anh "nửa mùa" kiểu HELF ấy đi vì có thể chính những từ này sẽ đưa topic của bạn vào hậu viên đấy. Xin đọc lại nội quy diễn đàn trước khi tạo một topic mới.
Em xin phép chen ngang 1 chút ạ:
Em muốn hỏi anh 1 chút đó là trong code của anh nếu em lại thành:
Option ExplicitPrivate Sub Worksheet_Change(ByVal Target As Range)
Dim Cll As Range
If Intersect(Target, Range("A1:IV65500")) <> "" Then
For Each Cll In Intersect(Target, Range("A1:IV65500"))
If Cll.Value > 10 Then Cll.Value = Cll.Value / 10
Next
End If
End Sub
thì code vẫn hoạt động đúng?
Vậy em xin hỏi dòng lệnh:If Not Intersect(Target, Range("A1:IV65500")) is Nothing và dòng lệnh
Intersect(Target, Range("A1:IV65500")) <> ""
về tác dụng có giống nhau không ạ?
Em vẫn còn mù mờ chỗ này lắm, mong anh chị giải thích.
 
Upvote 0
1. Điều kiện của bác thiếu Is Nothing.
.. ..

Mình nói là tham khảo mà N. Phúc!

Giờ trên diễn đàn nhiều cái để tham khảo lắm & mình chỉ đưa lên thêm 1 ví dụ để chủ topic tham khảo mà thôi!

Ai rập khuôn theo tài liệu tham khảo bị hư cần ráng (rứng) . . . thêm để đúng!

Vậy em xin hỏi dòng lệnh:If Not Intersect(Target, Range("A1:IV65500")) is Nothing và dòng lệnh
Intersect(Target, Range("A1:IV65500")) <> ""
về tác dụng có giống nhau không ạ?
Em vẫn còn mù mờ chỗ này lắm, mong anh chị giải thích.

Hãy tìm fương thức Intersect() có trên diễn đàn & đọc trước đi bạn!
 
Lần chỉnh sửa cuối:
Upvote 0
Thừa nhận với anh code trên còn thiếu sót ở vấn đề kiểm tra dữ liệu nhập vào, ngoài trường hợp anh chỉ ra thì nếu dữ liệu kiểu text là code "tèo".

Còn vấn đề "đổi thành số thập phân nhỏ hơn 10" thì có lẽ tác giả gõ thiếu, đúng ra phải là "đổi thành số thập phân nhỏ hơn hoặc bằng 10". Đây là một bài toán khá hay gặp trong giáo dục, cụ thể là vấn đề nhập điểm, chẳng hạn thay vì nhập 6.5 thì chỉ cần nhập 65, 4.75 thì nhập 475,...
Chính xác là chủ topic muốn vận dụng code này vào việc nhập điểm. Tuy nhiên chủ Topic chưa nói rõ điều kiện của dữ liệu vào và dữ liệu ra:
Dữ liệu vào phải là:
+ Số nguyên lớn hơn 0 và nhỏ hơn hoặc bằng 100.
+ Số thập phân lớn hơn hoặc bằng 0 và nhỏ hoặc bằng 100 và chỉ có tối đa 2 chữ số ở phần thập phân thôi.
 
Upvote 0
Em xin phép chen ngang 1 chút ạ:
Em muốn hỏi anh 1 chút đó là trong code của anh nếu em lại thành:

thì code vẫn hoạt động đúng?
Vậy em xin hỏi dòng lệnh:If Not Intersect(Target, Range("A1:IV65500")) is Nothing và dòng lệnh
Intersect(Target, Range("A1:IV65500")) <> ""
về tác dụng có giống nhau không ạ?
Em vẫn còn mù mờ chỗ này lắm, mong anh chị giải thích.

Thì cứ dịch ra tiếng việt 2 câu lệnh trên thử xem, rồi ngâm cứu.

Lệnh Intersect(vung giao nhau, vung giao nhau)
 
Lần chỉnh sửa cuối:
Upvote 0
Em xin phép chen ngang 1 chút ạ:
Em muốn hỏi anh 1 chút đó là trong code của anh nếu em lại thành:

thì code vẫn hoạt động đúng?
Vậy em xin hỏi dòng lệnh:If Not Intersect(Target, Range("A1:IV65500")) is Nothing và dòng lệnh
Intersect(Target, Range("A1:IV65500")) <> ""
về tác dụng có giống nhau không ạ?
Em vẫn còn mù mờ chỗ này lắm, mong anh chị giải thích.
Bạn thử nhập dữ liệu trên nhiều ô một lúc hoặc copy một vùng nơi khác dán vào (để cho Target.Count > 1) sẽ thấy cách bạn làm không ổn đâu.
 
Upvote 0
Code trên, không rõ vô tình hay cố ý, nhưng vì không có phần điều khiển "Application.EnableEvents" cho nên nó sẽ chạy đến bao giờ số nhỏ hơn hoặc bằng 10 mơi thoát ra.
Đây là cố ý anh ạ, lý do thì đã được giải thích ở ý 3, bài #3. Không biết có nên nói là "áp đặt" hay không, hay do "bệnh nghề nghiệp" nhưng khi đọc yêu cầu này, em nghĩ ngay đến bài toán nhập điểm, cũng có thể là không phù hợp với nhu cầu thực tế của tác giả, đành phải chờ tác giả lên tiếng thôi.
 
Upvote 0
Đúng như anh nói, em thử cop dữ liệu từ vùng khác vào thì "Tèo" luôn anh ạ.
 
Upvote 0
Đúng như anh nói, em thử cop dữ liệu từ vùng khác vào thì "Tèo" luôn anh ạ.
Thực ra, điều này không có gì khó hiểu. Khi bạn viết điều kiện Intersect(Target, Range("A1:IV65500")) <> "" thì thực chất nó là điều kiện Intersect(Target, Range("A1:IV65500")).Value <> "", do đó sẽ phát sinh ra lỗi nếu vùng Intersect(Target, Range("A1:IV65500")) có nhiều hơn 1 ô.
 
Upvote 0
Đây là cố ý anh ạ, lý do thì đã được giải thích ở ý 3, bài #3. Không biết có nên nói là "áp đặt" hay không, hay do "bệnh nghề nghiệp" nhưng khi đọc yêu cầu này, em nghĩ ngay đến bài toán nhập điểm, cũng có thể là không phù hợp với nhu cầu thực tế của tác giả, đành phải chờ tác giả lên tiếng thôi.

Nếu vậy thì theo lập trình, đây là bài toán rút (hoặc nới) độ lớn của số. Tức là đẩy hàng đơn vị lớn nhất của số đến một vị trí khác - đẩy về bên trái thì là nới lớn hơn và đẩy về bên phải là rút nhỏ lại.

Tuỳ theo ngôn ngữ mà bài toán này được thực hiện khác nhau. Theo VBA thì có lẽ chỉ có con toán chia/nhân dần cho 10 là tiện nhất (có thể có cách khác nhưng tôi chưa nghĩ ra)

do while cell.value > 10
cell.value = cell.value / 10
loop

Nếu dùng worksheetfunction (không dùng VBA) thì vòng lặp là cái khó thực hiện. Dùng con toán text và len để định độ lớn tiện hơn:
=IF(A1>10,A1/10^(LEN(TEXT(A1,"######"))-1),A1)
 
Upvote 0
Trước hết mình thành thật cảm ơn các bạn đã giúp đỡ mình. Đúng là mình muốn áp dụng code này vào việc nhập điểm cho tiện và thông qua sự giúp đỡ của các bạn thì mình thấy là nó đã thành công.Thành thật cảm ơn các bạn.
Tiện thể mong các bạn chỉ giúp mình thêm một chút nữa là khi nhập giá trị vào thì mình muốn mặc định tối đa số kí tự vào trong ô tính.
Cụ thể như nhập vào tối đa 4 ký tự (bao gồm cả dấu thập phân) thì nó sẽ tự động xuống dòng luôn không cần phải nhấn phím enter nữa.
Mong các bạn giúp đỡ mình nhé đừng cho mình là được voi đòi tiên.
Một lần nữa thành thật cảm ơn sự giúp đỡ của các bạn và mong các bạn giúp đỡ mình thêm
 
Upvote 0

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

Back
Top Bottom