Thuộc tính End() trong Excel - giới thiệu tổng quan.

  • Thread starter Thread starter SA_DQ
  • Ngày gửi Ngày gửi
Liên hệ QC

SA_DQ

/(hông là gì!
Thành viên danh dự
Tham gia
8/6/06
Bài viết
14,574
Được thích
22,893
Nghề nghiệp
U80
Thuộc tính End

Trả về một đối tượng range đặc trưng cho ô ở cuối miền chứa range nguồn. Kết quả tương đương đạt được bằng việc nhấn END+ các phím mũi tên: Xuống dưới, qua phải, sang trái hay lên trên. Thuộc tính đối tượng range này thuộc loại chỉ đọc. Cú pháp của thuộc tính:
expression.End(Direction)
expression Biến thuộc loại bắt buộc. Một biểu thức trả về một trong các thuộc tính Range, Cells hay thuộc tính Offset() hoặc phương thức Union(). . . .
Direction Giá trị XlDirection thuộc loại bắt buộc. Hướng di chuyển, có thể là một trong các hằng số XlDirection sau:
xlDown; xlToRight
xlToLeft; xlUp
Ví dụ
Câu lệnh dưới đây chọn ô ở phía dưới cùng cột B trong vùng dữ liệu chứa ô B4.
Range("B4").End(xlUp).Select

Còn ví dụ này chọn cột ô cuối phải chứa dữ liệu của dòng 4, xuất phát từ ‘B4’
Range("B4").End(xlToRight).Select

Còn ví dụ này mở rộng vùng lựa chọn từ ô B4 đến ô cuối cùng của hàng 4 chứa dữ liệu.
Worksheets("Sheet1").Activate
Range("B4", Range("B4").End(xlToRight)).Select


Ví dụ 1: Tìm ô chứa dữ liệu cuối cùng trong cột trước ô trống:

Mã:
Sub LastCellBeforeBlankInColumn()
Range("A1").End(xldown).Select
End Sub
Ví dụ 2: Tìm ô tận cùng trong cột có chứa dữ liệu:

Mã:
Sub LastCellInColumn()
Range("A65536").End(xlup).Select
End Sub

Ví dụ 3: Tìm ô cuối cùng trước ô trống trong hàng:

Mã:
Sub LastCellBeforeBlankInRow()
Range("A1").End(xlToRight).Select
End Sub
Ví dụ 4: Tìm ô cuối cùng trong hàng có chứa dữ liệu:

Mã:
Sub LastCellInRow()
Range("IV1").End(xlToLeft).Select
End Sub
Ví dụ 5: Tìm ô cuối cùng đang sử dụng của trang tínht:

Mã:
Sub Demo()
Cells.Find(What:="*", After:=[A1], SearchDirection:=xlPrevious).Select
End Sub
 
Hay quá bác ơi, bác còn nữa không?
Em đang cần 1 bài thuyết trình đầy đủ như bác đây để giúp em học hỏi kiến thức về VBA của Excel. Rất mong bác viết thêm!
Thanks.s.s.s.s

+Bổ sung: Bác có thể viết thêm các ví dụ về ghép các lệnh vào vị trí .select đó không. Tại vì em thấy ngoài select ra còn rất nhiều lệnh khác nhưng lại không biết xài chúng ra sao cả.
 
Lần chỉnh sửa cuối:
Upvote 0
Các ứng dụng của thuộc tính End trong excel

1 Tìm dòng, cột hay ô cuối cùng của trang tính.

Chúng ta hoàn toàn có thể vô menu Edit ->Go to -> Special -> Last cell tìm đến ô cuối của trang tính đang được kích hoạt. Nhưng những kết quả này hoàn toàn không mấy tin cậy. Nguyên nhân nằm ở hai vấn đề sau
a. Ô cuối ta vừa thiết đặt sau khi lưu dữ liệu: Chúng ta mường tượng như sau: Chúng ta có dữ liệu số & chuỗi trong vùng B10 đến C20 của 1 trang tính mới. Chúng ta thực hiện xóa dữ liệu trong ô C20 đi; Sau đó thực hiện lệnh từ menu Edit ->Go to -> Special -> Last cell chúng ta sẽ vẫn được đưa tời ô C20 vì rằng dữ liệu chưa được lưu từ thời điểm ta xóa dữ liệu đến lúc thực hiện lệnh Go to
b. Những ô tình cờ bị format. Giả dụ, chúng ta nhập giá trị chuỗi hay sô nào đó vô D9; Sau đó ta chọn D18 của 1 trang tính mới & nhập giá trị chỉ ngày vô đó. Sau khi ta xóa dữ liệu trong D18 này đi & tiến hành lưu bảng tính. Thực hiện lệnh Edit -> Go to -> Special -> Last cell Chúng ta vẫn được đưa về ô D18. Vì rằng, khi ta nhập giá trị ngày vô D18 đồng nghĩa với việc excel tự động định dạng ô này là dữ liệu kiểu ngày tháng thuộc loại "General". Để excel không đưa ta về lối xưa này nữa, ta phải chọn D18 & thực hiện các lệnh trong menu Edit -> Clear -> All và tiến hành công đoạn lưu giữ nữa!
Cũng sẽ gặp trường hợp như vậy, nếu ta dùng dòng lệnh VBA sau:

Range("A1").SpecialCells(xlCellTypeLastCell).Select

Từ đó ta có ba phương án để tìm dòng cuối, cột cuối & ô chưa dữ liệu cuối trang tính, như sau

Tìm đến dòng cuối chứa dữ liệu của trang tính:

Mã:
Sub FindLastRow()
Dim LRow As Long
If WorksheetFunction.CountA(Cells) > 0 Then
'Tìm các dòng có chứa dữ liệu.
LRow = Cells.Find(What:="*", After:=[A1], SearchOrder:=xlByRows, _ 
SearchDirection:=xlPrevious).Row
MsgBox LRow
End If
End Sub
Tìm đến cột cuối chứa dữ liệu của trang tính:

Mã:
Sub FindLastColumn()
Dim LColumn As Integer
If WorksheetFunction.CountA(Cells) > 0 Then
' Tìm các cột có chứa dữ liệu.
LColumn = Cells.Find(What:="*", After:=[A1], _
SearchOrder:=xlByColumns, _
SearchDirection:=xlPrevious).Column
MsgBox LColumn
End If 
End Sub

Tìm đến ô cuối cùng chứa dữ liệu của trang tính:

Mã:
Sub FindLastCell()
Dim LColumn As Integer: Dim LRow As Long
Dim LastCell As Range
If WorksheetFunction.CountA(Cells) > 0 Then
Tìm dòng cuối có chứa dữ liệu.
LRow = Cells.Find(What:="*", After:=[A1], _
SearchOrder:=xlByRows, _
SearchDirection:=xlPrevious).Row
' Tìm cột cuối có chứa dữ liệu.
LColumn = Cells.Find(What:="*", After:=[A1], _
SearchOrder:=xlByColumns, _
SearchDirection:=xlPrevious).Column
MsgBox Cells(LRow, LColumn).Address
End If 
End Sub
 
Upvote 0
2 Vùng động được đặt tên với VBA

Để chuyển macro có nội dung như dưới đây trở thành macro của bảng tính:
Tại ứng dụng excel, chúng ta có thể kích chuột phải lên biểu tượng trái trên nhất của màn hình excel (bên trái mục "File" của thanh menu) và chọn "View Code". Tiếp theo, ta copy & dán đoạn mã này vô cửa sổ VBA

Mã:
Private Sub Workbook_BeforeSave _
(ByVal SaveAsUI As Boolean, Cancel As Boolean)
Dim SheetName As String, NameAddress As String
With Sheet1 ' CodeName
'Xác định tên của Sheet1 tại ngăn SheetNames & vùng hiện hành mở từ A1.
SheetName = "=" & .Name & "!"
NameAddress = .Range("A1").CurrentRegion.Address
'Thêm tên MyRange cho vùng đã mở xuất pháttừ A1
ActiveWorkbook.Names.Add _
Name:="MyRange",RefersTo:=SheetName & NameAddress
End With
End Sub

Một phương pháp khác ta có thể làm là kích chuột phải lên ngăn chứa tên sheet, chọn “View Code” và nhập vào:

Mã:
Private Sub Worksheet_Calculate()
Range("A1", Range("A65536").End(xlUp)).Name = "MyRange"
End Sub

Đoạn mã trên sẽ đặt tên “MyRange” cho mọi ô dữ liệu trong cột A mỗi lần Worksheet được tính lại. Nếu ta cần chọn miền nhiều cột, thì dùng đoạn mã sau:

Mã:
Private Sub Worksheet_Calculate()
Range(Range("IV1").End(xlToLeft), _
Range("A65536").End(xlUp)).Name = "MyRange"
End Sub

Ta cũng có thể dùng sự kiện Change như dưới đây:
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Columns(1)) Is Nothing Then
Range("A1", Range("A65536").End(xlUp)).Name = "MyRange"
End If
End Sub

