Add in di chuyển đến ô đầu tiên và ô cuối cùng trong sheet (2 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