With wS.Range([A1], [J65000].End(xlUp).Row) của em sai ở đâu

Liên hệ QC

khanhhoan

Thành viên chính thức
Tham gia
15/4/08
Bài viết
99
Được thích
36
Nghề nghiệp
Sinh viên
Em có Code này nhưng không biết dùng With wS.Range([A1], [J65000].End(xlUp).Row) nó sai như thế nào? Xin sửa lại giùm
PHP:
Sub Thuoc_tinh()
    Dim wS As Worksheet
    For Each wS In ThisWorkbook.Worksheets
        With wS.Range([A1], [J65000].End(xlUp).Row)
            .Borders.Weight = xlThin
            .Font.Name = ".VnTime"
            .Font.Size = 12
            .EntireRow.AutoFit
            .EntireColumn.AutoFit
        End With
    Next
End Sub
 
Hoặc bạn có thể sửa câu lệnh :With wS.Range([A1], [J65000].End(xlUp).Row)
Thành :
With wS.Range("A1:J" & [J65000].End(xlUp).Row)
 
Upvote 0
banj sửa With wS.Range([A1], [J65000].End(xlUp).Row) thành

With wS.Range("a1", [j65536].End(xlUp))
 
Upvote 0
Em không biết dùng With wS.Range([A1], [J65000].End(xlUp).Row) nó sai như thế nào? Xin sửa lại giùm

PHP:
Sub Thuoc_tinh()
    Dim wS As Worksheet
    For Each wS In ThisWorkbook.Worksheets
        With wS.Range([A1], [J65000].End(xlUp).Row)
            .Borders.Weight = xlThin
'. . . . '
        End With
    Next
End Sub

Trước hết mình xin dịch các câu lệnh mà mình trích dẫn; Nhưng để làm điều này, mình fải giả dụ chúng ta đang có 13 trang tính (12 trang tính tháng & 1 trang tổng hợp)
Giờ bạn muốn định dạng ở 12 trang tính tháng kia tại vùng [A1] cho đến ô cuối cùng của cột 'J' có dữ liệu?

Trước tiên bạn fải không định dạng trang 'THop' cái đã; Dùng câu lệnh sau để không định dạng 'THop':
Mã:
    For Each wS In ThisWorkbook.Worksheets
        If wS.Name <> "THop" Then
 '. . . . . '
        End If
    Next wS

Đó là fần fụ; Fần chính ta cần tìm nguồn cơn gây sai lỗi trong câu lệnh của bạn, đó là:
Bạn đang đứng ở trang tính nào trong 13 trang tính trên & khởi động macro.
Nếu bạn đang ở 'THop' mà chạy nó sẽ báo lỗi là fải rối!
Vì trong câu lệnh
Mã:
 With wS.Range([A1], [J65000].End(xlUp).Row)
wS là trang tính đang khảo sát, còn [A1] hay [J65000].End(xlup).Row là nói đến vùng ô giới hạn bởi 2 ô trái trên nhứt & fải dưới nhứt của trang tính 'THop' hiện hành (nơi mà bạn đang đứng!)
Có nghĩa là VBA không chịu tác hợp kiểu này; xưa ông bà ta nói khi gặp chuyện này: "Râu ông nọ cắm cằm bà kia" đó bạn;
Một khi bạn hiểu ra vấn đề thì bạn tự sửa đi xem sao.
 