Xác định tên cho cột ‘A’ chứa dữ liệu & có thể có cả các ô trống:

Mã:
Sub OneColumnDyaRange()
Range("A1", Range("A65536").End(xlUp)).Name = "MyRange"
End Sub

Đặt tên cho 1 vùng của cột ‘A’ bắt đầu từ A1 & hoàn toàn không chứa các ô trống:

Mã:
Sub OneColumnDyaRange()
Range("A1", Range("A1").End(xlDown)).Name = "MyRange"
End Sub

Cả hai đoạn mã ví dụ trên có thể được đặt trong module Workbook để chúng được định nghĩa lại mỗi lần sự kiện này được gọi, chẳng hạng: Workbook_BeforeSave, Workbook_Open, v.v



3. Thêm một hàng khi cột dữ liệu có thay đổi



Giả sử ta có một danh sách dài và ta muốn thêm một hàng mỗi khi cần thay đổi. Thay vì dùng một vòng lặp đơn giản, ta có thể dùng cách nhanh hơn sau đây. (Cách này đòi hỏi dữ liệu phải được sắp xếp thứ tự trước!)

Mã:
Sub InsertRowAtEachChange()
Dim rRange As Range
'Bảo đảm các cột được chọn
If Selection.Cells.Count <> 65536 Then
MsgBox "You must select an entire column", vbCritical
End
End If
On Error Resume Next
'Gán vô biến Range vùng dữ liệu từ cột được chọn
Set rRange = Range(Selection.Cells(2, 1), _
Selection.Cells(65536, 1).End(xlUp)) 
'Thêm công thức vô cột
With rRange
.EntireColumn.Insert
.Offset(0, -1).FormulaR1C1 = _
"=IF(AND(NOT(ISNA(R[-1]C))," & "R[-1]C[1]<>RC[1]),0,"""")"
'Chuyển từ dạng công thức sang dạng số liệu
.Offset(0, -1) = .Offset(0, -1).Value
'Gán lại biến Range
Set rRange = .Offset(0, -1).SpecialCells _
(xlCellTypeConstants, xlNumbers)
End With
'Thêm dòng nếu cần
If WorksheetFunction.CountIf(rRange, 0) > 0 Then
rRange.EntireRow.Insert
End If
'Gán lại biến Range
Set rRange = Range(Selection.Cells(2, 1), _
Selection.Cells(65536, 1).End(xlUp))
'Thêm công thức vô vùng biến
rRange.FormulaR1C1 = _
"=IF(OR(RC[1]="""",R[-1]C[1]=""""),""""," _
& "IF(RC[1]<>R[-1]C[1],0))"
'Chuyển từ dạng công thức sang dạng số liệu
rRange = rRange.Value
'Gán không cho vùng biến
If WorksheetFunction.CountIf(rRange, 0) > 0 Then
Set rRange = rRange.SpecialCells(xlCellTypeConstants, xlNumbers)
'Thêm dòng
rRange.EntireRow.Insert
End If
'Xóa cột vừa thêm
rRange.Columns(1).EntireColumn.Delete
On Error GoTo 0
Set rRange = Nothing
End Sub

