UsedRange 1. Mc sau đây sẽ tô màu các ô công thức trong vùng sử dụng của trang tính đang kích hoạt Sub ColorAllFormulae() ActiveSheet.UsedRange.SpecialCells(xlCellTypeFormulas).Interior.ColorIndex = 6 End Sub 2. Vùng giao nhau với các cột cho trước đặt tên 1 vùng dữ liệu Ta khảo sát tiếp Mc sau: Sub UsedRange() Dim lRow As Long, bCol As Byte 2 lRow = Worksheets(S1).UsedRange.Rows.Count 3 bCol = Worksheets(S1).UsedRange.Columns.Count With ActiveSheet 5 MsgBox Intersect(.Range(c:q), .UsedRange).Address End With 7 ThisWorkbook.Names.Add Matrix, =r2c2:r lRow c bCol expression.Add(Name, RefersTo, Visible, McType, ShortcutKey, Category, NameLocal, _ RefersToLocal, CategoryLocal, RefersToR1C1, RefersToR1C1Local) End Sub Dòng lệnh 2 được hiểu là số dòng chứa dữ liệu của Sheets(“S1”) đem gán vô biến lRow Tương tự dòng lệnh 3: biến bCol sẽ chứa số cột có dữ liệu; Dòng 5 cho ta biết địa chỉ gioa nhau giữa vùng chứa dữ liệu các cột từ ‘C’ đến ‘Q’; Dòng 7 các ô từ dòng 2, cột 2 đến ô cuối phải nhất được gán tên là ‘Matrix’ 3. Duyệt các ô trong 1 hàng trong tất cả các cột của vùng chứa dữ liệu
UsedRange 1./ Mc sau tô màu ô cơng thức vùng sử dụng trang tính kích hoạt Sub ColorAllFormulae() ActiveSheet.UsedRange.SpecialCells(xlCellTypeFormulas).Interior.ColorIndex = End Sub 2./ Vùng giao với cột cho trước & đặt tên vùng liệu Ta khảo sát tiếp Mc sau: Sub UsedRange() Dim lRow As Long, bCol As Byte lRow = Worksheets("S1").UsedRange.Rows.Count bCol = Worksheets("S1").UsedRange.Columns.Count With ActiveSheet MsgBox Intersect(.Range("c:q"), UsedRange).Address End With ThisWorkbook.Names.Add "Matrix", "=!r2c2:r" & lRow & "c" & bCol 'expression.Add(Name, RefersTo, Visible, McType, ShortcutKey, Category, NameLocal, _ RefersToLocal, CategoryLocal, RefersToR1C1, RefersToR1C1Local) End Sub Dòng lệnh hiểu số dòng chứa liệu Sheets(“S1”) đem gán vô biến lRow Tương tự dòng lệnh 3: biến bCol chứa số cột có liệu; Dòng cho ta biết địa gioa vùng chứa liệu & cột từ ‘C’ đến ‘Q’; Dòng từ dòng 2, cột đến ô cuối phải gán tên ‘Matrix’ 3./ Duyệt ô hàng & tất cột vùng chứa liệu Sub OutputAddress() Dim myRange As Range, rRng As Range, cRng As Range Dim intUnit As Integer Dim StrR As String, StrC As String, Xh As String Xh = Chr(10) & Chr(13) Set myRange = ActiveSheet.UsedRange For Each rRng In myRange.Rows StrR = StrR & rRng.Address & Xh For Each cRng In rRng.Cells StrC = StrC & rRng.Address Next Next MsgBox StrR, , "Row" End Sub 4./ Nhân toàn ô chứa công thức số với giá trị Sub NegativeAllNumberFormula2() On Error Resume Next With Range("IV65536") Value = -1 Copy ActiveSheet.UsedRange.SpecialCells _ (xlCellTypeFormulas, xlNumbers).PasteSpecial _ xlPasteValues, xlPasteSpecialOperationMultiply Clear End With End Sub 5./ Xóa dòng theo điều kiện cột (‘D’) chứa ô trống Sub DeleteRowsWithSpecifiedData() 'Looks in Column D and requires Column IV to be clean Columns(4).EntireColumn.Insert With Range("D1:D" & ActiveSheet.UsedRange.Rows.Count) FormulaR1C1 = "=IF(RC[1]="""",NA(),IF(RC[1]=""Not Needed"",NA()))" Value = Value On Error Resume Next SpecialCells(xlCellTypeConstants, xlErrors).EntireRow.Delete End With On Error GoTo Columns(4).EntireColumn.Delete End Sub 6./ Phóng đại vùng chứa liệu sheet kích hoạt Private Sub Worksheet_Activate() Application.EnableEvents = True Application.WindowState = xlMaximized ActiveSheet.UsedRange.Select ActiveWindow.Zoom = True End Sub 7./ Lập danh sách địa vùng chứa liệu Private Sub Workbook_BeforeSave _ (ByVal SaveAsUI As Boolean, Cancel As Boolean) 'Put in the UsedRange Address of Sheet1 Book1.xls (this workbook) Sheet2.Cells(Cells(65432).End(xlUp).Row + 1, 1) = Sheet1.UsedRange.Address End Sub CurrentRegion Property 1./ Sự khác biệt CurrentRegion & UsedRange Giả dụ có trang tính ‘S1’ kích hoạt, Tại cột A, từ A1 đến A9 & B1 đến B9 có liệu nhập, ta thêm vài giá trị vô ô i14 & i15; Khi ta chạy macro ( Mc) Sub UsedRange() Dim rTable As Range Set rTable = Sheet1.UsedRange MsgBox rTable.Address, , "0" End Sub Trong hộp thoại $A$1:$I$15; Còn chạy Mc có nội dung Sub CurrentRegion1() Dim rTable As Range Set rTable = Sheet1.Range("A1").CurrentRegion MsgBox rTable.Address, , "1" Set rTable = Sheet1.Range("i13").CurrentRegion MsgBox rTable.Address, , "2" With Sheet1 Set rTable = Range(.Range("c2"), _ Cells(65536, Range("IV1").End(xlToLeft).Column).End(xlUp)) End With MsgBox rTable.Address, , "3" End Sub Sẽ xuất lần lược hộp thoại sau 1: $A$1:$B$9 2: $I$13:$I$15 3: $B$2:$C$9 Như hộp thoại cuối đưa địa hoàn toàn khác so với vùng sử dụng (do Mc đưa ra) Những địa hoàn tồn tùy thuộc vào vị trí ta đứng & bắt đầu gọi thực CurrentRegion 2./ Điều kì diệu CurrentRegion Tiếp đến ta xét đến điều kì diệu & vô thông minh excel Để vậy, nhập tiếp tên người vô cột E, E2 đến E9; Còn từ F2 đến F9 số bất kỳ; Sau ta cho chạy Mc sau: Sub TableWithHeaders() Dim rTable As Range: Dim lHeaderRow As Long Set rTable = Sheet1.Range("E1").CurrentRegion lHeaderRow = rTable.ListHeaderRows MsgBox rTable.Address, , "A" If lHeaderRow > Then Set rTable = rTable.Resize(rTable.Rows.Count - lHeaderRow) MsgBox rTable.Address, , "B" Set rTable = rTable.Offset(1) MsgBox rTable.Address, , "C" End If End Sub Nếu thực thao tác nêu, bạn nhận hộp thoại mang ký hiệu ‘A’, với nội dung sau: $E$1:$F$9 (Giống trường hợp hộp thoại số (2) trên); Tiếp theo ta sửa nội dung ô F2 thành chuỗi: ‘SoTien’ Lần chạy lại Mc kỳ này, ta thu thêm hộp thoại (B): $E$1:$F$7 (C): $E$2:$F$8 Ở trường hợp (C) dùng phương thức OFFSET() vùng nên vùng tăng so với vùng trước (chưa dùng phương thức OFFSET()) dòng Các vấn đề lại, bạn ngẫn nghĩ & tự rút kết luận cho mình; What Constitutes a Heading/Header Row If your table is numeric data and you headings are text (or vice verca), Excel will assume row of the table as a header row However, if your data AND headings are both numeric, or both text, Excel will consider your table as having NO headers The way to overcome this is to make your headings different to that of the data This can be done via bolding, font color/size etc Or, should you simply know for a fact that row of the table IS a header row you can use the code below; (Các bạn thông cảm cho vốn tiếng anh bé tẹo mỉnh & tự đọc lấy nha!) 3./ Truy xuất cột liệu vùng CurrentRegion Để làm rõ vấn đề truy xuất liệu cột đó, xét tiếp Mc nữa, sau đây: Sub LoopColsSheet() Const Cot = Dim wSh As Worksheet: Dim Rng As Range For Each wSh In Worksheets Select Case UCase(wSh.Name) Case "S2", "S1" 'Do nothing Case Else For Each Rng In wSh.Range("A5").CurrentRegion.Columns(Cot).Cells MsgBox Rng , , “4” Next Rng End Select Next wSh End Sub Nếu ta cho Mc chạy, ta thu thông tin liệu cùa cột Nếu ta thay Cot = 9, & cho chạy lại Mc, ta thu hộp thoại mà 4./ Biến chứa vùng CurrentRegion Tương tự vậy, ta xét thêm trường hợp sau Sub Matric() Dim Mang, iJ As Long Mang = Sheets("S1").Range("a1").CurrentRegion.Resize(, 3).Value For iJ = To UBound(Mang, 1) MsgBox Mang(iJ, 2), , "5" Next iJ Exit Sub: End Sub Trong Mc có giá trị & 2; Ta chạy thử nhiều lần với giá trị tăng dần xem Mình ngờ kết Mc nó! 5./ CurrentRegion & copy cột liệu Ví dụ ta có liệu năm trước cột A:C Bắt đầu từ cột E cách cột liệu tháng năm thời; (Mỗi tháng gồm cột liệu & cách tháng sau cột trống) Nhiệm vụ đề chép 12 tháng liệu vô ba cột lưu liệu năm trước (tại cột A:C) Nhiệm vụ giao cho Mc sau: Sub Copy3Columns() Dim Rng As Range: Set Rng = Range("E1") Dim lRow As Long lRow = Range("A" & Rows.Count).End(xlUp).Row + While Rng.Value "" Rng.CurrentRegion.Copy Range("A" & lRow) lRow = lRow + Rng.CurrentRegion.Rows.Count Rng.Resize(, 4).EntireColumn.Delete Set Rng = Range("E1") Wend Set Rng = Nothing End Sub Mc Copy3Columns có dòng lệnh 1: khai báo hai biến dùng; D2: Ta chọn & kích hoạt ô ‘E1’ D3 : thêm vô giá trị dòng cuối liệu lưu gán vô biến lRow khai báo ; D4 & D9 : Thiết lập vòng lặp thỏa điều kiện giá trị chứa biến Rng trống ; D5 : Vùng liệu lưu chép thêm từ vùng CurrentRegion ; D6 : Xác định lại dòng cuối liệu lưu (đã + 1) D7 : Xóa cột vừa chép ; D8 : Xác lập lại vùng chọn ... OutputAddress() Dim myRange As Range, rRng As Range, cRng As Range Dim intUnit As Integer Dim StrR As String, StrC As String, Xh As String Xh = Chr(10) & Chr(13) Set myRange = ActiveSheet.UsedRange For Each... Sub UsedRange() Dim rTable As Range Set rTable = Sheet1.UsedRange MsgBox rTable.Address, , "0" End Sub Trong hộp thoại $A$1:$I$15; Còn chạy Mc có nội dung Sub CurrentRegion1() Dim rTable As Range. .. ActiveSheet.UsedRange.Select ActiveWindow.Zoom = True End Sub 7./ Lập danh sách địa vùng chứa liệu Private Sub Workbook_BeforeSave _ (ByVal SaveAsUI As Boolean, Cancel As Boolean) 'Put in the UsedRange