SendKeys Ctrl + Home, Nhờ làm rõ đoạn code. (5 người xem)

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

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

OverAC

Đỗ Nguyên Bình
Thành viên BQT
Administrator
Tham gia
30/5/06
Bài viết
2,695
Được thích
15,103
Gởi mọi người nhờ giúp hộ chổ Sendkeys.
Mục tiêu của đoạn code này: Lướt qua tất cả các sheet và nhấn Ctrl Home cho mỗi sheet để con trỏ (ô hiện hành) nhãy về ô đầu tiên.
Ô đầu tiên không hẳn là ô A1 trong trường hợp sheet có Freeze Pane thì ô đầu tiên là sau freeze pane hiện tại em biết là chỉ có thể về đó bằng Ctrl + Home.
PHP:
Sub AnySheetgoHome()
Dim sheetbatdau As String
Dim i As Long
    Application.EnableEvents = False
    sheetbatdau = ActiveSheet.Name
    For i = 1 To Sheets.Count
        If Sheets(i).Visible = True Then
            Sheets(i).Activate
            Application.Sheets(i).SendKeys "^{HOME}"
        End If
    Next i
    Sheets(sheetbatdau).Activate
    Application.EnableEvents = True
End Sub

Thân cảm ơn mọi người
OverAC
 
Anh nghĩ em có thể dùng

Mã:
Sub Test()

    Dim WsObj As Worksheet

    For Each WsObj In ThisWorkbook.Worksheets
        With WsObj
            .Activate
            .Range("A1").Select
        End With
    Next WsObj
End Sub

Cái này của em sai:
Mã:
Application.Sheets(i).SendKeys "^{HOME}"
Phải như vầy mới đúng
Mã:
Application.SendKeys

LVD
 
Upvote 0
Vầy nó mới chạy nè:
PHP:
Sub AnySheetgoHome()
  Dim i As Long, StSh As Worksheet
  Set StSh = ActiveSheet
  For i = 1 To Sheets.Count
    Sheets(i).Activate
    ActiveSheet.Cells(ActiveWindow.SplitRow + 1, ActiveWindow.SplitColumn + 1).Select
  Next i
  StSh.Activate
End Sub
 
Upvote 0
Vầy nó mới chạy nè:
PHP:
Sub AnySheetgoHome()
  Dim i As Long, StSh As Worksheet
  Set StSh = ActiveSheet
  For i = 1 To Sheets.Count
    Sheets(i).Activate
    ActiveSheet.Cells(ActiveWindow.SplitRow + 1, ActiveWindow.SplitColumn + 1).Select
  Next i
  StSh.Activate
End Sub

Anh ơi, chú ý cho em cái Sheets Object.
Nên đôi khi anh dùng như trên sẽ báo lỗi.

Lê Văn Duyệt
 
Upvote 0
Anh ơi, chú ý cho em cái Sheets Object.
Nên đôi khi anh dùng như trên sẽ báo lỗi.

Lê Văn Duyệt
Ăn tiền vẫn là đoạn:
ActiveSheet.Cells(ActiveWindow.SplitRow + 1, ActiveWindow.SplitColumn + 1).Select

Còn chuyện sau đó thêm mắm muối thế nào là chuyện của các bạn chứ
Ẹc... Ẹc...
 
Upvote 0
Ăn tiền vẫn là đoạn:
ActiveSheet.Cells(ActiveWindow.SplitRow + 1, ActiveWindow.SplitColumn + 1).Select

Còn chuyện sau đó thêm mắm muối thế nào là chuyện của các bạn chứ
Ẹc... Ẹc...
Cách này của bác không được đâu. Thứ nhất là với dạng bài này thì phải dùng GoTo kết hợp với Scroll=True, vì Select thì nó không tự động scroll. Thứ 2 là ActiveSheet.Cells(ActiveWindow.SplitRow + 1, ActiveWindow.SplitColumn + 1) chưa chắc đã trả về ô đầu tiên của vùng Split đâu(khác với Ctrl+Home).
 