Ta nên sắp xếp thứ tự rồi chọn toàn bộ cột trước khi chạy đoạn mã này.
 
Upvote 0
4. Chuyển vị dữ liệu trong cột thành hàng



Nếu ta có nhiều cột dữ liệu và mỗi cột có rất nhiều hàng, đoạn mã sau dùng để chuyển vị chúng sang một sheet khác.
Mã:
[FONT=Courier New][COLOR=navy][COLOR=navy][FONT=Courier New]Sub TransposeThem()[/FONT][/COLOR]
[COLOR=navy][FONT=Courier New]Dim iRows As Long:                  Dim iCol As Integer[/FONT][/COLOR]
[COLOR=navy][FONT=Courier New]Application.ScreenUpdating = False[/FONT][/COLOR]
[COLOR=navy][FONT=Courier New]Application.DisplayAlerts = False[/FONT][/COLOR]
[COLOR=navy][FONT=Courier New]On Error Resume Next[/FONT][/COLOR]
[COLOR=navy][FONT=Courier New]Sheets.Add().Name = "Trans"[/FONT][/COLOR]
[COLOR=navy][FONT=Courier New]On Error GoTo 0[/FONT][/COLOR]
[COLOR=navy][FONT=Courier New]If ActiveSheet.Name <> "Trans" Then[/FONT][/COLOR]
[COLOR=navy][FONT=Courier New]ActiveSheet.Delete[/FONT][/COLOR]
[COLOR=navy][FONT=Courier New]Sheets("Trans").Cells.Clear[/FONT][/COLOR]
[COLOR=navy][FONT=Courier New]End If[/FONT][/COLOR]
 
