Xin hỏi về cách tạo macro di chuyển đến sau dòng dữ liệu cuối cùng

Liên hệ QC

NEO

Thành viên mới
Tham gia
10/8/06
Bài viết
30
Được thích
25
Chào cả nhàEm post bài xin hỏi một chútKhông biết có post sai topic không, nếu sai nhờ các anh chuyển giúp.Em có bảng dữ liệu như sau:Các dòng từ A1 ==>> A10: có chứa dữ liệu:

Bây giờ em muốn Macro thực hiện một lệnh mà bắt đầu từ dòng trống ngay sau dòng chứa dữ liệu cuối cùng, ở bảng dữ liệu của em chính là dòng thứ 11 và tại ô A11. Không biết có thực hiện được không??.Nhưng xin mạn phép nhờ các anh chị giúp đỡ.Cám ơn cả nhà. Chúc mọi người một ngày làm việc hiệu quả
 
Với MS Excel, không có gì là không thực hiện được!

Dear NEO,
----------
Với MS Excel, không có gì là không thực hiện được, tuy nhiên bạn phải chú ý xem thắc mắc của bạn nêu có đúng chuyên mục và cách đặt tên đề tài đã phù hợp chưa nhé!
Về vấn đề của bạn, hãy ghi lại một Macro thao tác mà bạn muốn thực hiện. Ở đây, nếu bạn muốn chọn đến dòng cuối cùng của khối dữ liệu, bạn sử dụng tổ hợp Ctrl + Down.
 
Lần chỉnh sửa cuối:
Upvote 0
Em có bảng dữ liệu như sau. . .;Bây giờ em muốn Macro thực hiện một lệnh mà bắt đầu từ dòng trống ngay sau dòng chứa dữ liệu cuối cùng, ở bảng dữ liệu của em chính là dòng thứ 11 và tại ô A11.Nhờ các anh chị giúp đỡ
Bạn hãy thử ghi 1 macro với các động tác như sau:
** Chọn 1 ô VD A1;
** Bấm phím CTRL + fím mũi tên xuống cho tới khi nào bạn đến ô cuối của trang tính (hình như là 65536 zì đó);
** Bấm phím CTRL+ fím mũi tên lên
** Kết thúc thu macro & xem nó!


