Code này tại sao lại không xóa được các khoảng trắng trong các ô bảng tính (1 người xem)

Liên hệ QC

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

Dauthivan

Thành viên tiêu biểu
Tham gia
15/8/08
Bài viết
565
Được thích
327
Không hiểu dữ liệu cơ quan em tại file em đính kèm bài http://www.giaiphapexcel.com/forum/...số-ký-tự-chuyển-Text-sang-Value-cả-bảng-nhanh được kết xuất từ chương trình Kế toán sang Excel kiểu gì? Mà tại tất cả các Sheet, số liệu số hiện ra màn hình hai đầu nó có rất nhiều khoảng trắng khiến excel hiểu đó là Text không chịu tính toán

Em thử dùng Code sau để xóa, nhưng chạy nó không xóa được, xin hãy sửa giúp em:

PHP:
Sub Trim()
For Each mycell In Selection
  mycell.Value = Trim(mycell.Value)
    Next
End Sub
 
Như vậy ngoài cột H lãi suất như bác nói, còn lại toàn bộ các ô như (ô L35 chẳng hạn) bây giờ Code phải viết thế nào để nó hiểu là 281.582 (Hai trăm tám mốt ngàn, năm trăm tám hai đồng) thay vì là 281,582.

Xin bày giúp em cách sửa hàng loạt, sửa thủ công sẽ rất lâu vì Khối lượng công việc của em rất nhiều.
Cho mình hỏi máy bạn định dạng phân cách hàng nghìn là dấu chấm "." hay dấu phẩy "," vậy bạn? Để mọi người có hướng giải quyết triệt để. Nếu là số thì bạn dùng chứ năng thay thế bị lỗi là cái chắc, mình thấy file của bạn chỉ những số nào có phân cách hàng nghìn dấu chấm "." là toàn là kiểu text hết trừ các số bạn đã dùng chức năng thay thế. Vì vậy bạn chỉ cần Replace giống mấy bài trên là OK không cần Replace "," thành "." đâu mà có muốn Replace cũng bị báo lỗi là cái chắc
 
Lần chỉnh sửa cuối:
Upvote 0
Như vậy ngoài cột H lãi suất như bác nói, còn lại toàn bộ các ô như (ô L35 chẳng hạn) bây giờ Code phải viết thế nào để nó hiểu là 281.582 (Hai trăm tám mốt ngàn, năm trăm tám hai đồng) thay vì là 281,582.

Xin bày giúp em cách sửa hàng loạt, sửa thủ công sẽ rất lâu vì Khối lượng công việc của em rất nhiều.
Chà chà, vụ này hơi căng đây, coi chừng thay thế lộn xộn thì... đi tù đấy.
Nếu bạn đảm bảo rằng chỉ có cột H chứa số thập phân thì có lẽ code sau là ổn rồi, không cần thay thế dấu phẩy bởi dấu chấm đâu, đây chỉ là vấn đề định dạng ô thôi:
PHP:
Sub Test()
    Dim ws As Worksheet
    For Each ws In ThisWorkbook.Sheets
        With Sheets(ws.Name).Range("A1:G50,I1:O50")
            .Replace Chr(10), " "
            .Replace "  ", " "
            .Replace ".", ""
            .Font.Name = ".VnTime"
            .Font.Size = 9
        End With
        Sheets(ws.Name).Range("A1:O3").Font.Name = ".VnTimeH"
    Next
End Sub
 
Upvote 0
Định dạng máy em như sau đặt thuộc tính như sau:

-Decimal symbol: , (dấu phảy)
- Digit Grouping symbol: . (dấy chấm)
- List Separator: . (dấu chấm).

Xin nhờ tìm giải pháp giúp em
 
Upvote 0
Chà chà, vụ này hơi căng đây, coi chừng thay thế lộn xộn thì... đi tù đấy.
Nếu bạn đảm bảo rằng chỉ có cột H chứa số thập phân thì có lẽ code sau là ổn rồi, không cần thay thế dấu phẩy bởi dấu chấm đâu, đây chỉ là vấn đề định dạng ô thôi:
PHP:
Sub Test()
    Dim ws As Worksheet
    For Each ws In ThisWorkbook.Sheets
        With Sheets(ws.Name).Range("A1:G50,I1:O50")
            .Replace Chr(10), " "
            .Replace "  ", " "
            .Replace ".", ""
            .Font.Name = ".VnTime"
            .Font.Size = 9
        End With
        Sheets(ws.Name).Range("A1:O3").Font.Name = ".VnTimeH"
    Next
End Sub