[COLOR=navy][FONT=Courier New]Application.DisplayAlerts = True[/FONT][/COLOR]
[COLOR=navy][FONT=Courier New]For iCol = 1 To Range("IV1").End(xlToLeft).Column[/FONT][/COLOR]
[COLOR=navy][FONT=Courier New]For iRows = 1 To Columns(iCol).Range("A65536").End(xlUp).Row Step 256[/FONT][/COLOR]
[COLOR=navy][FONT=Courier New]   Columns(iCol).Range("A" & iRows _[/FONT][/COLOR]
[COLOR=navy][FONT=Courier New]      & ":" & "A" & iRows + 255).Copy[/FONT][/COLOR]
[COLOR=navy][FONT=Courier New]   Sheets("Trans").Range("A65536").End(xlUp).Offset _[/FONT][/COLOR]
[COLOR=navy][FONT=Courier New]     (1, 0).PasteSpecial Transpose:=True[/FONT][/COLOR]
[COLOR=navy][FONT=Courier New]Next iRows[/FONT][/COLOR]
[COLOR=navy][FONT=Courier New]Next iCol[/FONT][/COLOR]
[COLOR=navy][FONT=Courier New]Application.ScreenUpdating = True[/FONT][/COLOR]
[COLOR=navy][FONT=Courier New]End Sub[/FONT][/COLOR]
[/COLOR][/FONT]
Ta nên chọn toàn bộ cột trước khi chạy đoạn mã này.

5. Lập danh sách duy nhất từ 1 danh sách có trùng & sắp xếp theo trật tự

Chúng ta đang có 1 danh sách liệt kê các mã hàng hóa đã bán trong ngày đang ở cột ‘A’ của sheet3. nhu cầu đề ra là lập danh sách duy nhất từ chúng & sắp xếp theo thứ tự cho dễ quan sát & thống kê. Macro sau đây sẽ trợ giúp chuyện đó.
Mã:
[FONT=Courier New][COLOR=black][COLOR=black][FONT=Courier New]Option Explicit[/FONT][/COLOR]
[COLOR=black][FONT=Courier New]Sub XepVaXoaTrung()[/FONT][/COLOR]
[COLOR=black][FONT=Courier New]Dim rSortList As Range, rOldList As Range[/FONT][/COLOR]
[COLOR=black][FONT=Courier New]Sheet2.Select[/FONT][/COLOR]
[COLOR=black][FONT=Courier New]Range("A1", Range("A65536").End(xlUp)).Clear[/FONT][/COLOR]
[COLOR=black][FONT=Courier New]Set rOldList = Sheet3.Range("A1", Sheet3.Range("A65536").End(xlUp))[/FONT][/COLOR]
[COLOR=black][FONT=Courier New]rOldList.AdvancedFilter Action:=xlFilterCopy, _[/FONT][/COLOR]
[COLOR=black][FONT=Courier New] CopyToRange:=Cells(1, 1), Unique:=True[/FONT][/COLOR]
[COLOR=black][FONT=Courier New]Set rSortList = Range("A1", Range("A65536").End(xlUp))[/FONT][/COLOR]
[COLOR=black][FONT=Courier New]With rSortList[/FONT][/COLOR]
[COLOR=black][FONT=Courier New] .Sort Key1:=.Cells(2, 1), Order1:=xlAscending, Header:=xlYes, _[/FONT][/COLOR]
[COLOR=black][FONT=Courier New]    OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom[/FONT][/COLOR]
[COLOR=black][FONT=Courier New]End With[/FONT][/COLOR]
[COLOR=black][FONT=Courier New][A1] = "Danh Sach Xep Duy Nhat"[/FONT][/COLOR]
[COLOR=black][FONT=Courier New][A1].Interior.ColorIndex = 35[/FONT][/COLOR]
[COLOR=black][FONT=Courier New]End Sub[/FONT][/COLOR]
[/COLOR][/FONT]
Macro sau khi thực thi nhiệm vụ, sẽ lập ra tại Sheet2 danh sách duy nhất mà ta đang cần.


