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:
Sư phụ Ndu ơi, để đọc được Help có cần học siêu ngữ pháp (tức là trình độ Tiếng Anh xuất phát điểm có cần cao lắm) không ah?
 
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
Code dưới chỉ chạy được toàn Workbook với các biến Cell mà thôi, vì:
Cell thuộc wS.Range("A1:B50") (For Each Cell In wS.Range("A1:B50"))
wS lại thuộc ThisWorkbook.Worksheets (For Each wS In ThisWorkbook.Worksheets)
Còn đoạn dưới
Mã:
Range("A1:B50").Font.Name = ".VnTime"
Range("A1:B50").Font.Size = 12
[IV1].Value = "Ok"
Chỉ chạy được đúng sheet đầu tiên. Không tin bạn hãy kiểm tra lại
---------------------------------------------------
Sư phụ Ndu ơi, để đọc được Help có cần học siêu ngữ pháp (tức là trình độ Tiếng Anh xuất phát điểm có cần cao lắm) không ah?
Tôi không biết! Nhưng lấy tôi làm ví dụ thì trình độ tiếng Anh xuất phát của tôi là = Zero. Thế mà giờ tôi cũng đọc được help đấy thôi (ít nhất cũng hiểu được 80% ý nghĩa)
Hồi trước tôi học tiếng Anh chỉ bằng cách đọc truyện: 1 quyển truyện tiếng Anh + quyển từ điển và mò từng chữ một
Bây giờ sướng rồi, có Internet tại sao không tận dụng? Cần thì cứ copy nội dung tiếng Anh paste vào trang http://translate.google.com/ cho nó dịch ... Với lại bạn chỉ đọc và tự mình hiểu thôi, có bắt phải viết cho người khác xem đâu mà cần phải siêu ngữ pháp chứ
 
Upvote 0
Vâng, quả nhiên em Test ra thấy đúng như sư phụ nói.

IQ của em kém quá, xin sư phụ bớt chút thời gian dạy cho, phân tích chi tiết dùm em chút nữa sự khác nhau giữa 2 đoạn này trong đoạn Code ở trên
PHP:
Range("A1:B50").Font.Name = ".VnTime"
Range("A1:B50").Font.Size = 12
[IV1].Value = "Ok"

và Code
PHP:
wS.Range("A1:B50").Font.Name = ".VnTime"
wS.Range("A1:B50").Font.Size = 12
wS.[IV1].Value = "Ok"
 
Lần chỉnh sửa cuối:
Upvote 0
Vâng, quả nhiên em Test ra thấy đúng như sư phụ nói.

IQ của em kém quá, xin sư phụ bớt chút thời gian dạy cho, phân tích chi tiết dùm em chút nữa sự khác nhau giữa
Chạy 2 code để thí nghiệm là thấy được sự khác nhau liền
Để khỏi mất thời gian, tốt nhất xóa hết những chổ giống nhau, chừa lại chổ nào khác nhau là đủ rồi
 
Upvote 0
Thì ra em hiểu thế này có đúng không, nếu không đúng thì sư phụ la cho em biết sư phụ nhé:

+ Nếu không viết wS (nghĩa là viết dạng Range("A1:B50").Font.Name = ".VnTime") >> tức là mảng này không biết thuộc trong phạm vi của Sheet nào quản lý, theo mặc định nó sẽ được giao cho Sheet đang mở (Active Sheet), tức chỉ hoạt động được trên Sheet đang mở.

+ Còn nếu có wS thêm vào (nghĩa là viết dạng wS. Range("A1:B50").Font.Name = ".VnTime") >> khi lệnh For...Next nhảy tới làm việc với Sheet nào thì Range trong đoạn sẽ "thuộc" về Sheet đó tức là làm việc với mọi Sheet.

----------------
Vậy mà em cứ ngỡ rằng có câu For Each wS In ThisWorkbook.Worksheets (nó sẽ đóng vai trò như dưới dạng đặt thừa số chung tựa như là With vậy), những vùng nào nằm trong đoạn này thì khỏi khai báo wS nữa
 
Lần chỉnh sửa cuối:
Upvote 0
Vâng, quả nhiên em Test ra thấy đúng như sư phụ nói.

IQ của em kém quá, xin sư phụ bớt chút thời gian dạy cho, phân tích chi tiết dùm em chút nữa sự khác nhau giữa 2 đoạn này trong đoạn Code ở trên
PHP:
Range("A1:B50").Font.Name = ".VnTime"
Range("A1:B50").Font.Size = 12
[IV1].Value = "Ok"

và Code
PHP:
wS.Range("A1:B50").Font.Name = ".VnTime"
wS.Range("A1:B50").Font.Size = 12
wS.[IV1].Value = "Ok"

