Giúp em tìm và đặt tên Range thỏa mãn 1 điều kiện cho trước (1 người xem)

Liên hệ QC

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

thangcola114

Thành viên mới
Tham gia
27/9/11
Bài viết
42
Được thích
8
Giúp em tìm và đặt tên các Range thỏa mãn các điều kiện nhất định như:
- Range giới hạn bởi giá trị của Border là nét đôi
- Cell đầu tiên (Tương tự là Cell cuối cùng) thỏa mãn 3 điều kiện sau: thuộc Range giới hạn trên và nằm trong cột được chỉ định (ví dụ là cột K) và có giá trị là chữ(Tương tự có giá trị là số)
yêu cầu chi tiết em nêu trong file đính kèm, Các bác giúp em viết code
 
Lần chỉnh sửa cuối:
Nếu ô đầu tiên của Bảng là STT và phía sau, phía dưới bảng luôn sạch (không có dữ liệu nháp) thì bảng của bạn luôn xác định được bằng code sau mà không phụ thuộc vào số dòng, số cột của bảng. Hiện nay tôi đang dùng cách này để xác định vị trí vùng dữ liệu trong bảng tính.
Mã:
Sub Table()
    With ActiveSheet
        '1- O dau cua bang - phia tren ben trai
        Set RngTL = .UsedRange.Find("Stt", , , 2, 1, 1)
       
        '2- O cuoi cua bang - phia duoi ben phai
        Set RngLR = .UsedRange.Find("*", , , 2, 2, 2)

Nhờ các bác giải thích giùm em 2 đoạn trên cái, em đọc bài find method rồi mà vẫn không hiểu.
Phần ô cuối của bảng (đoạn 2) em cần thay đổi do phía dưới và bên trái bảng dữ liệu của em còn chứa dữ liệu
 
Upvote 0
Nếu ô đầu tiên của Bảng là STT và phía sau, phía dưới bảng luôn sạch (không có dữ liệu nháp) thì bảng của bạn luôn xác định được bằng code sau mà không phụ thuộc vào số dòng, số cột của bảng. Hiện nay tôi đang dùng cách này để xác định vị trí vùng dữ liệu trong bảng tính.
Mã:
Sub Table()
    With ActiveSheet
        '1- O dau cua bang - phia tren ben trai
        Set RngTL = .UsedRange.Find("Stt", , , 2, 1, 1)
       
        '2- O cuoi cua bang - phia duoi ben phai
        Set RngLR = .UsedRange.Find("*", , , 2, 2, 2)
        
        '3- Dong dau cot cuoi - phia tren ben phai
        Set RngTR = .Cells(RngTL.Row, RngLR.Column)
        
        '4- Dong cuoi cot dau - phia duoi ben trai
        Set RngLL = RngTL(65000).End(3)(2)
        
        ' So dong cua bang = dong cuoi - dong dau +1
        sR = RngLR.Row - RngTL.Row + 1
        ' So cot cua bang = cot cuoi - cot dau +1
        sCl = RngLR.Column - RngTL.Column + 1
        
        'Vung du lieu (bang)
        Set Rng = RngTL.Resize(sR, sCl)
        MsgBox Rng.Address
        
        'O dau tien cua cot cuoi la dong 7
        MsgBox RngTR(4).Address
        
        'O tong cong o cuoi cot B
        MsgBox RngLL(1, 2).Address
    End With
End Sub
Phần chọn ô cuối cùng chưa đáp ứng được yêu cầu nếu bảng dữ liệu nằm giữa đoạn văn bản
Do tính chất thay đổi của dữ liệu bảng (DLB):
1. DLB là vùng luôn thay đổi kích thước và nằm giữa đoạn văn bản
2. Số dòng tiêu đề thay đổi
3. Số dòng chứa giá trị (tổng cộng,làm tròn...) luôn thay đổi
4. Số dòng nằm giữa cũng luôn thay đổi
-Riêng số cột là không đổi
Bác nào có thể giúp em viết code chọn và Set range các khoảng từ 1 đến 4 trên.
 
Upvote 0
Nhờ các bác giải thích giùm em 2 đoạn trên cái, em đọc bài find method rồi mà vẫn không hiểu.
Phần ô cuối của bảng (đoạn 2) em cần thay đổi do phía dưới và bên trái bảng dữ liệu của em còn chứa dữ liệu

.UsedRange.Find("Stt", , , 2, 1, 1) là tìm trong vùng đã sử dụng ký tự "Stt".
.UsedRange.Find("*", , , 2, 1, 2) là tìm trong vùng đã sử dụng ký tự bất kỳ.

Số 2 là cách viết khác của LookAt:=xlPart (nếu LookAt:=xlWhole thì thay số 2=1)
Số 1 ở giữa là tìm theo dòng (nếu tìm theo cột thì thay số 1=2)
Số 1 ở cuối là tìm từ trên xuống (nếu tìm từ dưới lên thì thay số 1=2)