6. Copy một vùng dữ liệu đến một cột theo số lần cho trước


Macro sau đây sẽ tạo vòng lặp để chép dữ liệu từ 1 vùng cho trước, đến các ô trên 1 cột. Số lần chép tùy thuộc vô số dòng có trong một vùng khác.
Nhưng cái mà chúng ta cần chú ý thêm, tác giả dùng tính tương đối của vùng ô, cũng có tác dụng như dùng thuộc tính Offset(I, j)

Mã:
[FONT=Courier New][COLOR=black][COLOR=black][FONT=Courier New]Sub CopyPaste()[/FONT][/COLOR]
[COLOR=black][FONT=Courier New]  Dim rCopy As Range:                 Dim lRow As Long[/FONT][/COLOR]
[COLOR=black][FONT=Courier New]  lRow = Cells(Rows.Count, 3).End(xlUp).Row + 4[/FONT][/COLOR]
[COLOR=black][FONT=Courier New]  Set rCopy = Range(" A2:B8")[/FONT][/COLOR]
 
[COLOR=black][FONT=Courier New]  Do Until Cells(Rows.Count, 4).End(xlUp)(2, 1).Row >= lRow[/FONT][/COLOR]
[COLOR=black][FONT=Courier New]      rCopy.Copy Cells(Rows.Count, 4).End(xlUp)(2, 1)[/FONT][/COLOR]
[COLOR=black][FONT=Courier New]      MsgBox Cells(Rows.Count, 4).End(xlUp)(2, 1).Address, , _[/FONT][/COLOR]
[COLOR=black][FONT=Courier New]          Cells(Rows.Count, 4).End(xlUp).Address[/FONT][/COLOR]
[COLOR=black][FONT=Courier New]   Loop[/FONT][/COLOR]
[COLOR=black][FONT=Courier New]  Cells(Rows.Count, 3).End(xlUp).Range("B2:C5").Clear[/FONT][/COLOR]
[COLOR=black][FONT=Courier New]End Sub[/FONT][/COLOR]
[/COLOR][/FONT]


7. Thuộc tính End hỗ trợ tính định thức ma trận