(húc bạn 1 ngày &ui &ẻ!
 
Upvote 0
Vâng, em hiểu hiểu cách đó rồi anh SA _DQ, cám ơn anh nhiều.
 
Upvote 0
Trả lời Hỏi về VBA

Chỉ là thao tác đơn giản thôi, không cần VBA gì hết!
Cần hỏi đúng chuyên mục mới có trả lời nhanh.
 
Upvote 0
Cách của Cường là dùng Ctrl+End chỉ đúng với trường hợp dữ liệu chưa bị xoá (Cường thử xoá dữ liệu ở dòng cuối cùng và nhấn các phím xem sao!).

Cách của bác SA_DQ theo mình nghĩ sẽ hiệu quả nếu vùng dữ liệu kết thúc trong cùng một hàng. Nếu không thì phải biết cột nào có số dòng nhiều nhất để đặt con trỏ rồi nhấn Ctrl+.....

Nếu dữ liệu không liên tục thì sao?
Với mình thì mình dùng thuộc tính UsedRange để biết vùng dữ liệu sử dụng
Bạn chạy macro sau để trả về ô cuối cùng:
Mã:
Public Sub End_Row()
Dim row_i As Long
row_i = ActiveSheet.UsedRange.Rows.Count + ActiveSheet.UsedRange.Row
Cells(row_i, "A").Select
End Sub
 
Upvote 0
Nếu dữ liệu không liên tục thì sao?
Với mình thì mình dùng thuộc tính UsedRange để biết vùng dữ liệu sử dụng
Bạn chạy macro sau để trả về ô cuối cùng:
Mã:
Public Sub End_Row()
Dim row_i As Long
row_i = ActiveSheet.UsedRange.Rows.Count + ActiveSheet.UsedRange.Row
Cells(row_i, "A").Select
End Sub
[/quote]
To: Anh Sơn
Em có thử cách của anh nhưng hình như nó chạy không theo ý mình anh ạ!
 
Upvote 0
Theo mình nghĩ có nhiều cách để đi đến dòng cuối cùng, mình nghĩ mọi người cũng nên thảo luận vấn để này để có nhiều cách sử dụng.
 
Upvote 0
Dear all,
--------
Còn một cách nữa là có thể di chuyển đến dòng bất kỳ - tuỳ thuộc vào giá trị trên Cell được chỉ định. Cách này rất linh hoạt hơn mặc dù phải tốn thêm... 1 Cell để lưu trữ giá trị này (có đáng là bao):
Mã:
[LEFT]Public Sub Row_Goto(rgGoto as Range)
[COLOR=darkgreen]'rgGoto là một Cell chỉ định chỉ số dòng để con trỏ di chuyển tới[/COLOR]
[COLOR=darkgreen]'Với rgGoto, người sử dụng có thể linh hoạt điều chỉnh chỉ số dòng[/COLOR][/LEFT]
 
[COLOR=darkgreen]'bằng cách sử dụng các hàm: Count, CountIf, CountA...[/COLOR]
[COLOR=darkgreen]
[/COLOR]
 
[LEFT][COLOR=darkgreen]'Bạn phải kiểm tra tính hợp lệ của [B]rgGoto.Value[/B] trước khi hành động [B]Select[/B][/COLOR]

[COLOR=darkgreen]'...[/COLOR]
[LEFT][COLOR=darkgreen]'Code here[/COLOR]
[COLOR=darkgreen]'...[/COLOR][/LEFT]
 
Cells(rgGoto.Value , "A").Select
[LEFT]End Sub[/LEFT]

[/LEFT]


 
Lần chỉnh sửa cuối:
Upvote 0
Trên mạng đây:

Mã:
Find the last used cell, before a blank in a Column:
[b]Sub LastCellBeforeBlankInColumn()[/b]
Range("A1").End(xldown).Select
[b]End Sub[/b]

Find the very last used cell in a Column:
[b]Sub LastCellInColumn()[/b]
Range("A65536").End(xlup).Select
[b]End Sub[/b]

Find the last cell, before a blank in a Row:
[b]Sub LastCellBeforeBlankInRow()[/b]
Range("A1").End(xlToRight).Select
[b]End Sub[/b]

Find the very last used cell in a Row:
[b]Sub LastCellInRow()[/b]
Range("IV1").End(xlToLeft).Select
End Sub

Find the very last used cell on a Worksheet:
Sub Demo()
Cells.Find(What:="*", After:=[A1], SearchDirection:=xlPrevious).Select
[b]End Sub[/b]
Mã:
Below are three methods that will find the "LastRow", "LastColumn" and the "LastCell" 

Find the last used Row on a Worksheet: 

[b]Sub FindLastRow()[/b]
Dim LastRow As Long
	If WorksheetFunction.CountA(Cells) > 0 Then
		'Search for any entry, by searching backwards by Rows.
		LastRow = Cells.Find(What:="*", After:=[A1], _
			  SearchOrder:=xlByRows, _
			  SearchDirection:=xlPrevious).Row
			  MsgBox LastRow
	End If
[b]End Sub[/b]

--------------------------------------------------------------------------------

Find the last used Column on a Worksheet: 

[b]Sub FindLastColumn()[/b]
Dim LastColumn As Integer
	If WorksheetFunction.CountA(Cells) > 0 Then
		'Search for any entry, by searching backwards by Columns.
		LastColumn = Cells.Find(What:="*", After:=[A1], _
        		           SearchOrder:=xlByColumns, _
        			   SearchDirection:=xlPrevious).Column
				   MsgBox LastColumn
	End If 
[b]End Sub[/b]

--------------------------------------------------------------------------------

Find the last used Cell on a Worksheet: 

[b]Sub FindLastCell()[/b]
Dim LastColumn As Integer
Dim LastRow As Long
Dim LastCell As Range
	If WorksheetFunction.CountA(Cells) > 0 Then
		'Search for any entry, by searching backwards by Rows.
		LastRow = Cells.Find(What:="*", After:=[A1], _
        			SearchOrder:=xlByRows, _
        			SearchDirection:=xlPrevious).Row
		'Search for any entry, by searching backwards by Columns.
				LastColumn = Cells.Find(What:="*", After:=[A1], _
        			SearchOrder:=xlByColumns, _
        			SearchDirection:=xlPrevious).Column
				MsgBox Cells(LastRow, LastColumn).Address
	End If 
[b]End Sub [/b]
 
Upvote 0
Hay thật, một vấn đề nhỏ mà các anh giải quyết thật thấy thấu đáo làm em thấy sẳng khoái quá. Em xin góp vui bằng ý tưởng này:
Mã:
Sub moveend(direction As XlDirection)
    firstrow = ActiveCell.CurrentRegion.Row
    firstcolumn = ActiveCell.CurrentRegion.Column
    lastrow = ActiveCell.CurrentRegion.Row + ActiveCell.CurrentRegion.Rows.Count - 1
    Lastcolum = ActiveCell.CurrentRegion.Column + ActiveCell.CurrentRegion.Columns.Count - 1
    Select Case direction
        Case xlDown: Cells(lastrow, ActiveCell.Column).Select
        Case xlToLeft: Cells(ActiveCell.Row, firstcolumn).Select
        Case xlToRight: Cells(ActiveCell.Row, lastcolumn).Select
        Case xlUp: Cells(firstrow, ActiveCell.Column).Select
    End Select
End Sub
Sub movetoend()
    moveend xlDown
End Sub
 
Upvote 0
Theo tôi, Bạn Đào Việt Cường đua ra ý lấy 1 Cell count là nhanh và đơn giản nhất. Còn phần endRow từ A1 hay bị sai phần DL mới chỉ có dòng tiêu đề nên End nó chạy xuống cuối, mà up thì có vẻ nặng quá.
 
Upvote 0
Mình cũng nghĩ làm như ĐVCường là đơn giản nhưng hiệu quả.
Thân!
 
Upvote 0
Tìm thấy thì xóa

Mình có một vùng dữ liệu
Mình muốn khi tìm thấy giá trị ô trong vùng này có giá trị = "TH" (VD) thì sẽ xóa ngay dòng của ô đó.

Không biết dùng thế nào đây các cao thủ ơi ?????
 
Upvote 0
Mình có vận dụng code deleBlankRows trên 4R để "xào" lại bạn xem thữ có đúng không, có thể vận dụng thêm code xác định số dòng thay thế
Public Sub DeleteRows()

Dim R As Long
Dim C As Range
Dim Rng As Range
Dim Str As String

On Error GoTo EndMacro
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual

If Selection.Rows.Count > 1 Then
Set Rng = Selection
Else
Set Rng = ActiveSheet.UsedRange.Rows
End If
Str = "TH"
For R = Rng.Rows.Count To 1 Step -1
'If Application.WorksheetFunction.CountA(Rng.Rows(R).EntireRow) = 0 Then
If Application.WorksheetFunction.CountIf(Rng.Rows(R).EntireRow, Str) > 0 Then
ActiveSheet.Rows(R).EntireRow.Delete
End If
Next R

EndMacro:

Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic

End Sub
Có thể vận dụng thêm Sub LastRows của Anh SA_DQ vào => last row
 
Lần chỉnh sửa cuối:
Upvote 0
Mr Okebab đã viết:
Không biết dùng thế nào đây các cao thủ ơi ?????
Dear Mr Okebab,
-----------------

Không phải cao thủ có được giả nhời không anh? Em nghĩ tới chức năng Find - một công cụ tìm kiếm hiệu quả, rất tiếc chức năng này không hỗ trợ Find all như khi chúng ta Ctrl+F, Alt+I.
Đành phải vận dụng một chút vậy: Lặp liên tục quá trình tìm kiếm Find Next (Alt+F), hễ tìm thấy FindWhat thì Delete Row, cho đến khi không tìm thấy nữa thì thoát khỏi thủ tục:
Mã:
Sub Rows_WhereDelete(stFindWhat As String)
Dim rgFinded As Range
Set rgFinded = ActiveSheet.Range("A1")
Do Until rgFinded Is Nothing
    Set rgFinded = Cells.Find(stFindWhat, SearchDirection:=xlNext)
    If rgFinded Is Nothing Then Exit Sub
    rgFinded.Rows.Delete
Loop
End Sub
 
Upvote 0
ThuNghi đã viết:
Mình có vận dụng code deleBlankRows trên 4R để "xào" lại bạn xem thữ có đúng không, có thể vận dụng thêm code xác định số dòng thay thế

Có thể vận dụng thêm Sub LastRows của Anh SA_DQ vào => last row

Thực ra mình có một cách khác nhanh hơn nhưng thấy nó không thỏa đáng lắm, nhưng dễ hiểu hơn :

VD : Sheet DATA có tên VB là S110..........Vùng Data là DataCT

With Application
.ScreenUpdating = False
.Calculation = xlCalculationManual
End With

With S110
.Range("AZ1").FormulaR1C1 = "=IF(ISERROR(MATCH("TH",DataCT,0))=FALSE,1,0)"
.Calculate
.Select
End With

Do While S110.Range("C2").Value = 1
Cells.Find(What:="TH", After:=ActiveCell, LookIn:=xlValues, LookAt:= _
xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False _
, SearchFormat:=False).EntireRow.Delete
S110.Calculate
Loop


S110.Range("AZ1").FormulaR1C1 = ""


With Application
.ScreenUpdating = True
End With

Không biết có cách nào nhanh và dễ hiểu hơn không ???
 
Upvote 0
Thêm một cách để Mr Okebab tham khảo:
Mã:
[b]
Sub RowsDelete()[/b]
 Dim iJ As Long
 Dim LCell As Range, Rng As Range, UniRng As Range    
1    Cells.Select
    ActiveCell.SpecialCells(xlLastCell).Select
3    Set LCell = Selection
    For iJ = LCell.Row To 2 Step -1
5        For Each Rng In Range(Cells(iJ, 1), Cells(iJ, LCell.Column))
            If UCase$(Rng.Value) = "BT" Then
                If UniRng Is Nothing Then
7                    Set UniRng = Rng.EntireRow
                Else
9                    Set UniRng = Union(UniRng, Rng.EntireRow)
                End If
11              Exit For  '
            End If
13        Next Rng, iJ
15    UniRng.Delete:                    Set UniRng = Nothing [b]
End Sub[/b]
 
Upvote 0
Cách của Cường là dùng Ctrl+End chỉ đúng với trường hợp dữ liệu chưa bị xoá (Cường thử xoá dữ liệu ở dòng cuối cùng và nhấn các phím xem sao!).

Cách của bác SA_DQ theo mình nghĩ sẽ hiệu quả nếu vùng dữ liệu kết thúc trong cùng một hàng. Nếu không thì phải biết cột nào có số dòng nhiều nhất để đặt con trỏ rồi nhấn Ctrl+.....

Nếu dữ liệu không liên tục thì sao?
Với mình thì mình dùng thuộc tính UsedRange để biết vùng dữ liệu sử dụng
Bạn chạy macro sau để trả về ô cuối cùng:
Mã:
Public Sub End_Row()
Dim row_i As Long
row_i = ActiveSheet.UsedRange.Rows.Count + ActiveSheet.UsedRange.Row
Cells(row_i, "A").Select
End Sub
---------------------------------
code của nvson rất là hay, mình đã áp dụng, nhưng vnson co thể sửa code này giúp minh với.

Public Sub End_Row()
Dim row_i As Long
row_i = ActiveSheet.UsedRange.Rows.Count + ActiveSheet.UsedRange.Row
Cells(row_i, "A").Select ' dong cuoi cung cot A
ActiveCell.FormulaR1C1 = "TÔNG CÔNG"
Cells(row_i, "C").Select ' dong cuoi cung cot C
ActiveCell.FormulaR1C1 = "=SUM(R[-70]C:R[-1]C) ''' (công thức này chỉ tính được từ hàng cuối cùng trở lên 70 dòng
End sub
--------------
vấn đề ở đây là code ActiveCell.FormulaR1C1 = "=SUM(R[-70]C:R[-1]C)
chỉ tính tổng từ cột C hàng thứ 8 trở xuống đến hàng cuối cùng.
số lượng hàng cuối cùng có thể thay thay đổi ví dụ có lúc là 50 hàng có lúc là 72 hàng có lúc lầ 30 hàng.
 
Upvote 0
Nếu bạn muốn tính từ hàng thứ 8 trở xuống đến hàng cuối cùng thì dùng:
Mã:
Public Sub End_Row()
    Dim row_i As Long
    row_i = ActiveSheet.UsedRange.Rows.Count + ActiveSheet.UsedRange.Row
    Cells(row_i, "A").Select ' dong cuoi cung cot A
    ActiveCell.FormulaR1C1 = "TÔNG CÔNG"
    Cells(row_i, "C").Select ' dong cuoi cung cot C
    ActiveCell.FormulaR1C1 = "=SUM(R[" & -(row_i - 8) & "]C:R[-1]C)"
End Sub
 
Upvote 0
Web KT
Back
Top Bottom