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
 
Sao không đọc bài số 4 bên topic đó?
 
Upvote 0
Cảm ơn thày, do vôi quá em không kịp để ý. Em xin hỏi thêm nếu trường hợp này viết bằng VBA thì sẽ phải sửa thế nào ah?
 
Upvote 0
Làm 2 dòng lệnh thay thế (replace):

Mycell.value = Replace(Mycell.Value, ".","")
Mycell.value = Replace(Mycell.Value, chr(10),"")

Hoặc gộp (lồng) 2 hàm Replace như lồng 2 hàm Substitute của Excel
 
Upvote 0
Em làm được rồi ah, nhưng em xin được hỏi thành phần chr(10) là gì thế. Kính mong thày chỉ dạy

PHP:
Sub LoaiDau()
For Each Mycell In Selection
 Mycell.Value = Replace(Mycell.Value, ".", "")
Mycell.Value = Replace(Mycell.Value, Chr(10), "")
    Next
End Sub
 
Upvote 0
Cảm ơn thày, do vôi quá em không kịp để ý. Em xin hỏi thêm nếu trường hợp này viết bằng VBA thì sẽ phải sửa thế nào ah?
Dựa theo bài #4 bên kia thì ta có code này:
PHP:
Sub Test()
    With Sheets("Loc").Range("A5:I47")
        .Replace ".", ""
        .Replace Chr(10), ""
    End With
End Sub
 
Upvote 0
Em làm được rồi ah, nhưng em xin được hỏi thành phần chr(10) là gì thế. Kính mong thày chỉ dạy

PHP:
Sub LoaiDau()
For Each Mycell In Selection
 Mycell.Value = Replace(Mycell.Value, ".", "")
Mycell.Value = Replace(Mycell.Value, Chr(10), "")
    Next
End Sub

Cái này mình không nhầm thì nó là ký tự char() trong excel. Chr(10) = char(10) = khoảng trắng.
 
Upvote 0
Em làm được rồi ah, nhưng em xin được hỏi thành phần chr(10) là gì thế. Kính mong thày chỉ dạy

PHP:
Sub LoaiDau()
For Each Mycell In Selection
 Mycell.Value = Replace(Mycell.Value, ".", "")
Mycell.Value = Replace(Mycell.Value, Chr(10), "")
    Next
End Sub
Chr(10) là ký tự tương đương bạn nhấn Alt+Enter trong cell (ký tự xuống hàng)
 
Upvote 0
Trong bài 4 bên kia, nmhung đã nói rõ thế này:
Đếm thấy 14 ký tự, nhưng dùng len thì thấy 15, nghĩa là có 1 ký tự lạ
Dùng Right 1 ký tự sau đó dùng hàm code thì thấy là 10:
=Code(Right(B5)) = 10

Vậy đó là ký tự có code 10

Muốn có ký tự code 10, trong Excel thì nhấn Alt và gõ 0010 bằng phím số Numpad, hoặc dùng hàm CHAR(10), trong VBA thì là hàm Chr(10)
 
Upvote 0
Chẳng là mỗi file của em có khoảng 15 Sheet, nên nếu em chọn từng vùng một thì sẽ rất lâu. Em đã dùng cách chọn tất cả các Sheet (15 Sheet), sau đó em bấm Ctrl+A để lựa chọn toàn bộ dữ liệu tất cả các Sheet nhưng khi chạy Code thấy rất lâu (thậm chí là treo máy)

Các bảng của em có cấu trúc như nhau, vùng dữ liệu trong mỗi Sheet đều là A1:J50. Em muốn bổ sung thao tác lựa chọn toàn bộ vùng A1:J50 cho tất cả các Sheet thì em phải viết thêm vào Code trên thế nào ah?
 
Upvote 0
Chẳng là mỗi file của em có khoảng 15 Sheet, nên nếu em chọn từng vùng một thì sẽ rất lâu. Em đã dùng cách chọn tất cả các Sheet (15 Sheet), sau đó em bấm Ctrl+A để lựa chọn toàn bộ dữ liệu tất cả các Sheet nhưng khi chạy Code thấy rất lâu (thậm chí là treo máy) Các bảng của em có cấu trúc như nhau, vùng dữ liệu trong mỗi Sheet đều là A1:J50. Em muốn bổ sung thao tác lựa chọn toàn bộ vùng A1:J50 cho tất cả các Sheet thì em phải viết thêm vào Code trên thế nào ah?
Viết thêm 1 vòng lặp duyệt qua các sheet đó là được.
Ví dụ