Macro dưới đây dùng để xác định nghiệm hệ phương trình tuyến tính 3 ẩn số bằng cách xác định định thức các ma trận của chúng. Ma trận các hệ số của chúng đang được thể hiện tại vùng ‘B1:E3’ (Xin xem hình)
hai dòng lệnh đầu tiên dùng để khai báo các biến cần dùng.
Dòng lệnh 1: Mảng 2 chiều, mỗi chiều 3 phần tử được đem gán vô biến kiểu Range;
Câu đầu của dòng lệnh 3: Xác định định thức của ma trận;
Câu sau: Dọn dẹp bãi trống để làm việc
Dòng 4: áp dụng thuộc tính End sang trái từ ô đầu tiên của cột cuối cùng trang tính; Nếu là trang tính bình thường, ta sẽ được đưa về ‘E1’ . Sau đó bằng thuộc tính Resize(3) ta đã gán các ô ‘E1:E3’ vô biến dRng;
Dòng lệnh từ 5 đến 10: tạo vòng lặp để xử lý các công việc sau:
· Dòng 6: Vùng G1:I3 được gán trị từ biến Rng. (Biến này chứa giá trị các hệ số của ba ẩn của hệ phương trình tuyến tính).
· Dòng 7: các trị số chứa trong biến dRng (thực ra đó là các hằng số của các phương trình tuyến tính (Xem lại dòng lệnh 6) lần lượt được thay vô các cột ‘G’, ‘H’ & ‘I’ theo 3 lần lặp của vòng lặp;
· Dòng 8: các giá trị tại vùng [G1] mở rọng sang phải & xuống dưới 3 giá trị được đem gán vô biến tạm rTemp; Có vậy mới có thể tiến hành tính định thức cho mỗi lần lặp của vòng lặp
· Dòng 9: 3 ô tại cột thứ 6, theo giá trị tăng dần của vòng lặp sẽ được gán lần lượt nghiệm của các ẩn số của phương trình tuyến tính.

Mã:
[FONT=Courier New][FONT=Courier New]Option Explicit[/FONT]
[FONT=Courier New]Sub Matrix3()[/FONT]
[FONT=Courier New]Dim bj As Byte, Fnc As Object:     Dim Dd As Double[/FONT]
[FONT=Courier New]Dim Rng As Range, dRng As Range, rTemp As Range[/FONT]
[FONT=Courier New]1 Set Rng = [b1].Resize(3, 3)[/FONT]
[FONT=Courier New]Set Fnc = Application.WorksheetFunction[/FONT]
[FONT=Courier New]3 Dd = Fnc.MDeterm(Rng):       [f1].Resize(9, 9).Clear[/FONT]
[FONT=Courier New]Set dRng = [iV1].End(xlToLeft).Resize(3)[/FONT]
[FONT=Courier New]5 For bj = 7 To 9[/FONT]
[FONT=Courier New] [g1].Resize(3, 3) = Rng.Value[/FONT]
[FONT=Courier New]7   Cells(1, bj).Resize(3) = dRng.Value[/FONT]
[FONT=Courier New] Set rTemp = [g1].Resize(3, 3)[/FONT]
[FONT=Courier New]9   Cells(bj - 2, 6) = Fnc.MDeterm(rTemp) / Dd[/FONT]
[FONT=Courier New]Next bj[/FONT]
[FONT=Courier New]End Sub[/FONT]
[/FONT]
 
Upvote 0
8. Thêm công thức vô một vùng các ô


a*/ Dùng bộ thu macro của excel để ghi lại các lệnh thêm công thức cho 1 cột.
Chúng ta có trang tính với cột ‘E’ chứa số liệu từ ‘E3:E25]. Các ô kề bên phải của nó cần bổ sung công thức = (Cột E) / 60

Chúng ta tiến hành ghi macro nhờ bộ thu sẵn có của excel.
Trước tiên ta mở bộ thu macro. Chọn ô [F3] & nhập vô đó công thức =E3/60.
Bấm chọn sau đó ô [33]. Giữ phím {CTRL} & dùng phím mũi tên xuống cho đến cuối cột có chứa dữ liệu.
Bấm phím mũi tên phải, nhấn tổ hợp các phím {SHIFT}+{CTRL} & mũi tên lên cho đến khi [F3] được kích hoạt.
Sử dụng {CTRL}+D để gán toàn bộ vùng cho có cùng công thức như tại [F3].
Hình phía dưới đang thể hiện ảnh màn hình tại thời điểm này khi thu macro bằng bộ thu của excel.
PHP:
Sub Test0()
 Range("F3").Select
 ActiveCell.FormulaR1C1 = "=RC[-1]/60"
 Range("E3").Select:                                      Selection.End(xlDown).Select
 Range("F25").Select:                          Range(Selection, Selection.End(xlUp)).Select
 Selection.FillDown