Upvote 0
Giờ mới biết bác đang làm gì? Thật là! Hiiii
Bác xem code vầy có dùng được không? Đơn giản mà!
Hoặc là do em suy nghĩ đơn giản quá chăng?
PHP:
Sub AnySheetgoHome()
  Dim Sh As Worksheet
  For Each Sh In Worksheets
    Sh.Visible = -1
    Sh.Select
    Range("A1").Select
  Next
End Sub
Thân.
 
Upvote 0
Cách này của bác không được đâu. Thứ nhất là với dạng bài này thì phải dùng GoTo kết hợp với Scroll=True, vì Select thì nó không tự động scroll. Thứ 2 là ActiveSheet.Cells(ActiveWindow.SplitRow + 1, ActiveWindow.SplitColumn + 1) chưa chắc đã trả về ô đầu tiên của vùng Split đâu(khác với Ctrl+Home).
Vậy thì thử xem file đính kèm!
Bạn kiểm tra dùm xem nó khác Ctrl + HOME ở chổ nào
Tôi làm cuộc thí nghiệm với đoạn code nhỏ:
PHP:
Sub Test()
  MsgBox ActiveWindow.SplitRow
End Sub
Nó cho kết quả giống nhau trong cả 2 trường hợp dùng Freeze PanesSplit
-------------
Với Po: Ctrl + Home không phải lúc nào cũng nhảy đến cell A1 đâu nha! (thử bấm Ctrl + Home với sheet có Freeze Panes xem)
------------
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Vậy thì thử xem file đính kèm!
Bạn kiểm tra dùm xem nó khác Ctrl + HOME ở chổ nào
Tôi làm cuộc thí nghiệm với đoạn code nhỏ:
PHP:
Sub Test()
  MsgBox ActiveWindow.SplitRow
End Sub
Nó cho kết quả giống nhau trong cả 2 trường hợp dùng Freeze PanesSplit
-------------
Với Po: Ctrl + Home không phải lúc nào cũng nhảy đến cell A1 đâu nha! (thử bấm Ctrl + Home với sheet có Freeze Panes xem)
------------
Bác xem thử Sheet5 tôi mới thêm vào xem nó có giống Ctrl+Home không nhé.
 

File đính kèm

Upvote 0
Ăn tiền vẫn là đoạn:
ActiveSheet.Cells(ActiveWindow.SplitRow + 1, ActiveWindow.SplitColumn + 1).Select

Sheets Object bao gồm luôn cả ChartSheet.
Em lấy ví dụ, anh hãy click phải chuột vào bất kỳ Tab nào bên dưới và chon Insert, sau đó anh chọn Chart.
Rồi anh run đoạn code của anh xem, nó sẽ báo lỗi. (Đây là vấn đề em nói)

Lê Văn Duyệt
 
Upvote 0
Em hiểu rồi!
Em thấy người ta có xét thêm trường hợp FreezePanes = True nữa nè!
PHP:
If Not ActiveWindow.FreezePanes Then
Cells(1).Select
Else
Cells(ActiveWindow.SplitRow + 1, ActiveWindow.SplitColumn + 1).Select
End If
Thân.
 
Upvote 0
Các bác thử code này xem sao.
Mã:
Sub CtrlHome()
  Dim Sh As Worksheet
  For Each Sh In Worksheets
    Sh.Activate
    ActiveWindow.ScrollRow = 1
    ActiveWindow.ScrollColumn = 1
    Application.Goto Cells(ActiveWindow.ScrollRow, ActiveWindow.ScrollColumn), True
  Next
End Sub
Với bài này mà duyệt qua các Sheet rồi dùng SendKeys thì hình như chỉ tác động đến Sheet cuối cùng mà nó duyệt qua thôi thì phải???
 
