Làm thế nào để máy nó hiểu những dấu phảy trên màn hình là dấu chấm

Liên hệ QC

Dauthivan

Thành viên tiêu biểu
Tham gia
15/8/08
Bài viết
565
Được thích
326
Bảng của em sau khi kết xuất (từ chương trình kế toán) lỗi linh tinh, các lỗi khác em sửa đã khá ổn rồi.

Tuy nhiên, vấn đề khó nhất của em là làm sao cho máy hiểu được các dấu phảy trên một số ô hiện ra màn hình thực chất là dấu chấm .

Ví dụ: tại ô A41: 249,000 (máy đang hiểu là 249 đồng), mà bản chất đúng của nó phải là 249.000 (hai trăm bốn chín ngàn đồng). Những ô em bôi đỏ là những code cần chuyển dấu phảy trên màn hình thành dấu chấm.

(trong khi các ô khác hoàn toàn chuẩn rồi, tức là các dấu chấm tại các ô khác hoàn toàn để nguyên).

Em đã dùng Code sau mà không ổn
PHP:
Sub CanDoi_taikhoan()
Application.ScreenUpdating = False
Dim ws As Worksheet, ActSheet As String
ActSheet = ActiveSheet.Name

For Each ws In ThisWorkbook.Sheets
With Sheets(ws.Name)
.Select
With .Range("A1:H500")
.Replace Chr(10), " "
.Replace " ", " "
.Replace ".", ""
.Font.Name = ".VnTime"
.Font.Size = 12
End With
.Range("A1:O3").Font.Name = ".VnTimeH"
End With
Next
End Sub

Xin hãy giúp em tình huống khó này.
 

File đính kèm

  • Chuyen doi.xls
    35.5 KB · Đọc: 21
Lần chỉnh sửa cuối:
Nhưng bản chất bài này của em nó lại lẫn lộn với nhau mới khó xử lý chứ ví dụ 249,000 thì Excel nó hiểu thành 249 nếu muốn đúng tức là phải nhân với 1000 lần mới ra số mình cần

Nghĩa là bài toán của em thực chất là tuân theo quy tắc sau:

- Những ô nào định dạng có số sau dấu phảy (ví dụ 249,000 hoặc 99,000) thì sẽ được nhân với 1000 lần để biến thành đúng là 249.000 hoặc 99.000.
- Những ô nào là số nguyên (không có thành phần sau dấu phảy), ví dụ 95.000.000 thì để nguyên (vẫn là 95.000).

Rất kính mong các sư phụ giúp.
 
Lần chỉnh sửa cuối:
Upvote 0
Em muốn diễn đạt chỉ có những ô nào định dạng là #.##0,000_);-#.##0,000 thì sẽ được nhân với 1000 (những ô còn lại để nguyên) thì Code sẽ viết thế nào ah?

Em viết thế này nhưng lỗi:
PHP:
Sub Chuyendoi()
Dim cell As Range
For Each cell In Range("A1:I500")
        If cell.NumberFormat = "#,##0.000_);-#,##0.000" Then
           cell = cell * 1000
           End If
Next
End Sub

Em đang rất cần ngay, nhờ các sư phụ chỉ cho em.
 
Lần chỉnh sửa cuối:
Upvote 0
file của bạn gửi có cell là text (có kí tự xuống dòng + định dạng). Do vậy cái nào là số thì *1000 ngược lại thì để nguyên.

Mã:
Sub Chuyendoi()
Dim cell As Range
Application.ScreenUpdating = False
For Each cell In Range("A1:I500")
   If IsNumeric(cell) = True And cell.Value > 0 Then
         cell = cell * 1000
      Else
         cell = WorksheetFunction.Clean(cell)
   End If
Next
Application.ScreenUpdating = True
End Sub
 
Upvote 0
Sư phụ ơi, em chỉ cần những ô nào có định dạng là "#,##0.000_);-#,##0.000" thì mới nhân 1000 thôi, các số khác để nguyên.
 