End Sub
Chúng ta thấy, phương thức select được lặp lại nhiều lần trong macro.
Nghi vấn được đặt ra: Liệu có cách nào rút gọn macro lại được chăng?
Nhất là phương thức Select thường làm chậm đáng kể tốc độ xử lý.
EndH2.jpg

Hình 2 Ảnh màn hình sau khi bấm {CTRL}+D
b*/ Trước tiên ta thử dùng thuộc tính Offset() để thay cho một số chổ có mệnh đề Select trong macro Test0 trên.
Để thuận tiên, ta khai báo thêm biến Rng có kiểu dữ liệu Range.

PHP:
Sub Test1()
Dim Rng As Range
Set Rng = Range("E3")
Rng.Offset(0, 1).FormulaR1C1 = "=RC[-1]/60"
Set Rng = Range(Rng, Rng.End(xlDown))
Set Rng = Rng.Offset(0, 1)
Rng.FillDown
End Sub

Ta lập bảng so sánh các câu lệnh giữa 2 macro:, như sau

PHP:
Sub Test0()                                               Sub Test1()
                                                          Dim Rng As Range             
Range("F3").Select                                        Set Rng = Range("E3")
ActiveCell.FormulaR1C1 = "=RC[-1]/60"                     Rng.Offset(0, 1).FormulaR1C1 = "=RC[-1]/60"                                            
' .   .     .   .     .   .     .   .     .   .     .   .     .   .     .   .     .   .     .'
Range("E3").Select                                        Set Rng = Range(Rng, Rng.End(xlDown))         
Selection.End(xlDown).Select
'' .   .     .   .     .   .     .   .     .   .     .   .     .   .     .   .     .   .     .'
Range("F25").Select                                       Set Rng = Rng.Offset(0, 1)
Range(Selection, Selection.End(xlUp)).Select              Rng.FillDown 
Selection.FillDown
End Sub                                                   End Sub


(Chúng ta đã hay sẽ gặp trong Ebook này thuộc tính Offset())
c*/ Tại phần trên chúng ta dùng thuộc tính Offset đã cải thiện đáng kể tình hình.
Nhưng còn có thể cải thiện hơn được không? Ví dụ 2 câu lệnh cuối cùng trong macro trên:
Mã:
Set Rng = Range(Rng, Rng.End(xlDown)).Offset(0, 1)
Rng.FillDown
Bỡi lẽ Rng là biến thuộc loại Range, nên ta có thể gộp chung 2 dòng lệnh này thành

Mã:
Range(Rng, Rng.End(xlDown)).Offset(0, 1).FillDown

Điều này có nghĩa là ta không thật sự cần tất cả tham chiếu đến biến Rng.
Đây là một cách thuận tiện đáng nhớ để tham chiếu đến ô E3.
Ta có thể dùng lệnh With như sau:
PHP:
Sub Test2()
With Range("E3")
.Offset(0, 1).FormulaR1C1 = "=RC[-1]/60"
Range(.Cells(1, 1), .End(xlDown)).Offset(0, 1).FillDown
End With
End Sub
Ta lại lập bảng so sánh như 2 macro trên:

PHP:
Sub Test1()                                     Sub Test2()
Dim Rng As Range
Set Rng = Range("E3")                             With Range("E3")
Rng.Offset(0, 1).FormulaR1C1 = "=RC[-1]/60"          .Offset(0, 1).FormulaR1C1 = "=RC[-1]/60"
' .   .     .   .     .   .     .   .     .   .     .   .     .   .     .   .     .   .     .'
Set Rng = Range(Rng, Rng.End(xlDown))
Set Rng = Rng.Offset(0, 1)                           Range(.Cells(1, 1), .End(xlDown)).Offset(0, 1).FillDown
Rng.FillDown                                       End With
End Sub                                          End Sub

Nếu giờ ta đối chiếu giữa 2 macro Test0() & Test2() ta thấy chúng chỉ có họ hàng bà con nhau gì đó rất xa nhau!
Đó là tại [E3] ta cùng lập công thức giống nhau.
Như vậy cũng là mong muốn giới thiệu với các bạn thêm một phương cách sửa nội dung macro
ghi được từ excel thành 1 macro có hình thức & nội dung ‘Hoành tráng” hơn.
 

File đính kèm

Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
Web KT

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

Back
Top Bottom