/(hi bạn chạy macro, là bạn đang đứng ở đâu đó, chứ không fải đứng ở khoảng không được.
(ó nghĩa là trước khi chạy macro, bạn đã Select hay kích hoạt 1 trang tính nào đó;
(/ậy thì các dòng lệnh của M1 chỉ tác động lên trang í mà thôi!

(òn M2, người ta tường minh hơn, nên máy nói hiểu rành mạch hơn.
 
Upvote 0
Hôm nọ em thử rất chuẩn, hôm nay viết lại Code chạy nhưng không hiểu tại sao những ô kiểm tra không thoả mãn điều kiện IsNumeric(Cell) = True And Cell.Value > 0 nó vẫn nhân với 1000, cụ thể ô C7 em muốn giữ nguyên là 43.633.973. Sau khi chạy Code nó ra là 43.633.973.000 (tức được nhân với 1000).

PHP:
Sub Fix_loi()
    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("A5:J500")
                If IsNumeric(Cell) = True And Cell.Value > 0 Then
                    Cell = Cell * 1000
                Else
                    Cell = WorksheetFunction.Clean(Cell)
                End If
            Next
            For Each Cell In wS.Range("A1:J4")
                Cell = WorksheetFunction.Clean(Cell)
            Next
            wS.[iV1].Value = "OK"
        End If
    Next
End Sub

Nhờ các bác chỉ hộ em nguyên nhân với.
 

File đính kèm

  • File thu nghiem.xls
    23 KB · Đọc: 10
Upvote 0
Do công việc của em hằng ngày phải xử lý khối lượng bảng biểu rất lớn.

Kính mong các anh chị, các thày quan tâm giúp đỡ
 
Upvote 0
Hôm nọ em thử rất chuẩn, hôm nay viết lại Code chạy nhưng không hiểu tại sao những ô kiểm tra không thoả mãn điều kiện IsNumeric(Cell) = True And Cell.Value > 0 nó vẫn nhân với 1000, cụ thể ô C7 em muốn giữ nguyên là 43.633.973. Sau khi chạy Code nó ra là 43.633.973.000 (tức được nhân với 1000).

PHP:
Sub Fix_loi()
    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("A5:J500")
                If IsNumeric(Cell) = True And Cell.Value > 0 Then
                    Cell = Cell * 1000
                Else
                    Cell = WorksheetFunction.Clean(Cell)
                End If
            Next
            For Each Cell In wS.Range("A1:J4")
                Cell = WorksheetFunction.Clean(Cell)
            Next
            wS.[iV1].Value = "OK"
        End If
    Next
End Sub

Nhờ các bác chỉ hộ em nguyên nhân với.
Tôi đoán chắc đến 90% là Control Panel trên máy bạn đang thiết lập dấu chấm là dấu phân cách ngàn
Vì thế mà cell C7 đang chứa giá trị = 43.633.973 và hàm IsNumeric sẽ cho kết quả =TRUE (nó xem C7 là số thật sự)
Quả thật là tai hại khi cố tình sửa Control Panel sai với chuẩn quốc tế (tôi chẳng bao giờ làm vậy trên máy của tôi)
Code trên nếu chạy trên máy của tôi hoàn toàn không có vấn đề gì
 
Upvote 0
(Khi nào mình mở dịch vụ mắng thuê chắc phải mời ndu)

Đối với dân kế toán thì các báo biểu in ra bị yêu cầu dùng dấu chấm hàng ngàn ndu ạ. Vấn đề là đối với người dùng dù bất kỳ ngành nghề gì, đã thiết lập control panel thế nào thì phải thống nhất, kể cả máy cơ quan và máy nhà phải giống nhau. Chứ lẽ nào cùng 1 máy mà ba hồi vầy ba hồi khác.

Vì rõ ràng nếu dấu hàng ngàn là dấu chấm từ đầu, thì code bài 1 phải chạy. Do dấu hàng ngàn là dấu phẩy mới dùng code của Dom. Bây giờ thì lại khác.

Với thiết lập dấu chấm hàng ngàn thì chỉ cần vầy:

PHP:
Sub Fix_loi()
    Dim wS As Worksheet
    For Each wS In ThisWorkbook.Worksheets
    With wS.Range("C5:J100")
        .Replace Chr(10), ""
        .Replace ".", ""
    End With
    Next
End Sub

Thêm 1 chuyện (phải trả phí):
Tuỳ theo dữ liệu mà sử dụng linh hoạt chứ, lúc nào cũng A5:J500 trong khi cột A và nhất là cột B đâu cần xử lý? Xử lý còn rối thêm.
 
Upvote 0
Lỗi của em đúng như sư phụ Ndu nói do sửa Control Panel, nhưng dở một lỗi một số chương trình kế toán của bọn em bắt buộc phải thay đổi thuộc tính trong này.

Em đọc đã đọc bài của sư phụ Ptm0412, nhưng kiến thức kém quá không biết phải hoàn chỉnh Code thế nào nữa cho nó vừa thỏa mãn những ô là số thì nhân với 1000, đồng thời không phải sửa Control Panel.

Xin các thày đã thương thì thương cho chót, cái này đối với em quả là cực kỳ cần thiết.
 
Upvote 0
Web KT
Back
Top Bottom