Code này gần ổ rồi anh ah, cột H kệ nó em làm thủ công chia cho 10 là xong (em sẽ mày mò cho động tác này vào nốt Code để đỡ làm thủ công). Cảm ơn anh rất nhiều

Sao khi thêm dòng .Replace ".", "" thì dấu phảy hiện tượng trên biến mất nhỉ, em chưa hiểu lắm?

Được anh giúp cho vụ này xong nhẹ cả người.
 
Lần chỉnh sửa cuối:
Upvote 0
Định dạng máy em như sau đặt thuộc tính như sau:

-Decimal symbol: , (dấu phảy)
- Digit Grouping symbol: . (dấy chấm)
- List Separator: . (dấu chấm).

Xin nhờ tìm giải pháp giúp em
Vậy phân cách chữ số hàng ngàn của bạn là dấu chấm theo luật kế toán Việt Nam rồi nên bạn chỉ cần làm giống bài #22 là được còn bạn thấy số phân cách bởi dấu phẩy "," đó chính là số đó bạn mà là số thập phân nên bạn dùng chức năng Replace đâu có được Ví dụ L15 đó chính là số. Mà kiểu tra trên phần mềm chưa đọ với chương trinh thì sẽ rỗ chứ gì
 
Upvote 0
Code này gần ổ rồi anh ah, cột H kệ nó em làm thủ công chia cho 10 là xong (em sẽ mày mò cho động tác này vào nốt Code để đỡ làm thủ công). Cảm ơn anh rất nhiều
Sao khi thêm dòng .Replace ".", "" thì dấu phảy hiện tượng trên biến mất nhỉ, em chưa hiểu lắm?
Được anh giúp cho vụ này xong nhẹ cả người.
Mắc chi phải chia 10 ở cột H? Mình vẫn thấy ở đó là 2.4 (hai đơn vị và bốn phần mười) chứ đâu có phải là 24 đâu.
Sở dĩ dấu phẩy biến mất là vì: Phần mềm xuất ra 281.592 và nó hiểu là "hai trăm tám mươi mốt ngàn năm trăm chín mươi hai", nhưng anh chàng Excel lại hiểu là "hai trăm tám mươi mốt đơn vị và năm trăm chín mươi hai phần ngàn", do đó hắn quẳng dấu thập phân vô đây (nên bạn nhìn thấy dấu phẩy). Còn khi thay thế như trên thì dấu chấm mất đi, đương nhiên anh chàng Excel cũng hiểu giống như phần mềm kia.
 
Upvote 0
Em xin hỏi thêm một chút nữa, em muốn viết Code để cố định dòng cột (chức năng Freeze Panes) cho tất cả các Sheet, cố định 2 cột A, B và 3 dòng đầu tiên, tựa như là khi làm trong Excel sẽ lựa chọn ô C4 vậy, thì có làm được không?
 
Upvote 0
Em xin hỏi thêm một chút nữa, em muốn viết Code để cố định dòng cột (chức năng Freeze Panes) cho tất cả các Sheet, cố định 2 cột A, B và 3 dòng đầu tiên, tựa như là khi làm trong Excel sẽ lựa chọn ô C4 vậy, thì có làm được không?
Cái này thì cứ Record macro là biết ngay thôi mà. Code sẽ là như vầy:
PHP:
Sub TestFreezePanes()
    Dim Ws As Worksheet
    For Each Ws In ThisWorkbook.Worksheets
        Ws.Activate
        ActiveWindow.FreezePanes = False
        [C4].Select
        ActiveWindow.FreezePanes = True
    Next
End Sub
Câu lệnh ActiveWindow.FreezePanes = False ở trên nhằm UnfreezePanes nếu sheet đã được thiết lập FreezePanes trước đó.
Nhân tiện, trong code ở bài trên có thể sửa Sheets(ws.Name).Range("A1:G50,I1:O50") thành ws.Range("A1:G50,I1:O50") cho gọn.
 
Upvote 0
Em xin hỏi thêm một chút nữa, em muốn viết Code để cố định dòng cột (chức năng Freeze Panes) cho tất cả các Sheet, cố định 2 cột A, B và 3 dòng đầu tiên, tựa như là khi làm trong Excel sẽ lựa chọn ô C4 vậy, thì có làm được không?
Bạn có thể Record Macro sau đó chạy từng sheet để thực hiện điều đó
 
Upvote 0
Có cách nào mà tự động FreezePanes cho tất cả các Sheet một lúc không ah