Mã:
Sub Test()
Dim ws As Worksheet
For Each ws In ThisWorkbook.Sheets
    With Sheets(ws.Name).Range("A1:J50")
        .Replace ".", ""
        .Replace Chr(10), ""
    End With
Next
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Viết thêm 1 vòng lặp duyệt qua các sheet đó là được.
Ví dụ

Mã:
[PHP]Sub Test()
Dim ws As Worksheet
For Each ws In ThisWorkbook.Sheets
    With Sheets(ws.Name).Range("A1:J50")
        .Replace ".", ""
        .Replace Chr(10), ""
    End With
Next
End Sub[/PHP]

[/QUOTE]

Code này chưa được vì nó không những xóa ký tự Chr(10) ở cuối ô mà nó còn xóa luôn ký tự Chr(10) ở giữa ô dẫn tới sau khi chạy Code sẽ gặp trường hợp trong một ô :
Trước khi chạy Code: Tên tổ chức
                              [COLOR=#ffffff]---------------------[/COLOR]huy động
Sau khi chạy Code thì sẽ là [COLOR=#ff0000][B]Tên tổ chứchuy động[/B][/COLOR]

Em định sửa Code thành 
[PHP]Sub Test()
Dim ws As Worksheet
For Each ws In ThisWorkbook.Sheets
    With Sheets(ws.Name).Range("A1:J50")
        .Replace ".", ""
        .Replace Chr(10), " "
    End With
Next
End Sub[/PHP]
tiếp theo đó em dùng hàm trim cắt khoảng trắng ở đầu đi, nhưng em [B]chưa biết cách thêm hàm Trim trong VBA thế nào[/B]? Ai biết giúp em với.


[COLOR=#0000ff]Em định thêm 1 số tính năng như thêm Font chữ, cỡ chữ vào code (nhưng không biết nguyên nhân tại sao không chạy ah)?[/COLOR]

[PHP]Sub Test()
Dim ws As Worksheet
For Each ws In ThisWorkbook.Sheets
    With Sheets(ws.Name).Range("A1:J50")
        .Replace ".", ""
        .Replace Chr(10), ""
        .Name = ".VnTime"
        .Size = 9
        End With
Next
End Sub[/PHP]
 
Lần chỉnh sửa cuối:
Upvote 0
Code này chưa được vì nó không những xóa ký tự Chr(10) ở cuối ô mà nó còn xóa luôn ký tự Chr(10) ở giữa ô dẫn tới sau khi chạy Code sẽ gặp trường hợp trong một ô :
Trước khi chạy Code: Tên tổ chức
---------------------huy động
Sau khi chạy Code thì sẽ là Tên tổ chứchuy động
Em định sửa Code thành
PHP:
Sub Test()
Dim ws As Worksheet
For Each ws In ThisWorkbook.Sheets
    With Sheets(ws.Name).Range("A1:J50")
        .Replace ".", ""
        .Replace Chr(10), " "
    End With
Next
End Sub
tiếp theo đó em dùng hàm trim cắt khoảng trắng ở đầu đi, nhưng em chưa biết cách thêm hàm Trim trong VBA thế nào? Ai biết giúp em với.
Em định thêm 1 số tính năng như thêm Font chữ, cỡ chữ vào code (nhưng không biết nguyên nhân tại sao không chạy ah)?
PHP:
Sub Test()
Dim ws As Worksheet
For Each ws In ThisWorkbook.Sheets
    With Sheets(ws.Name).Range("A1:J50")
        .Replace ".", ""
        .Replace Chr(10), ""
        .Name = ".VnTime"
        .Size = 9
        End With
Next
End Sub
1. Trong VBA không có hàm TRIM có tác dụng cắt khoảng trắng ở giữa như trên Worksheet. Để khắc phục vấn đề này, bạn có thể Replace thêm một lần nữa (2 khoảng trắng --> 1 khoảng trắng): .Replace " ", " "
Hoặc cũng có thể sử dụng hàm TRIM của WorksheetFunction: WorksheetFunction.Trim
2. Định dạng Font: Sửa .Name = ".VnTime" thành .Font.Name = ".VnTime"
 
Upvote 0
Riêng vùng A1 đến O3 em định dạng nó là Vn.timeH, em thêm thế này thì Cú pháp sai ở đâu?

PHP:
Sub Test()
Dim ws As Worksheet
For Each ws In ThisWorkbook.Sheets
        With Sheets(ws.Name).Range("A1:O50")
        .Replace ".", ""
        .Replace Chr(10), " "
        .Replace "  ", " "
        .Font.Name = ".VnTime"
        .Font.Size = 9
        End With
           Next
           
           With Sheets(ws.Name).Range("A1:O3")
                .Font.Name = ".VnTimeH"
               End With
           Next
     End Sub
 
Upvote 0
Riêng vùng A1 đến O3 em định dạng nó là Vn.timeH, em thêm thế này thì Cú pháp sai ở đâu?

Mã:
Sub Test()
Dim ws As Worksheet
[B][COLOR=#0000cd]For [/COLOR][/B]Each ws In ThisWorkbook.Sheets
        With Sheets(ws.Name).Range("A1:O50")
        .Replace ".", ""
        .Replace Chr(10), " "
        .Replace "  ", " "
        .Font.Name = ".VnTime"
        .Font.Size = 9
        End With
           [COLOR=#ff0000][B]Next[/B][/COLOR]
           
           With Sheets(ws.Name).Range("A1:O3")
                .Font.Name = ".VnTimeH"
               End With
           [COLOR=#0000cd][B]Next[/B][/COLOR]
     End Sub

Bạn thừa 1 từ Next, có lẽ bạn nên bỏ từ Next màu đỏ.
 
Upvote 0
Cảm ơn bác Minh thiện, em đã làm được cái đó rồi. Nhưng em muốn thêm 1 công đoạn nữa bằng việc thay dấu phảy (,) bằng dấu chấm (.) thì chạy nó không thay thế, Code của em:
PHP:
Sub Test()
Dim ws As Worksheet
For Each ws In ThisWorkbook.Sheets
        With Sheets(ws.Name).Range("A1:O50")
        .Replace Chr(10), " "
        .Replace "  ", " "
        .Font.Name = ".VnTime"
        .Font.Size = 9
        .Replace ",", "."
                End With
           With Sheets(ws.Name).Range("A1:O3")
                .Font.Name = ".VnTimeH"
               End With
           Next
     End Sub

Không hiểu cái đoạn .Replace ",", "." này của em có bị sai không?

(Sở dĩ em phải làm động tác này là chương trình của em sau khi kết xuất dấu , và dấu (.) lẫn lộn)
 
Lần chỉnh sửa cuối:
Upvote 0
Cảm ơn bác Minh thiện, em đã làm được cái đó rồi. Nhưng em muốn thêm 1 công đoạn nữa bằng việc thay dấu phảy (,) bằng dấu chấm (.) thì chạy nó không thay thế, Code của em:
PHP:
Sub Test()
Dim ws As Worksheet
For Each ws In ThisWorkbook.Sheets
        With Sheets(ws.Name).Range("A1:O50")
        .Replace Chr(10), " "
        .Replace "  ", " "
        .Font.Name = ".VnTime"
        .Font.Size = 9
        .Replace ",", "."
                End With
           With Sheets(ws.Name).Range("A1:O3")
                .Font.Name = ".VnTimeH"
               End With
           Next
     End Sub
Không hiểu cái đoạn .Replace ",", "." này của em có bị sai không?
(Sở dĩ em phải làm động tác này là chương trình của em sau khi kết xuất dấu , và dấu (.) lẫn lộn)
1. Trước hết, góp ý với bạn một xíu (đây là ý cá nhân của mình và mình thường làm như vậy):
- Để tránh gặp lỗi như trên vừa đề cập (thừa, thiếu các dòng cùng cặp: For-Next, With-End With,...), bạn nên gõ cặp từ khóa này trước rồi mới Enter để chèn các dòng lệnh phía trong vào.
- Khi soạn code, bạn nên sử dụng phím Tab để phân cấp các dòng lệnh. Đây là một thói quen tốt, sau này dễ kiểm soát lỗi soạn thảo, chẳng hạn code trên, bạn trình bày như vầy sẽ dễ nhìn hơn:
PHP:
Sub Test()
    Dim ws As Worksheet
    For Each ws In ThisWorkbook.Sheets
        With Sheets(ws.Name).Range("A1:O50")
            .Replace Chr(10), " "
            .Replace "  ", " "
            .Font.Name = ".VnTime"
            .Font.Size = 9
            .Replace ",", "."
        End With
        Sheets(ws.Name).Range("A1:O3").Font.Name = ".VnTimeH"
    Next
End Sub
Câu lệnh With phía sau không cần thiết vì trong đó chỉ có 1 lệnh đơn, nên đưa câu lệnh này ra cho gọn.
2. Về vấn đề thay thế dấu (,) bởi dấu (.) thì mình thấy vẫn thay thế bình thường, có lẽ việc bạn nhìn thấy trên bảng tính là do định dạng ô (Format Cells). Tuy nhiên, mình cũng đang thắc mắc tại sao không thay thế bởi ký tự rỗng ("") mà thay bởi dấu (.)? Và việc thay thế này cũng phải cẩn thận vì có thể liên quan đến vấn đề dấu thập phân với dấu phân cách hàng ngàn đấy.
 
Upvote 0
2. Về vấn đề thay thế dấu (,) bởi dấu (.) thì mình thấy vẫn thay thế bình thường, có lẽ việc bạn nhìn thấy trên bảng tính là do định dạng ô (Format Cells). Tuy nhiên, mình cũng đang thắc mắc tại sao không thay thế bởi ký tự rỗng ("") mà thay bởi dấu (.)? Và việc thay thế này cũng phải cẩn thận vì có thể liên quan đến vấn đề dấu thập phân với dấu phân cách hàng ngàn đấy.

Vâng, vụ này rắc rối lắm bác ah, do chương trình kết xuất lẫn lộn dấu phảy và dấu chấm lẫn lộn

Bản chất của dữ liệu đúng là chỉ có cột lãi suất (cột H) là dấu phảy (,) thôi, còn các số liệu còn lại trong bảng có đặc điểm đều là số nguyên dương (không có phảy đằng sau).

Em đang loay hoay tìm cách xử lý nó.

Tiện em gửi File kết xuất lên nhờ mọi người tư vấn giúp.

Em thử thay dấu phảy (,) bằng dấu chấm (.) bằng Code trên nhưng không có tác dụng, ví dụ ô H8 là 2,4 sau khi chạy code nó vẫn trơ trơ ra là 2,4.

(Hằng ngày em phải làm việc với khoảng 20 bảng như thế bác ah, thế mới mệt chứ)
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Tiện em gửi File kết xuất lên nhờ mọi người tư vấn giúp.
Em thử thay dấu phảy (,) bằng dấu chấm (.) bằng Code trên nhưng không có tác dụng, ví dụ ô H8 là 2,4 sau khi chạy code nó vẫn trơ trơ ra là 2,4.
(Hằng ngày em phải làm việc với khoảng 20 bảng như thế bác ah, thế mới mệt chứ)
Cái dấu phẩy ở cột H là do Control Panel trong máy bạn quy định chứ không phải là do việc xuất dữ liệu, bởi vì mình mở trên máy mình thì chỗ này là 2.4 chứ không phải là 2,4 --> việc thay thế không có tác dụng là phải rồi.
 
Upvote 0
Cái dấu phẩy ở cột H là do Control Panel trong máy bạn quy định chứ không phải là do việc xuất dữ liệu, bởi vì mình mở trên máy mình thì chỗ này là 2.4 chứ không phải là 2,4 --> việc thay thế không có tác dụng là phải rồi.

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.
 
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.
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

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

Back
Top Bottom