Add in di chuyển đến ô đầu tiên và ô cuối cùng trong sheet (1 người xem)

Liên hệ QC

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

Tôi tuân thủ nội quy khi đăng bài

vc_đi chơi

Thành viên hoạt động
Tham gia
21/9/19
Bài viết
182
Được thích
35
Em chào các anh/chị trên diễn đàn.
Mong anh/chị giúp em Add in có tác dụng:
- Nếu nhấn tổ hợp phím "Alt+A" thì di chuyển đến ô đầu tiên trong sheet hiện hành có chữa dữ liệu (ô đầu tiên được tính theo ưu tiên chiều từ trên xuống và sau đó mới xét đến theo chiều từ trái sang phải)
- Nếu nhần tổ hợp phím "Alt+Z" thì di chuyển đến Ô cuối cùng Trong Sheet hiện hành có chứa dữ liệu (ô cuối cùng được tính ưu tiên theo chiều từ dưới lên và sau đó mới xét đến theo chiều từ phải sang trái)
Hình mình họa điển hình như dưới, em xin cảm ơn!2025-06-02_121133.png
 
Lần chỉnh sửa cuối:
Em chào các anh/chị trên diễn đàn.
Mong anh/chị giúp em đoạn code Vba có tác dụng:
- Nếu nhấn tổ hợp phím "Alt+A" thì di chuyển đến ô đầu tiên trong sheet hiện hành có chữa dữ liệu (ô đầu tiên được tính theo ưu tiên chiều từ trên xuống và sau đó mới xét đến theo chiều từ trái sang phải)
- Nếu nhần tổ hợp phím "Alt+Z" thì di chuyển đến Ô cuối cùng Trong Sheet hiện hành có chứa dữ liệu (ô cuối cùng được tính ưu tiên theo chiều từ dưới lên và sau đó mới xét đến theo chiều từ phải sang trái)
Hình mình họa điển hình như dưới, em xin cảm ơn!View attachment 308423
Tổ hợp phím Alt+A đã mặc định chức năng khác rồi.
 
Hai tổ hợp phím bạn chọn không ổn đâu, vì nó là mặc định của Excel, bạn nên chuyển sang dùng tổ hợp khác. Dùng Application.OnKey trong VBA để gán phím, còn code tìm ô đầu tiên và cuối cùng chứa dữ liệu thì tìm trên diễn đàn (hoặc google) thiếu gì
 