Cái này thì cứ Record macro là biết ngay thôi mà. Code sẽ là như vầy:
PHP:
Sub TestFreezePanes()
    Dim Ws As Worksheet
    For Each Ws In ThisWorkbook.Worksheets
        Ws.Activate
        ActiveWindow.FreezePanes = False
        [C4].Select
        ActiveWindow.FreezePanes = True
    Next
End Sub
Câu lệnh ActiveWindow.FreezePanes = False ở trên nhằm UnfreezePanes nếu sheet đã được thiết lập FreezePanes trước đó.
Nhân tiện, trong code ở bài trên có thể sửa Sheets(ws.Name).Range("A1:G50,I1:O50") thành ws.Range("A1:G50,I1:O50") cho gọn.

Em đã gộp vào cùng một bài, chạy rất chuẩn với dữ liệu của em,

Riêng chức năng FreezePanes đối với mỗi Sheet là ta phải kích hoạt nó (Active), vậy có cách nào mà Sheet đó không cần hiện ra màn hình nó cũng tự động thực hiện chức năng này (FreezePanes) không ah?

PHP:
Sub Test()
    Dim ws As Worksheet
    For Each ws In ThisWorkbook.Sheets
        With Sheets(ws.Name).Range("A1:O50")
                    .Replace Chr(10), " "
            .Replace "  ", " "
            .Replace ".", ""
            .Font.Name = ".VnTime"
            .Font.Size = 10
            ActiveWindow.FreezePanes = False
            [C4].Select
            ActiveWindow.FreezePanes = True
                        
End With
        Sheets(ws.Name).Range("A1:O3").Font.Name = ".VnTimeH"
    Next
End Sub
 
Upvote 0
Em đã gộp vào cùng một bài, chạy rất chuẩn với dữ liệu của em,

Riêng chức năng FreezePanes đối với mỗi Sheet là ta phải kích hoạt nó (Active), vậy có cách nào mà Sheet đó không cần hiện ra màn hình nó cũng tự động thực hiện chức năng này (FreezePanes) không ah?

Thì bạn cứ làm vầy đi:

Mã:
Sub Test()
    Application.ScreenUpdating = False
    Dim ws As Worksheet, ActSheet As String
    ActSheet = ActiveSheet.Name
    For Each ws In ThisWorkbook.Sheets
        With Sheets(ws.Name)
            [COLOR=#0000cd][B].Select[/B][/COLOR]
            With .Range("A1:O50")
                .Replace Chr(10), " "
                .Replace "  ", " "
                .Replace ".", ""
                .Font.Name = ".VnTime"
                .Font.Size = 10
            End With
            [COLOR=#0000cd][B].[C4].Select
            ActiveWindow.FreezePanes = True[/B][/COLOR]
        End With
        Sheets(ws.Name).Range("A1:O3").Font.Name = ".VnTimeH"
    Next
    [B][COLOR=#0000cd]Sheets(ActSheet).Select[/COLOR][/B]
    Application.ScreenUpdating = True
End Sub
 
Upvote 0
Thì bạn cứ làm vầy đi:
Mã:
Sub Test()
    Application.ScreenUpdating = False
    Dim ws As Worksheet, ActSheet As String
    ActSheet = ActiveSheet.Name
    For Each ws In ThisWorkbook.Sheets
        With Sheets(ws.Name)
            [COLOR=#0000cd][B].Select[/B][/COLOR]
            With .Range("A1:O50")
                .Replace Chr(10), " "
                .Replace "  ", " "
                .Replace ".", ""
                .Font.Name = ".VnTime"
                .Font.Size = 10
            End With
            [COLOR=#0000cd][B].[C4].Select
            ActiveWindow.FreezePanes = True[/B][/COLOR]
        End With
        Sheets(ws.Name).Range("A1:O3").Font.Name = ".VnTimeH"
    Next
    [B][COLOR=#0000cd]Sheets(ActSheet).Select[/COLOR][/B]
    Application.ScreenUpdating = True
End Sub
Việc sử dụng câu lệnh Application.ScreenUpdating = False sẽ làm cho đặt Freeze Panes không đúng như ý muốn anh ạ. Anh thử nghiệm: Kéo Scrollbar để ô C4 nằm ngoài phần nhìn thấy trên màn hình và chạy code sẽ thấy điều này. Coi bộ ở đây phải chịu để màn hình "nhảy múa" một chút rồi.
 
Upvote 0
Thì bạn cứ làm vầy đi:

Mã:
Sub Test()
    Application.ScreenUpdating = False
    Dim ws As Worksheet, ActSheet As String
    ActSheet = ActiveSheet.Name
    For Each ws In ThisWorkbook.Sheets
        With Sheets(ws.Name)
            [COLOR=#0000cd][B].Select[/B][/COLOR]
            With .Range("A1:O50")
                .Replace Chr(10), " "
                .Replace "  ", " "
                .Replace ".", ""
                .Font.Name = ".VnTime"
                .Font.Size = 10
            End With
            [COLOR=#0000cd][B].[C4].Select
            ActiveWindow.FreezePanes = True[/B][/COLOR]
        End With
        Sheets(ws.Name).Range("A1:O3").Font.Name = ".VnTimeH"
    Next
    [B][COLOR=#0000cd]Sheets(ActSheet).Select[/COLOR][/B]
    Application.ScreenUpdating = True
End Sub

Rất ổn rồi bác ah, nhưng em chỉ không hiểu là những dòng bôi xanh Sheets(ActSheet).Select của bác nó lại nằm tận dưới (không nằm trong With cũng như For...Next) nhỉ?
 
Upvote 0
Rất ổn rồi bác ah, nhưng em chỉ không hiểu là những dòng bôi xanh Sheets(ActSheet).Select của bác nó lại nằm tận dưới (không nằm trong With cũng như For...Next) nhỉ?
Câu lệnh này nằm ở đó là đúng rồi. Nó có nghĩa là sau khi thiết lập cho các sheet thì quay trở lại sheet lúc trước chạy code. Câu lệnh này chẳng liên quan gì đến câu lệnh With kia cả. Thêm nữa, nếu cho nó nằm vào trong vòng For thì cứ mỗi lần thiết lập xong cho 1 sheet thì nó lại chọn sheet ban đầu, việc này là tốn thời gian và không cần thiết.
 
Upvote 0
Việc sử dụng câu lệnh Application.ScreenUpdating = False sẽ làm cho đặt Freeze Panes không đúng như ý muốn anh ạ. Anh thử nghiệm: Kéo Scrollbar để ô C4 nằm ngoài phần nhìn thấy trên màn hình và chạy code sẽ thấy điều này. Coi bộ ở đây phải chịu để màn hình "nhảy múa" một chút rồi.


Có gì đâu em trai! Thì em trai đã nói đến Scollbar thì mình cứ chơi với nó thôi:

Mã:
Sub Test()
    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:O50")
                .Replace Chr(10), " "
                .Replace "  ", " "
                .Replace ".", ""
                .Font.Name = ".VnTime"
                .Font.Size = 10
            End With
            .Range("A1:O3").Font.Name = ".VnTimeH"
            .[C4].Select
         [COLOR=#0000ff][B]   With ActiveWindow
                .FreezePanes = False
                .ScrollRow = 1
                .ScrollColumn = 1
                .FreezePanes = True
            End With[/B][/COLOR]
        End With
    Next
    Sheets(ActSheet).Select
    Application.ScreenUpdating = True
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Vì bạn đã hỏi:

Riêng chức năng FreezePanes đối với mỗi Sheet là ta phải kích hoạt nó (Active), vậy có cách nào mà Sheet đó không cần hiện ra màn hình nó cũng tự động thực hiện chức năng này (FreezePanes) không ah?

Thực chất để điều khiển được FreePanes, thì chỉ có cửa sổ của sheet đó mở mới có thể thực hiện được, vì vậy ta phải chọn lần lượt từng sheet một để cho nó hiện lên rồi thực hiện nó. Nhưng nếu vậy thì màn hình nó sẽ cập nhật liên tục, nhảy qua sheet này đến sheet khác nên ta dùng sự kiện Application.ScreenUpdating = False để ngăn không cho nó update màn hình.


Rất ổn rồi bác ah, nhưng em chỉ không hiểu là những dòng bôi xanh Sheets(ActSheet).Select của bác nó lại nằm tận dưới (không nằm trong With cũng như For...Next) nhỉ?

Vì hiện tại, tôi chưa biết chính xác bạn đặt thủ tục này tại sheet nào nên trước khi chạy code tôi đã cho biến ActSheet "lưu lại" tên Sheet hiện tại khi chạy code, chắc chắn rằng sau khi hết thủ tục thì sheet cuối cùng được Select trong vòng lặp, vì thế khi hết vòng lặp ta để Sheets(ActSheet).Select để chọn lại sheet mà ta bắt đầu chạy code.

Khi làm như vậy, ta chắc chắn rằng đặt bất kỳ nút lệnh tại sheet nào thì sau khi thủ tục kết thúc màn hình vẫn là sheet bạn sử dụng nút lệnh đó.
 
Upvote 0
Web KT

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

Back
Top Bottom