Định dạng số thập phân cho các cột (1 người xem)

Liên hệ QC

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

a.nguoidensau

Thành viên hoạt động
Tham gia
12/4/12
Bài viết
138
Được thích
28
Xin chào các ACE trên diễn đàn!
Tôi có 1 File số liệu gồm 3 cột cần định dạng thành số thập phân( sau số "." 2 số). Tôi đã tạo được 1 Macro định dạng, vấn đề ở chỗ nếu bấm vào nút định dạng 1 lần thì kết quả đúng, nhưng chẳng may tôi lỡ bấm lần 2, lần 3 thì kết quả sai.
Vậy tôi nhờ mọi người giúp tôi có cách nào( thêm dòng Code nào đó chẳng hạn) để dù có bấm lần 2, lần 3 thì vẫn cho kết quả đúng.
Xin cảm ơn
 

File đính kèm

Lần chỉnh sửa cuối:
Xin chào các ACE trên diễn đàn!
Tôi có 1 File số liệu gồm 3 cột cần định dạng thành số thập phân( sau số "." 2 số). Tôi đã tạo được 1 Macro định dạng, vấn đề ở chỗ nếu bấm vào nút định dạng 1 lần thì kết quả đúng, nhưng chẳng may tôi lỡ bấm lần 2, lần 3 thì kết quả sai.
Vậy tôi nhờ mọi người giúp tôi có cách nào( thêm dòng Code nào đó chẳng hạn) để dù có bấm lần 2, lần 3 thì vẫn cho kết quả đúng.
Xin cảm ơn
Bạn thêm một biến a trong module kiểm tra xem đã chạy thủ tục chưa. Trong thủ tục sẽ kiểm tra nếu a=true thì không làm gì, nếu a= false thì chạy thủ tục rồi gán a=true. Lần bấm nút sau sẽ không có gì xảy ra nữa.
Dim a As BooleanSub dinhdang1()
If a Then Exit Sub
a = True
Range("H1").Copy
Range("A1:A10,C1:C10,D1:D10").Select
With Selection
.PasteSpecial Paste:=xlPasteAll, Operation:=xlDivide
.NumberFormat = "#,##0.00"
End With
End Sub
 
Upvote 0
Tham khảo thêm cách dùng InputBox sẽ linh động hơn việc đưa số vào tính, phép tính cần dùng và chọn vùng để tính + định dạng:
Mã:
Sub dinhdang1()
Dim xAdd, Fx, Rng, Cel As Range
xAdd = Application.InputBox("Nh" & ChrW(7853) & "p s" & ChrW(7889) & _
    " c" & ChrW(7847) & "n tính:", Type:=1)
Fx = Application.InputBox("Phép tính:" & vbLf & "(+ - * /)", Type:=2)
Set Rng = Application.InputBox("Chon vùng:", Type:=8)
For Each Cel In Rng
    If IsNumeric(Cel) Then
        Cel = Evaluate(Cel & Fx & xAdd)
        Cel.NumberFormat = "#,##0.00"
    End If
Next Cel
End Sub
 

File đính kèm

Upvote 0
Bạn thêm một biến a trong module kiểm tra xem đã chạy thủ tục chưa. Trong thủ tục sẽ kiểm tra nếu a=true thì không làm gì, nếu a= false thì chạy thủ tục rồi gán a=true. Lần bấm nút sau sẽ không có gì xảy ra nữa.
Dim a As BooleanSub dinhdang1()
If a Then Exit Sub
a = True
Range("H1").Copy
Range("A1:A10,C1:C10,D1:D10").Select
With Selection
.PasteSpecial Paste:=xlPasteAll, Operation:=xlDivide
.NumberFormat = "#,##0.00"
End With
End Sub

Nếu chỉ là công việc của Sub mà dùng biến của module là giải pháp sai.
Công việc của sub thì phải dùng biến của sub.
Trong trường hợp này, nếu muốn dùng một ký hiệu gì đó để xem sub đã được chạy chưa thì dùng biến tĩnh.

Sub dinhdang1()
Static a As Boolean
If a Then Exit Sub
a = True
.
.
 