Upvote 0
Xin lỗi sư phụ, Code của sư phụ quá chuẩn rồi, do em không kiểm tra cẩn thận thôi. Cám ơn sư phụ domfootwear rất nhiều
------------
Cho em hỏi 1 chút: Dòng cell = WorksheetFunction.Clean(cell) nó là gì hả sư phụ?

Xin chỉ dùm em chỗ sai của Code em, qua đó em biết nguyên nhân cách dùng tại sao sai để lần sau em dùng cho đúng ah:
PHP:
Sub Chuyendoi()
Dim cell As Range
For Each cell In Range("A1:I500")
        If cell.NumberFormat = "#,##0.000_);-#,##0.000" Then
           cell = cell * 1000
           End If
Next
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Xin lỗi sư phụ, Code của sư phụ quá chuẩn rồi, do em không kiểm tra cẩn thận thôi. Cám ơn sư phụ domfootwear rất nhiều
------------
Cho em hỏi 1 chút: Dòng cell = WorksheetFunction.Clean(cell) nó là gì hả sư phụ?
Lưu ý là code trên chỉ chạy được 1 lần, nếu chạy lần 2 thì nó cứ tiếp tục nhân 1000,
Đoạn code trên mục đích là xóa bỏ những kí tự xuống dòng ấy mà.
 
Upvote 0
Lưu ý là code trên chỉ chạy được 1 lần, nếu chạy lần 2 thì nó cứ tiếp tục nhân 1000,
Đoạn code trên mục đích là xóa bỏ những kí tự xuống dòng ấy mà.

Vâng như vậy là tốt rồi. Nhưng nếu có lệnh gì đó không cho chạy 2 lần thì tốt biết mấy.

--------------
Em chợt nghĩ khi Code cho chạy lần 1, ta sẽ viết thêm Code để nó sẽ tự sinh ra một Sheet!Kiemtra chẳng hạn.
Lần sau nếu nó kiểm tra có sự tồn tại của SheetKiemtra rồi >> không chạy nữa, còn nếu chưa có thì chạy còn nếu có rồi thì No.
 
Lần chỉnh sửa cuối:
Upvote 0
V
Em chợt nghĩ khi Code cho chạy lần 1, ta sẽ viết thêm Code để nó sẽ tự sinh ra một Sheet!Kiemtra chẳng hạn.
Lần sau nếu nó kiểm tra có sự tồn tại của SheetKiemtra rồi >> không chạy nữa, còn nếu chưa có thì chạy còn nếu có rồi thì No.
Đâu cần thiết phải sinh ra thêm sheet mới bạn để cho ô nào đó có giá trị là kiểm tra là Ok, nếu ô đó có chữ kiểm tra rồi thì không chạy code nữa cái đó quá dễ đối với bạn mà
 
Upvote 0
Em định viết áp dụng cho tất cả các Sheet một lúc, nhưng khi chạy nó chỉ chạy được với Sheet đầu tiên thôi, vậy em phải sửa thế nào cho đúng ah
PHP:
Sub CanDoi_taikhoan()
Application.ScreenUpdating = False
Dim ws As Worksheet
Dim Cell As Range
' Thuc hien chuyen doi du lieu bao dam tinh toan duoc
For Each ws In ThisWorkbook.Sheets
    With Sheets(ws.Name)
        For Each Cell In .Range("A1:O500")
            If IsNumeric(Cell) = True And Cell.Value > 0 Then
                        Cell = Cell * 1000
                Else
                         Cell = WorksheetFunction.Clean(Cell)
            End If
        Next
        Range("A1:O500").Font.Name = ".VnTime"
        Range("A1:O500").Font.Size = 12
        .Range("A1:O3").Font.Name = ".VnTimeH"
    End With
Next
Application.ScreenUpdating = True
End Sub
 
Upvote 0
Mình thử chạy ok mà, khi chạy code xong bạn sang sheet khác xem kết quả thế nào nhé.
 