Upvote 0
Bác xem thử Sheet5 tôi mới thêm vào xem nó có giống Ctrl+Home không nhé.
OK... vậy sửa lại vầy!
PHP:
Sub AnySheetgoHome()
  Dim i As Long, StSh As Worksheet
  Set StSh = ActiveSheet
  For i = 1 To Sheets.Count
    Sheets(i).Activate
    If ActiveWindow.Panes.Count = 1 Then
       Range("A1").Select
    Else:
      With ActiveWindow.Panes(ActiveWindow.Panes.Count)
        ActiveSheet.Cells(.ScrollRow, .ScrollColumn).Select
      End With
    End If
  Next i
  StSh.Activate
End Sub
Bạn kiểm tra lại thử xem có gì không ổn không?
 

File đính kèm

Upvote 0
Em viết lần cuối thì đơn giản vậy thôi!
Vậy thì thêm vô vậy!--=0
PHP:
Sub AnySheetgoHome()
  Dim StSh As Worksheet, Sh As Worksheet
  Set StSh = ActiveSheet
  For Each Sh In Worksheets
    Sh.Activate
    With ActiveWindow
    If Not .FreezePanes Then
        Cells(1).Select
    Else
        .ScrollRow = 1
        .ScrollColumn = 1
        Sh.Cells(.ScrollRow, .ScrollColumn).Select
    End If
    End With
  Next
  StSh.Activate
End Sub
Thân.
 
Lần chỉnh sửa cuối:
Upvote 0
Theo em thì các bác không nhất thiết phải kiểm tra Freeze, nhưng code của 2 bác vẫn chưa ổn. Của em có 2 dòng này
Mã:
    ActiveWindow.ScrollRow = 1
    ActiveWindow.ScrollColumn = 1
còn của 2 bác thì không có. Nếu với trường hợp ở Sheet5 trong file em gửi lần trước, các bác kéo thành Scroll dọc xuống dưới hoặc Scroll ngang sang trái hoặc cả 2 là code của 2 bác không đúng ngay.
 
Upvote 0
Theo em thì các bác không nhất thiết phải kiểm tra Freeze, nhưng code của 2 bác vẫn chưa ổn. Của em có 2 dòng này
Mã:
    ActiveWindow.ScrollRow = 1
    ActiveWindow.ScrollColumn = 1
còn của 2 bác thì không có. Nếu với trường hợp ở Sheet5 trong file em gửi lần trước, các bác kéo thành Scroll dọc xuống dưới hoặc Scroll ngang sang trái hoặc cả 2 là code của 2 bác không đúng ngay.
Hoàn toàn chính xác!
Cái Panes này quả thật khá rắc rối!
Thì ra
ActiveWindow.ScrollRow = 1

ActiveWindow.ScrollColumn = 1
dùng để "kéo" 2 thanh trượt về vị trí ban đầu ---> Giãi pháp.. TUYỆT! ---> ĐƠN GIÃN VÀ HIỆU QUẢ
----------------
Và nếu được đến công đoạn này rồi thì có cần thiết phải Application.Goto không nhỉ
Tôi nghĩ rằng:
PHP:
    With ActiveWindow
      .ScrollRow = 1: .ScrollColumn = 1
      ActiveSheet.Cells(.ScrollRow, .ScrollColumn).Select
    End With
Thế là được ---> Bạn nghĩ sao?
 
Lần chỉnh sửa cuối:
Upvote 0
Giờ bực rồi! Chơi cách tà đạo luôn! Khà khà khà!
PHP:
Sub AnySheetgoHome()
  Dim StSh As Worksheet
  Set StSh = ActiveSheet
  For i = 1 To Worksheets.Count
  Application.SendKeys "^{PGUP}"
  Next i
  For i = 1 To Worksheets.Count
    Application.SendKeys "^{HOME}", True
    Application.SendKeys "^{PGDN}"
  Next i
  StSh.Activate
End Sub
Thân.
 
Upvote 0
Web KT

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

Back
Top Bottom