Nếu ở cuối bảng mà còn dữ liệu thì bạn phải chọn cột nào đó có nhiều dòng dữ liệu nhất để lại (không nhập dữ liệu ngoài bảng vào cột này rồi sử dụng phương pháp End(xlUp) thay cho .UsedRange.Find("*", , , 2, 1, 2)

Ví dụ: cột B là cột có nhiều dòng dữ liệu nhất thì Range cuối cùng có dữ liệu là [b65536].End(xlUp).

Xin nhắc lại bài trên tôi đã viết phía sau, phía dưới bảng luôn sạch.
Cái gì cũng cần phải có nguyên tắc. Việc tạo cơ sở dữ liệu theo một nguyên tắc nào đó chính là để tạo ra quy luật và trên cơ sở quy luật đó ta viết code để xử lý nó.
 
Lần chỉnh sửa cuối:
Upvote 0
Nhờ ban quản trị xóa dùm bài viết bị trùng này
 
Lần chỉnh sửa cuối:
Upvote 0
.UsedRange.Find("Stt", , , 2, 1, 1) là tìm trong vùng đã sử dụng ký tự "Stt".
.UsedRange.Find("*", , , 2, 1, 2) là tìm trong vùng đã sử dụng ký tự bất kỳ.

Số 2 là cách viết khác của LookAt:=xlPart (nếu LookAt:=xlWhole thì thay số 2=1)
Số 1 ở giữa là tìm theo dòng (nếu tìm theo cột thì thay số 1=2)
Số 1 ở cuối là tìm từ trên xuống (nếu tìm từ dưới lên thì thay số 1=2)

Nếu ở cuối bảng mà còn dữ liệu thì bạn phải chọn cột nào đó có nhiều dòng dữ liệu nhất để lại (không nhập dữ liệu ngoài bảng vào cột này rồi sử dụng phương pháp End(xlUp) thay cho .UsedRange.Find("*", , , 2, 1, 2)

Ví dụ: cột B là cột có nhiều dòng dữ liệu nhất thì Range cuối cùng có dữ liệu là [b65536].End(xlUp).

Xin nhắc lại bài trên tôi đã viết phía sau, phía dưới bảng luôn sạch.
Cái gì cũng cần phải có nguyên tắc. Việc tạo cơ sở dữ liệu theo một nguyên tắc nào đó chính là để tạo ra quy luật và trên cơ sở quy luật đó ta viết code để xử lý nó.
Với hầu hết các bảng tính không có dữ liệu rác nằm dưới và nằm bên phải , dùng code tìm vùng dữ liệu bảng của bác Trung chính [/QUOTE]
Riêng đối với các vùng dữ liệu bảng nằm lẫn lộn trong các dữ liệu khác, hoặc các vùng dữ liệu bảng mà ô cuối của bảng tính là ô rỗng, theo em nên để người dùng tự quyết định chọn vùng dữ liệu bảng, đoạn code có thể như sau:
Sub NameOffRange()
sodongtd = Application.InputBox("so dong tieu de", , 3)
sodongcc = Application.InputBox("so dong cuoi cung", , 1)
'Chon vung du lieu va gan vung du lieu =Rng
Set Rng = Application.InputBox("Hay Chon Vùng Du Lieu:", Type:=8)
Rng.Select
numRows = Selection.Rows.Count
numColumns = Selection.Columns.Count
'Gan Range tieu de= Rng1
Set Rng1 = Rng.Resize(sodongtd, numColumns)
Rng1.Select
'Gan Range cuoi cung =Rng2
Set Rng2 = Rng.Offset(numRows - 1, 0).Resize(sodongcc, numColumns)
Rng2.Select
'Range phan giua vung du lieu(khong tinh phan tieu de va phan cuoi cung)
Set Rng3 = Rng.Offset(sodongtd, 0).Resize(numRows - sodongtd - sodongcc, numColumns)
Rng3.Select
End Sub
 
Upvote 0
Sửa đoạn code chọn ô cuối của bảng tý:
'2- O cuoi cua bang - phia duoi ben phai
Set LastCell = .UsedRange.Cells(.UsedRange.Cells.Count)
Set RngLR = .UsedRange.Find(What:="*", After:=LastCell, LookIn:=xlValues, LookAt:= _
xlPart, SearchOrder:=xlByRows, SearchDirection:=xlPrevious)
RngLR.Select
Lúc này, dữ liệu rác nằm bên phải vẫn chọn được, tuy nhiên không được nằm cùng dòng với dòng cuối cùng; còn dữ liệu rác nằm dưới dữ liệu bảng thì vẫn không chọn được.
 
Upvote 0
Web KT

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

Back
Top Bottom