Upvote 0
Nhưng nó chỉ chạy được 1 Sheet thôi sư phụ ah, các sheet sau không chạy

Nhưng nó chỉ chạy 1 Sheet thôi (1 file của em có khoảng 20 Sheet), em muốn chạy đồng loạt một lúc.

Nhưng câu này em viết bị làm sao vẫn chạy được nhưng khá lâu mà màn hình cứ giật giật khi chạy, xin sư phụ giúp em với.
 

File đính kèm

  • 210212_Goc.xls
    63.5 KB · Đọc: 0
Upvote 0
Như thế này ta kiểm soát được chu trình nè

PHP:
Option Explicit
Sub CanDoi_taikhoan()
 Dim wS As Worksheet
 Dim Cell As Range
 'Thuc hien chuyen doi du lieu bao dam tinh toan duoc'
 Application.ScreenUpdating = False
 For Each wS In ThisWorkbook.Sheets
    If wS.Name <> "THp" And wS.[iU1].Value <> "OK" Then
        MsgBox wS.Name      '<=|'
        For Each Cell In wS.Range("A1:O500")
            If IsNumeric(Cell) And Cell.Value > 0 Then
                Cell = Cell * 1000
            Else
                Cell = WorksheetFunction.Clean(Cell)
            End If
        Next
        wS.Range("A1:O500").Font.Name = ".VnTime"
        wS.Range("A1:O500").Font.Size = 12
        wS.Range("A1:O3").Font.Name = ".VnTimeH"
        wS.[iU1].Value = "OK"       '<=|'
    End If
 Next
 Application.ScreenUpdating = True
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Thưa sư phụ: Cái thằng Clean này nó xóa đươc những ký tự gì thế?
 
Upvote 0
Thưa sư phụ: Cái thằng Clean này nó xóa đươc những ký tự gì thế?
Mở bảng tính, gõ hàm CLEAN rồi bấm Help on this function sẽ có câu trả lời
Removes all nonprintable characters from text. Use CLEAN on text imported from other applications that contains characters that may not print with your operating system. For example, you can use CLEAN to remove some low-level computer code that is frequently at the beginning and end of data files and cannot be printed.
Và cứ theo cách này để học tất cả các hàm trên bảng tính (WorksheetFunction)
 
Upvote 0
Cảm ơn sư phụ Ndu, khổ nỗi em lại không biết tiếng Anh nên nghiên cứu vất vả lắm sư phụ ah.
 
Upvote 0
Cảm ơn sư phụ Ndu, khổ nỗi em lại không biết tiếng Anh nên nghiên cứu vất vả lắm sư phụ ah.
Không biết thì học...
Học máy tính không thể không biết tiếng Anh đâu bạn à
Ban đầu chưa biết, bạn có thể dùng từ điển để tra, hoặc google translate để tra cứu cũng đâu có vấn đề
 
Upvote 0
Em cứ tưởng khi đã có đoạn For Each ws In ThisWorkbook.Worksheets tức đang xét trong wS rồi thì cần gì ws. ở đằng trước các câu nhỉ
PHP:
wS.Range("A1:O500").Font.Name = ".VnTime"
        wS.Range("A1:O500").Font.Size = 12
        wS.Range("A1:O3").Font.Name = ".VnTimeH"

Bởi em làm lại thử ví dụ nhỏ (bỏ đi nó vẫn chạy mà).

PHP:
Sub thu()

    Dim wS As Worksheet
    Dim Cell As Range

    For Each wS In ThisWorkbook.Worksheets

        If wS.[IV1].Value <> "Ok" Then

            For Each Cell In wS.Range("A1:B50")

                If IsNumeric(Cell) And Cell.Value > 0 Then
                    Cell = Cell * 1000
                Else
                    Cell = WorksheetFunction.Clean(Cell)
                End If

            Next

        End If

        Range("A1:B50").Font.Name = ".VnTime"
        Range("A1:B50").Font.Size = 12
        [IV1].Value = "Ok"
    Next

End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Web KT
Back
Top Bottom