Lần chỉnh sửa cuối:
Upvote 0
Bác ChanhTQ@ ah, em muốn áp dụng cho tất cả các trang không ngoại trừ Sheet nào (kể cả Sheet tổng hợp em cũng định dạng như các Sheet kia.

Tại sao em thay With wS.Range([A1], [J65000].End(xlUp).Row) bằng With wS.Range([A1], [J65000].End(xlUp)) lại OK?
 
Upvote 0
Bác ChanhTQ@ ah, em muốn áp dụng cho tất cả các trang không ngoại trừ Sheet nào (kể cả Sheet tổng hợp em cũng định dạng như các Sheet kia.

Tại sao em thay With wS.Range([A1], [J65000].End(xlUp).Row) bằng With wS.Range([A1], [J65000].End(xlUp)) lại OK?
Hổng dám OK đâu!
Có chẳng là vầy thì mới được
With wS.Range(wS.[A1], wS.[J65000].End(xlUp))
(giống trả lời ở bài 2 ấy)
 
Upvote 0
Giờ bạn thử thêm 1 dòng lệnh của mình & chạy lại macro xem sao

PHP:
Sub Thuoc_tinh()
    Dim wS As Worksheet
    For Each wS In ThisWorkbook.Worksheets
        With wS.Range([A1], [J65000].End(xlUp).Row)

            MsgBox wS.Name,, [A1].Parent.Name      '<=|'

            .Borders.Weight = xlThin
            .Font.Name = ".VnTime"
            .Font.Size = 12
            .EntireRow.AutoFit
            .EntireColumn.AutoFit
        End With
    Next
End Sub
 
Upvote 0
Thày Ndu cho em hỏi trong code With wS.Range(wS.[A1], wS.[J65000].End(xlUp)) sao lại lắm wS thế?

Có cái wS ngoài chả lẽ chưa đủ sao mà trong phải nhắc lại lần nữa.
 
Upvote 0
Thày Ndu cho em hỏi trong code With wS.Range(wS.[A1], wS.[J65000].End(xlUp)) sao lại lắm wS thế?

Có cái wS ngoài chả lẽ chưa đủ sao mà trong phải nhắc lại lần nữa.
Bên trong không xác định wS. thì phải hiểu [A1], [J65000] là của sheet nào? Nếu không xác định tường minh thì VBA sẽ hiểu 2 ô [A1], [J65000] là của sheet hiện hành.
 
Upvote 0
Chà chà, vụ này hơi rắc rối quá, em cứ tưởng khi viết thế có nghĩa là [A1], [J65000] nằm trong Range (Range([A1], [J65000].End(xlUp).Row)); mà Range lại nằm trong wS (wS.Range) tức là [A1], [J65000] thuộc wS đang xét rồi chứ nhỉ?
 
Upvote 0
Chà chà, vụ này hơi rắc rối quá, em cứ tưởng khi viết thế có nghĩa là [A1], [J65000] nằm trong Range (Range([A1], [J65000].End(xlUp).Row)); mà Range lại nằm trong wS (wS.Range) tức là [A1], [J65000] thuộc wS đang xét rồi chứ nhỉ?
VBA luôn theo nguyên tắc: Nếu không nói rõ đối tượng (range, objects,...) của sheet nào thì VBA sẽ hiểu đối tượng này nằm trên sheet hiện hành.
Nếu bạn thấy rắc rối vì phải viết wS nhiều lần thì đưa nó vào câu lệnh With, mỗi lần thay vì phải gõ wS. thì ta chỉ cần gõ dấu chấm thôi.
 
Upvote 0
Thày Ndu cho em hỏi trong code With wS.Range(wS.[A1], wS.[J65000].End(xlUp)) sao lại lắm wS thế?

Có cái wS ngoài chả lẽ chưa đủ sao mà trong phải nhắc lại lần nữa.
Nếu bạn ghi vầy:
wS.Range("A1:J1000")
thì khỏi cần phải thêm gì cả
Nhưng nếu ghi vầy:
wS.Range([A1], [J65000].End(xlUp))
thì ai mà biết [A1] và [J65000] là của sheet nào chứ... và đương nhiên code sẽ hiểu [A1] và [J65000] là của sheet ta đang đứng lúc chạy code ---> Ráp vào toàn bộ code để ra 1 địa chỉ cụ thể sẽ sai hết
Code wS.Range([A1], [J65000].End(xlUp)) sẽ đúng nếu trên nó có dòng wS.Select (và dưới nó thậm chí cũng không cần wS luôn)
 
Upvote 0
Cảm ơn thày Ndu, trước đây khi tìm hiểu về Select thì hầu như em chỉ hiểu theo mặc định chứ không hiểu được hết các cách dùng của nó.

Mong thày giải đáp cho ý nghĩa, tác dụng của Select: Khi cho wS.Select trước dòng Code wS.Range([A1], [J65000].End(xlUp)) thì nó sẽ đúng (và dưới nó thậm chí cũng không cần wS luôn).

Tại sao có Select lại không cần wS, không có thì lại cần wS.
 
Upvote 0
Cảm ơn thày Ndu, trước đây khi tìm hiểu về Select thì hầu như em chỉ hiểu theo mặc định chứ không hiểu được hết các cách dùng của nó.

Mong thày giải đáp cho ý nghĩa, tác dụng của Select: Khi cho wS.Select trước dòng Code wS.Range([A1], [J65000].End(xlUp)) thì nó sẽ đúng (và dưới nó thậm chí cũng không cần wS luôn).

Tại sao có Select lại không cần wS, không có thì lại cần wS.

Như đã nói:
- Khi bạn viết Range("gì gì đó") mà không ghi rõ sheet nào thì mặc định code sẽ hiểu Range ấy thuộc sheet mà bạn đang đứng (đang Select)
- Vậy khi bạn dùng wS.Select, tức "nhảy" đến sheet wS... thì đâu cần ghi wS đằng trước nó cũng hiểu Range ấy chính là Range thuộc wS
Dùng wS.Select sẽ tiện khi xét Range thuộc wS, nhưng bất tiện là nó làm cho tốc độ tính toán chậm đi (vì phải "nhảy lon ton" các nơi)... Thế nên đổi sự thuận tiện để lấy tốc độ thì bạn buộc phải ghi rõ tên sheet trước 1 Range (khi ấy không cần "nhảy lon ton" vẫn tính toán được)
 
Upvote 0
Web KT
Back
Top Bottom