Mình gán phím Alt-Shift-A và Alt-Shift-Z
Trong ThisWorkbook, bạn dùng event "Open" để gán khi mở file, và even "BeforeClose" để huỷ gán khi đóng file (Nghĩa là gán phím này chỉ dùng cho file này thôi. Còn nếu muốn gán cho tất cả thì bỏ even "BeforeColse" đi nhé
Mã:
Option Explicit
Private Sub Workbook_Open()
Application.OnKey "^+A", "timdongdau"
Application.OnKey "^+Z", "timdongcuoi"
End Sub
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Application.OnKey "^+A"
Application.OnKey "^+Z"
End Sub
Trong Module/Module 1:
Mã:
Option Explicit
Public Sub timdongdau()
Dim rng As Range, cell As Range
Set rng = ActiveSheet.UsedRange
Set cell = rng.Cells.Find(What:="*", LookIn:=xlValues, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext)
If Not cell Is Nothing Then cell.Select
End Sub
Public Sub timdongcuoi()
Dim rng As Range, cell As Range
Set rng = ActiveSheet.UsedRange
Set cell = rng.Cells.Find(What:="*", LookIn:=xlValues, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlPrevious)
If Not cell Is Nothing Then cell.Select
End Sub
Bạn close và sau đó open file rồi test lại nhé
 

File đính kèm

Mình gán phím Alt-Shift-A và Alt-Shift-Z
Trong ThisWorkbook, bạn dùng event "Open" để gán khi mở file, và even "BeforeClose" để huỷ gán khi đóng file (Nghĩa là gán phím này chỉ dùng cho file này thôi. Còn nếu muốn gán cho tất cả thì bỏ even "BeforeColse" đi nhé
Mã:
Option Explicit
Private Sub Workbook_Open()
Application.OnKey "^+A", "timdongdau"
Application.OnKey "^+Z", "timdongcuoi"
End Sub
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Application.OnKey "^+A"
Application.OnKey "^+Z"
End Sub
Trong Module/Module 1:
Mã:
Option Explicit
Public Sub timdongdau()
Dim rng As Range, cell As Range
Set rng = ActiveSheet.UsedRange
Set cell = rng.Cells.Find(What:="*", LookIn:=xlValues, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext)
If Not cell Is Nothing Then cell.Select
End Sub
Public Sub timdongcuoi()
Dim rng As Range, cell As Range
Set rng = ActiveSheet.UsedRange
Set cell = rng.Cells.Find(What:="*", LookIn:=xlValues, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlPrevious)
If Not cell Is Nothing Then cell.Select
End Sub
Bạn close và sau đó open file rồi test lại nhé
Em cảm ơn anh, em đã chuyển thành Add in và load vào để sử dụng nhưng khi nhấn tổ hợp phím như anh hướng dẫn thì không có tác dụng là sao vậy ạ?
 

File đính kèm

  • 1_151137.png
    1_151137.png
    82 KB · Đọc: 3
  • 2_151153.png
    2_151153.png
    115.6 KB · Đọc: 3
Theo file bài 4 thì vầy cũng được nè

PHP:
Public Sub TimODauTienTrongVungDL()
 Dim Rng As Range, Cls As Range

 Set Rng = ActiveSheet.UsedRange
 MsgBox Rng(0).End(xlToRight).Address
End Sub
 
Lần chỉnh sửa cuối:
. . . .
Set rng = ActiveSheet.UsedRange
Set cell = rng.Cells.Find(What:="*", LookIn:=xlValues, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext)
If Not cell Is Nothing Then cell.Select
. . . .
PHP:
Set Rng = ActiveSheet.UsedRange
Set Cls =Rng(1).Resize( ,Rng.Columns.Count).Find("*",  SearchOrder:=xlByRows)
 
Em chỉnh chút lại như vậy được rồi ạ! nhưng thấy code vẫn hơi chậm và lác nếu nhiều dữ liệu ạ, cảm ơn anh!
Option Explicit

' Phải đặt các macro trong module thông thường (không phải ThisWorkbook hay Sheet)
Public Sub timdongdau()
On Error Resume Next ' Tránh lỗi nếu không có dữ liệu
Dim rng As Range, cell As Range
Set rng = ActiveSheet.UsedRange
Set cell = rng.Find(What:="*", LookIn:=xlValues, LookAt:=xlPart, _
SearchOrder:=xlByRows, SearchDirection:=xlNext)
If Not cell Is Nothing Then cell.Select
On Error GoTo 0
End Sub

Public Sub timdongcuoi()
On Error Resume Next ' Tránh lỗi nếu không có dữ liệu
Dim rng As Range, cell As Range
Set rng = ActiveSheet.UsedRange
Set cell = rng.Find(What:="*", LookIn:=xlValues, LookAt:=xlPart, _
SearchOrder:=xlByRows, SearchDirection:=xlPrevious)
If Not cell Is Nothing Then cell.Select
On Error GoTo 0
End Sub

' Gán phím tắt khi mở workbook
Private Sub Workbook_Open()
Application.OnKey "%+A", "timdongdau" ' Alt+Shift+A
Application.OnKey "%+Z", "timdongcuoi" ' Alt+Shift+Z
End Sub
 
Public Sub timdongdau()
On Error Resume Next ' Tránh lỗi nếu không có dữ liệu
Dim rng As Range, cell As Range
3 Set rng = ActiveSheet.UsedRange
Set cell = rng.Find(What:="*", LookIn:=xlValues, LookAt:=xlPart, _
SearchOrder:=xlByRows, SearchDirection:=xlNext)
If Not cell Is Nothing Then cell.Select
On Error GoTo 0
End Sub
Để tăng tốc code này, mình đề xuất bạn thử thu nhỏ vùng Rng cần tìm kiếm & đó chỉ là hàng đầu của Rng mà thôi;
Sau dòng lệnh mà mình vừa quýnh số 3 nên thêm:
Mã:
 Set rng =rng(1).Resize( , rng.Columns.Count)
 MsgBox rng.Address 
'. . . .   '
 
Để tăng tốc code này, mình đề xuất bạn thử thu nhỏ vùng Rng cần tìm kiếm & đó chỉ là hàng đầu của Rng mà thôi;
Sau dòng lệnh mà mình vừa quýnh số 3 nên thêm:
Mã:
 Set rng =rng(1).Resize( , rng.Columns.Count)
 MsgBox rng.Address
'. . . .   '
Bác sửa giúp em code hoàn chỉnh với ạ, chứ em chưa biết nhiều về code nên nhờ bác giúp với ạ! đoạn code sau cần sửa như nào vậy bác? em đang dùng code như sau, xin được bác tối ưu giúp để hoạt động ổn định và nhanh hơn:
Mã:
Sub Odau()
    On Error Resume Next ' B? qua l?i n?u không tìm th?y d? li?u
    Dim ws As Worksheet
    Set ws = ActiveSheet
    ws.Cells.Find(What:="*", After:=ws.Cells(1, 1), LookIn:=xlFormulas, _
        LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
        MatchCase:=False).Activate
    On Error GoTo 0 ' T?t b? qua l?i
End Sub

Sub Ocuoi()
    On Error Resume Next ' B? qua l?i n?u không tìm th?y d? li?u
    Dim ws As Worksheet
    Set ws = ActiveSheet
    ws.Cells.Find(What:="*", After:=ws.Cells(1, 1), LookIn:=xlFormulas, _
        LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlPrevious, _
        MatchCase:=False).Activate
    On Error GoTo 0 ' T?t b? qua l?i
End Sub
Sub Auto_Open()
    ' Gán phím t?t khi m? file
    Application.OnKey "^+N", "Odau"    ' Ctrl+Shift+N
    Application.OnKey "^+M", "Ocuoi"   ' Ctrl+Shift+M
End Sub
 
Lần chỉnh sửa cuối:
Macro đầu bạn chỉ cần thêm 1 dòng lệnh (đầu) ;
[Còn dòng lệnh MsgBox chỉ để kiểm tra lần đầu mà thôi;]

Còn macro thứ 2 thì cần thêm cách xác định dòng cuối của Rng
có thể sẽ là:
Set Rng=Rng(1).Offset(Rng.Rows.Count).Resize(Rng.Columns.Count)
 
Web KT

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

Back
Top Bottom