Upvote 0
Xin chào các ACE trên diễn đàn!
Tôi có 1 File số liệu gồm 3 cột cần định dạng thành số thập phân( sau số "." 2 số). Tôi đã tạo được 1 Macro định dạng, vấn đề ở chỗ nếu bấm vào nút định dạng 1 lần thì kết quả đúng, nhưng chẳng may tôi lỡ bấm lần 2, lần 3 thì kết quả sai.
Vậy tôi nhờ mọi người giúp tôi có cách nào( thêm dòng Code nào đó chẳng hạn) để dù có bấm lần 2, lần 3 thì vẫn cho kết quả đúng.
Xin cảm ơn

Do mỗi lần bấm thì lại thực hiện 1 lần chia cho 100 (Địa chỉ H1)

Bạn nên thêm một chút:
Mã:
Sub dinhdang1()    
    Range("H1").Copy
    Range("A1:A10,C1:C10,D1:D10").Select
    With Selection
        .PasteSpecial Paste:=xlPasteAll, Operation:=xlDivide
        .NumberFormat = "#,##0.00"
    End With
    [COLOR=#ff0000][H1].Value = 1[/COLOR]
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Xin gửi lời cảm ơn tới tất cả các thành viên đã nhiệt tình giúp đỡ tôi.
 
Lần chỉnh sửa cuối:
Upvote 0
Tôi chỉ mách cho cách sử dụng phạm vi của biến. Còn vấn đề của bạn thì tôi mù tịt.
 
Upvote 0
Tôi chỉ mách cho cách sử dụng phạm vi của biến. Còn vấn đề của bạn thì tôi mù tịt.
Chào bác VetMini!
Thực ra số liệu của tôi gồm nhiều côt nằm xen kẽ với các cột dữ liệu khác, không phải 3 cột, số liệu thay đổi hàng tháng. Giải pháp mà bạn dvu58 đưa ra cũng chỉ sử dụng được 1 lần, vì giá trị H1=100( phải cố định) cho các lần định dạng sau. Trong khi đó 100 ----> 1, lại không ổn rồi.
Tóm lại là vẫn chưa có giải pháp nào hiệu quả cho trường hợp này bác VetMini ah.
 
Upvote 0
Chào bác VetMini!
Thực ra số liệu của tôi gồm nhiều côt nằm xen kẽ với các cột dữ liệu khác, không phải 3 cột, số liệu thay đổi hàng tháng. Giải pháp mà bạn dvu58 đưa ra cũng chỉ sử dụng được 1 lần, vì giá trị H1=100( phải cố định) cho các lần định dạng sau. Trong khi đó 100 ----> 1, lại không ổn rồi.
Tóm lại là vẫn chưa có giải pháp nào hiệu quả cho trường hợp này bác VetMini ah.
Nếu chưa có giải pháp thì tham khảo thêm giải pháp này:
Mã:
Sub dinhdang1()
    Range("I1") = Range("I1") + 1
    If [B][COLOR=#ff0000]Range("I1") <= 1[/COLOR][/B] Then
        Range("H1").Copy
        Range("A1:A10,C1:C10,D1:D10").Select
        With Selection
            .PasteSpecial Paste:=xlPasteAll, Operation:=xlDivide
            .NumberFormat = "#,##0.00"
        End With
    End If
End Sub
Muốn bấm mấy lần thì cài điều kiện ở chỗ tô màu đỏ. Khi nào muốn định dạng nữa thì xóa I1 hoặc cho I1 = 0.
 
Upvote 0
Cách dễ nhất là dùng ô H1 làm trị số điểu khiển.
Trong hàm định dạng, bạn xét, hễ H1 = 100 thì làm bình thường. Làm xong thì đổi nó thành 0.
Nếu H <> 100 thì hiện Message Box "Vùng dữ liệu này đã định dạng rồi, nếu muốn làm lại thì chỉnh trị H1 và bấm nút"

Nếu muốn làm cầu kỳ hơn thì cho message box hỏi luôn Y/N và dựa theo đó mà làm tiếp.
 
Upvote 0
Cách dễ nhất là dùng ô H1 làm trị số điểu khiển.
Trong hàm định dạng, bạn xét, hễ H1 = 100 thì làm bình thường. Làm xong thì đổi nó thành 0.
Nếu H <> 100 thì hiện Message Box "Vùng dữ liệu này đã định dạng rồi, nếu muốn làm lại thì chỉnh trị H1 và bấm nút"

Nếu muốn làm cầu kỳ hơn thì cho message box hỏi luôn Y/N và dựa theo đó mà làm tiếp.

Không được đâu.

Vì nếu H1=0 thì nếu lỡ bấm nút ... nó chia cho 0.... là hỏng.
Vì đoạn code này thực hiện việc Paste Special và chọn Operation là Divide (cho H1=100) sau đó mới thực hiện định dạng (NumberFormat = #,###.00)

Do đó, từ yêu cầu của bạn a.nguoidensau, mình đề xuất sau khi thực hiện xong, trả H1=1 (để lỡ bấm nút cái nữa thì nó chỉ thực hiện việc chia cho 1).
H1 trở thành ô điều khiển.
Trước khi cần cập nhật toàn bộ bảng thì :

+ Nhập ở ô H1 giá trị 0.01 rồi bấm nút định dạng để trả lại các ô giá trị cũ (trước khi Paste special và Divide cho 100);
+ Nhập các số liệu mới;
+ Rồi nhập lại trị 100 cho ô H1 - bấm nút định dạng lại cho toàn bộ bảng.

Nếu không thì phải xây dựng lại code khác thôi.
 
Lần chỉnh sửa cuối:
Upvote 0
Nếu chưa có giải pháp thì tham khảo thêm giải pháp này:
Mã:
Sub dinhdang1()
    Range("I1") = Range("I1") + 1
    If [B][COLOR=#ff0000]Range("I1") <= 1[/COLOR][/B] Then
        Range("H1").Copy
        Range("A1:A10,C1:C10,D1:D10").Select
        With Selection
            .PasteSpecial Paste:=xlPasteAll, Operation:=xlDivide
            .NumberFormat = "#,##0.00"
        End With
    End If
End Sub
Muốn bấm mấy lần thì cài điều kiện ở chỗ tô màu đỏ. Khi nào muốn định dạng nữa thì xóa I1 hoặc cho I1 = 0.
Chào bác Mr.Bum,tôi thấy nó vẫn chưa ổn, xin bác đừng buồn nhé.
Thời gian gần đây tôi có đọc các bài viết của bác, phải công nhận rằng kiến thức về Excel của bác thuộc dạng có tầm cỡ đấy, nếu không muốn nói là "đỉnh đấy", hiiii.
Xin cảm ơn bác Mr.Bum và mong học hỏi nhiều điều ở bác.
 
Upvote 0
Chào bác Mr.Bum,tôi thấy nó vẫn chưa ổn, xin bác đừng buồn nhé.
Thời gian gần đây tôi có đọc các bài viết của bác, phải công nhận rằng kiến thức về Excel của bác thuộc dạng có tầm cỡ đấy, nếu không muốn nói là "đỉnh đấy", hiiii.
Xin cảm ơn bác Mr.Bum và mong học hỏi nhiều điều ở bác.
Tôi ở dạng "tập sự" thôi, đừng đưa tôi lên như vậy làm tôi khó tiếp nhận góp ý của các cao thủ trên GPE.
Tôi chưa hiểu mong muốn của bạn, có phải ý của bạn khi gõ 100 thì dấu thập phân là 2 số, còn gõ 1,000 thì dấu thập phân là 3 số?
Bạn nói cụ thể hơn vì có nhiều bài trả lời nhưng bạn đáp lại là "chưa ổn" mà không giải thích rõ chưa ổn chỗ nào.
 
Upvote 0
Không được đâu.

Vì nếu H1=0 thì nếu lỡ bấm nút ... nó chia cho 0.... là hỏng.
...

1. Đã lập trình thì ai cũng biết luật: trước khi chia cho một trị, phải xét khả năng 0 của nó. Nếu code không xét là code a ma tơ.

2. Đọc cho kỹ, có câu này:
Nếu H <> 100 thì hiện Message Box "Vùng dữ liệu này đã định dạng rồi, nếu muốn làm lại thì chỉnh trị H1 và bấm nút"
 
Lần chỉnh sửa cuối:
Upvote 0
Tôi ở dạng "tập sự" thôi, đừng đưa tôi lên như vậy làm tôi khó tiếp nhận góp ý của các cao thủ trên GPE.
Tôi chưa hiểu mong muốn của bạn, có phải ý của bạn khi gõ 100 thì dấu thập phân là 2 số, còn gõ 1,000 thì dấu thập phân là 3 số?
Bạn nói cụ thể hơn vì có nhiều bài trả lời nhưng bạn đáp lại là "chưa ổn" mà không giải thích rõ chưa ổn chỗ nào.
Tôi nghĩ sao thì nói vậy thôi, mà tôi nói có linh cảm đấy bác Mr.Bum ah.
Còn như bài#1 tôi đã nói là định dạng các cột mà đằng sau dấu "." 2 số thập phân. Các cột số liệu này thay đổi hàng tháng và cần phải định dạng lại. Nên tôi đã tạo được 1 Code Macro, nhưng sau đó tôi thấy nếu chẳng may mình bấm nút lần thứ 2,... thì số liệu ôi thôi sai bét. Vì thế tôi mới phiền đến các bác xem có cách gì để nếu có lỡ tay bấm vào thì số liệu đã được định dạng chuẩn luôn.
Trong bài #9 của bác, thao tác xóa hoặc không xóa I1 đi tôi thấy vẫn chưa tiện cho lắm, nếu lỡ tay thì số liệu cũng mất tiêu. Tôi thấy mình đã làm phiền các bác nhiều rồi, xin các bác bỏ quá cho nhé.
 
Lần chỉnh sửa cuối:
Upvote 0
Tôi nghĩ sao thì nói vậy thôi, mà tôi nói có linh cảm đấy bác Mr.Bum ah.
Còn như bài#1 tôi đã nói là định dạng các cột mà đằng sau dấu "." 2 số thập phân. Các cột số liệu này thay đổi hàng tháng và cần phải định dạng lại. Nên tôi đã tạo được 1 Code Macro, nhưng sau đó tôi thấy nếu chẳng may mình bấm nút lần thứ 2,... thì số liệu ôi thôi sai bét. Vì thế tôi mới phiền đến các bác xem có cách gì để nếu có lỡ tay bấm vào thì số liệu đã được định dạng chuẩn luôn.
Trong bài #9 của bác, thao tác xóa hoặc không xóa I1 đi tôi thấy vẫn chưa tiện cho lắm, nếu lỡ tay thì số liệu cũng mất tiêu. Tôi thấy mình đã làm phiền các bác nhiều rồi, xin các bác bỏ quá cho nhé.
Thật khó xử, tôi thay Button1 bằng ComandButton1 và sửa code như sau: bấm vào 3 lần hiện lên MsgBox vbYesNo, nếu chọn No thì bấm lại 3 lần, nếu chọn Yes thì Format, cách này mà không được nữa thì tôi cũng dừng ở đây thôi.
Mã:
Private Sub CommandButton1_Click()
Dim i As Integer, Dk
If Val(Right(CommandButton1.Caption, 1)) < 3 Then
    i = i + 1
    CommandButton1.Caption = "Format: " & Val(Right(CommandButton1.Caption, 1)) + i
    If Val(Right(CommandButton1.Caption, 1)) = 3 Then
        Dk = MsgBox("Format now?", vbYesNo)
        If Dk = vbYes Then
            Range("H1").Copy
            Range("A1:A10,C1:C10,D1:D10").Select
            With Selection
                .PasteSpecial Paste:=xlPasteAll, Operation:=xlDivide
                .NumberFormat = "#,##0.00"
            End With
            CommandButton1.Caption = "Format: OK"
        Else
            CommandButton1.Caption = "Format: 1"
        End If
    End If
End If
End Sub
 

File đính kèm

Upvote 0
Tôi nghĩ sao thì nói vậy thôi, mà tôi nói có linh cảm đấy bác Mr.Bum ah.
Còn như bài#1 tôi đã nói là định dạng các cột mà đằng sau dấu "." 2 số thập phân. Các cột số liệu này thay đổi hàng tháng và cần phải định dạng lại. Nên tôi đã tạo được 1 Code Macro, nhưng sau đó tôi thấy nếu chẳng may mình bấm nút lần thứ 2,... thì số liệu ôi thôi sai bét. Vì thế tôi mới phiền đến các bác xem có cách gì để nếu có lỡ tay bấm vào thì số liệu đã được định dạng chuẩn luôn.
Trong bài #9 của bác, thao tác xóa hoặc không xóa I1 đi tôi thấy vẫn chưa tiện cho lắm, nếu lỡ tay thì số liệu cũng mất tiêu. Tôi thấy mình đã làm phiền các bác nhiều rồi, xin các bác bỏ quá cho nhé.
Không biết thế này được chưa. Thêm câu lệnh kiểm tra ô đầu tiên của Selection có dấu "." không, nếu có rồi thì exit sub.

Option Explicit
Sub dinhdang1()
Range("H1").Copy
Range("A1:A10,C1:C10,D1:D10").Select
With Selection
If InStr(CStr(.Cells(1, 1)), ".") > 0 Then Exit Sub
.PasteSpecial Paste:=xlPasteAll, Operation:=xlDivide
.NumberFormat = "#,##0.00"
End With
End Sub
 

File đính kèm

Upvote 0
Những ai tham gia bài này ít nhiều gì cũng biết chút VBA, vậy sao cứ Select rồi Selection hoài thế nhỉ?
(Tác giả viết sao là chuyện của họ, ta phải sửa lại chứ)
 
Upvote 0
Những ai tham gia bài này ít nhiều gì cũng biết chút VBA, vậy sao cứ Select rồi Selection hoài thế nhỉ?
(Tác giả viết sao là chuyện của họ, ta phải sửa lại chứ)
Vậy sửa thế này phải không bác (mấy cái khoản VBA này em mù tịt)?

Sub dinhdang1()
Range("H1").Copy
With Range("A1:A10,C1:C10,D1:D10")
If InStr(CStr(.Cells(1, 1)), ".") > 0 Then Exit Sub
.PasteSpecial Paste:=xlPasteAll, Operation:=xlDivide
.NumberFormat = "#,##0.00"
End With
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Nếu xét cell.value, gặp số có phần thập phân là 00 thì cũng chả thấy dấu chấm.
Muốn xét thì hoặc xét cell.Text, hoặc xét cell.NumberFormat
 
Upvote 0
Nếu xét cell.value, gặp số có phần thập phân là 00 thì cũng chả thấy dấu chấm.
Muốn xét thì hoặc xét cell.Text, hoặc xét cell.NumberFormat
Định dạng "#,##0.00" luôn có dấu chấm, nếu là số nguyên excel vẫn thêm .00 vào. Mình dùng Cstr(cell) rồi mà, dùng cell.text cũng vậy.
 
Upvote 0
Không biết thế này được chưa. Thêm câu lệnh kiểm tra ô đầu tiên của Selection có dấu "." không, nếu có rồi thì exit sub.
If InStr(CStr(.Cells(1, 1)), ".") > 0 Then Exit Sub
OK rồi bạn ah!
Tôi xin chân thành gửi lời cảm ơn tới tất cả các bác, những thành viên đã giúp đỡ tôi giải quyết thành công bài toán định dạng này.
 
Upvote 0
Sao lạ vậy nhỉ, hay là do version của excel, máy mình là 2003. Định dạng custom #,##0.00 là định dạng number có dấu phân cách hàng nghìn và 2 chữ số thập phân. Máy mình nhập 0 nó vẫn thành 0.00

Bạn thử thế này:
Ghi 5 vào ô A1
Vào cửa sổ Immediate của VBE, gõ dòng này:
cells(1,1).numberformat = "#,##0.00" : ? cstr(CStr(Cells(1, 1))), : ? InStr(CStr(Cells(1, 1)), ".") > 0
Nếu theo đúng lập luận của bạn, kết quả sẽ là
5.00 True { string ở cell A1 là "5.00"; và ký tự "." có hiện hữu trong string }
Rất tiếc, máy của tôi cho ra
5 False
 
Upvote 0
Bạn thử thế này:
Ghi 5 vào ô A1
Vào cửa sổ Immediate của VBE, gõ dòng này:
cells(1,1).numberformat = "#,##0.00" : ? cstr(CStr(Cells(1, 1))), : ? InStr(CStr(Cells(1, 1)), ".") > 0
Nếu theo đúng lập luận của bạn, kết quả sẽ là
5.00 True { string ở cell A1 là "5.00"; và ký tự "." có hiện hữu trong string }
Rất tiếc, máy của tôi cho ra
5 False
Đúng vậy, chương trình trên của tôi có lỗi nếu A1 là bội số của 100 thì kết quả sai. Theo hướng dẫn của bạn, mình sửa lại đã ra kết quả đúng:

Sub dinhdang1()
Range("H1").Copy
With Range("A1:A10,C1:C10,D1:D10")
If InStr(.Cells(1, 1).Text, ".") > 0 Then Exit Sub
.PasteSpecial Paste:=xlPasteAll, Operation:=xlDivide
.NumberFormat = "#,##0.00"
End With
End Sub
 
Upvote 0

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

Back
Top Bottom