Giúp mình code Mouse move khi rê chuột lên cell

Liên hệ QC
Tôi tuân thủ nội quy khi đăng bài

thinhdje

Thành viên mới
Tham gia
10/6/13
Bài viết
19
Được thích
2
Giả sử mình có hai cột là A và B, đều có giá trị, mình ẩn cột B. Mình muốn khi rê chuột lên bất kỳ cell nào của cột A thì sẽ hiển thị dạng note với nội dung là nội dung của cell liền kề ở cột B (bị ẩn)
Nhờ các cao thủ chỉ giúp, thưc ra mình cần trong Google Sheet, nếu đc trong GSheet thi càng tốt.
Xin cám ơn.
 
Ôi giời, buồn vụ gì chứ? Quan trọng là con thỏ thì thích ăn củ cải còn con cá thì thích ăn con giun con dế. Nhu cầu thực tế của người dùng đa dạng lắm mọi người ạ.
Vấn đề là chủ thớt thích cái MouseMove cơ
Dạ, thực ra ko bắt buộc là MouseMove đâu anh, mục đích là đưa chuột qua cell Cột A thì hiện thị thông tin cell Cột B (bị ẩn) bên cạnh. Ý tưởng đưa vào Commnet của anh theo em là hợp lý, để e thử code anh gửi có gì cho anh hay.
Các cao thủ có ý tưởng gì khác cho đề bài này thì cho em xin lĩnh hội luôn nha.
Xin cám ơn
 
Upvote 0
Các cao thủ có ý tưởng gì khác cho đề bài này thì cho em xin lĩnh hội luôn nha.
Cao thủ với ý tưởng cái monkey á. Chừng đó bài đến giờ còn chưa thử hết. Cảm ơn bài #11 từ bài #14 đến giờ vẫn còn "để em thử code...", ở đó mà lĩnh hội, lĩnh họp.
 
Upvote 0
Dạ, thực ra ko bắt buộc là MouseMove đâu anh, mục đích là đưa chuột qua cell Cột A thì hiện thị thông tin cell Cột B (bị ẩn) bên cạnh. Ý tưởng đưa vào Commnet của anh theo em là hợp lý, để e thử code anh gửi có gì cho anh hay.
Các cao thủ có ý tưởng gì khác cho đề bài này thì cho em xin lĩnh hội luôn nha.
Xin cám ơn
Tiện thể tớ muốn hỏi ứng dụng vào việc gì thì chia sẻ nhé.
 
Upvote 0
1685535173427.png
Để rõ hơn thì vd này: các giá trị OK1 sẽ từ mức 22% trở lên. Khi mình muốn đánh giá ưu tiên cái nào sử dụng trước thì mình để chuột lên bất kì cell nào của cột F nó sẽ xuất hiện thông tin % tương ứng của cột G (bị ẩn) dạng comment hoặc note. Giá trị cột G là kết quả của hàm lấy từ các thông số khác tùy dữ liệu nạp vào, chứ ko cố định.
 
Upvote 0
View attachment 290850
Để rõ hơn thì vd này: các giá trị OK1 sẽ từ mức 22% trở lên. Khi mình muốn đánh giá ưu tiên cái nào sử dụng trước thì mình để chuột lên bất kì cell nào của cột F nó sẽ xuất hiện thông tin % tương ứng của cột G (bị ẩn) dạng comment hoặc note. Giá trị cột G là kết quả của hàm lấy từ các thông số khác tùy dữ liệu nạp vào, chứ ko cố định.
Nếu thế này thì Group hay hơn, nhìn được vài dòng liên tục.
 
Upvote 0
Group cột hả bạn? mình đang Group đó, nhưng muốn xem lại phải mở ra, mà mình ko muốn tăng bề rộng của bảng
Cơ bản là với cái ảnh thì muốn biết % cái nào lớn hơn nữa thì phải di chuột đến từng ô cũng mất thời gian phết. Nhu cầu hơi khó hiểu.
Tớ hỏi kỹ vì tớ chỉ thấy cái này có tác dụng nếu cột ẩn quá dài, mà yêu cầu chỉ muốn thể hiện ngắn gọn ý chính thì còn hợp lý. VD áp dụng trong biểu đồ Gantt chẳng hạn. Chứ như thế kia, trước khi đóng lại thì ta click Group là xong.
Hiện tại tớ chỉ thấy nó hợp với anh em xây dựng về quản lý dự án, viết hồi ký thi công.

Mousemove lại vô tình nằm trong Sub của bác Hải, chốt lại excel thực sự có sự kiện mousemove đặc chủng.
 
Upvote 0
@thinhdje Dùng hàm UDF được không bạn:

Gõ tại ô G2 =LiveComment(<giá trị G2>,F2) Fill xuống

Mã:
Function LiveComment(value, refCell As Range)
  On Error Resume Next
  With refCell
    If Not .Comment Is Nothing Then .ClearComments
    With .AddComment(CStr(value)).shape
        With .TextFrame
          .AutoSize = 1
          .AutoSize = 0
        End With
      .Width = .Width + 20
    End With
  End With
  LiveComment = value
End Function
 
Upvote 0
Việc rê chuột lên cell và hiển thị thông tin, có rất nhiều câu hỏi yêu cầu việc này.
Như tôi đã đề cập bài trước, VBA không nhận biết được việc mouse hover lên cell, nhưng shape/object thì OK.
Do đó, đã có trường hợp "lách" bằng cách lồng object vào cell (vẽ 1 hình chữ nhật và lồng vào cell, ví dụ: A1), ẩn nó đi. Như vậy, tại ô A1 có 2 lớp: cell và object.
Khi rê chuột lên A1, đồng nghĩa sự kiện mousehover xảy ra cho object, việc còn lại là chỉ việc viết code lấy vị trí của object này.
 
Upvote 0
Cơ bản là với cái ảnh thì muốn biết % cái nào lớn hơn nữa thì phải di chuột đến từng ô cũng mất thời gian phết. Nhu cầu hơi khó hiểu.
Tớ hỏi kỹ vì tớ chỉ thấy cái này có tác dụng nếu cột ẩn quá dài, mà yêu cầu chỉ muốn thể hiện ngắn gọn ý chính thì còn hợp lý. VD áp dụng trong biểu đồ Gantt chẳng hạn. Chứ như thế kia, trước khi đóng lại thì ta click Group là xong.
Hiện tại tớ chỉ thấy nó hợp với anh em xây dựng về quản lý dự án, viết hồi ký thi công.

Mousemove lại vô tình nằm trong Sub của bác Hải, chốt lại excel thực sự có sự kiện mousemove đặc chủng.
Do công việc mình hay sử dụng bằng điện thoại mở file nên muốn luôn để trạng thái ít cột nhất có thể, chứ nếu chỉ máy tính thì ko thành vấn đề
 
Upvote 0
Có liên quan nên em hỏi luôn.
Em muốn khống chế bề rộng comment là 500, chiều cao auto vừa khít theo số lượng text tràn xuống.
Có code được vậy không ạ?
 
Upvote 0
Trên bảng tính excel không có sự kiện Mouse Move, nhưng có thể ăn gian bằng cách chạy code nạp hết cột B vào comment thì khi ta đưa chuột đến ô nào đó của cột A thì comment sẽ tự hiện ra. Tuy nhiên thấy kỳ kỳ nên không muốn code
Xử lý theo kiểu tham chiếu A để lấy dòng & từ đó hiện thì nội dung B
 
Upvote 0
@thinhdje Dùng hàm UDF được không bạn:

Gõ tại ô G2 =LiveComment(<giá trị G2>,F2) Fill xuống

Mã:
Function LiveComment(value, refCell As Range)
  On Error Resume Next
  With refCell
    If Not .Comment Is Nothing Then .ClearComments
    With .AddComment(CStr(value)).shape
        With .TextFrame
          .AutoSize = 1
          .AutoSize = 0
        End With
      .Width = .Width + 20
    End With
  End With
  LiveComment = value
End Function
Hàm này là đúng ý mình nhất. Cám ơn bạn rất nhiều nhiều
1685593875437.png
Mình muốn cho kích thước comment vừa fix với nội dung, thử thay đổi các thông số mà chưa đc. Mình hơi dốt VB :D
 
Upvote 0
@thinhdje Dùng hàm UDF được không bạn:

Gõ tại ô G2 =LiveComment(<giá trị G2>,F2) Fill xuống

Mã:
Function LiveComment(value, refCell As Range)
  On Error Resume Next
  With refCell
    If Not .Comment Is Nothing Then .ClearComments
    With .AddComment(CStr(value)).shape
        With .TextFrame
          .AutoSize = 1
          .AutoSize = 0
        End With
      .Width = .Width + 20
    End With
  End With
  LiveComment = value
End Function
Khi mình đưa và Google Sheet thì nó báo lỗi này:
1685596742628.png
Liệu có dùng trong GS được ko bạn?
 
Upvote 0
@thinhdje Không còn cách nào khác:
(***VBA không thể đưa vào Google Spreadsheets)


JavaScript:
'                    _,
' ___   _   _  _ ___(_)
'/ __| / \ | \| | _ | |
'\__ \/ \ \| \\ | _ \ |
'|___/_/ \_|_|\_|___/_|
'
Option Explicit
#If VBA7 Then
#Else
  Public Enum LongLong:[_]:End Enum
  #If Win64 Then
  #Else
    Public Enum LongPtr:[_]:End Enum
  #End If
#End If

Public Const PtrNull As LongPtr = 0
Private Type TypeArguments
  Caller As Range
  comment As String
  cells As Variant
  FontBold As Boolean
  FontSize As Single
End Type

#If VBA7 Then
  Private Declare PtrSafe Function SetTimer Lib "USER32" (ByVal hWnd As LongPtr, ByVal nIDEvent As LongPtr, ByVal uElapse As LongPtr, ByVal lpTimerFunc As LongPtr) As Long
  Private Declare PtrSafe Function KillTimer Lib "USER32" (ByVal hWnd As LongPtr, ByVal nIDEvent As LongPtr) As Long
#Else
  Private Declare Function SetTimer Lib "user32" (ByVal HWnd As Long, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As Long) As Long
  Private Declare Function KillTimer Lib "user32" (ByVal HWnd As Long, ByVal nIDEvent As Long) As Long
#End If

Private Works() As TypeArguments

Function LiveComment(value, ParamArray cells())
  LiveComment = value
  On Error Resume Next
  Dim k%, rg: Set rg = Application.ThisCell
  LiveComment = value
  k = UBound(Works): k = k + 1: ReDim Preserve Works(1 To k)
  With Works(k): Set .Caller = rg: .comment = value: .cells = cells: End With
  Call SetTimer(0&, 0&, 0, AddressOf LiveComment_callback)
End Function

Private Sub LiveComment_callback(ByVal hWnd As LongPtr, ByVal wMsg As LongPtr, ByVal idEvent As LongPtr, ByVal dwTime As LongPtr)
  On Error Resume Next
  KillTimer 0&, idEvent
  Dim lr&, UA%, i&, b As TypeArguments, cell
  UA = UBound(Works)
  For i = 1 To UA
    b = Works(i)
    For Each cell In b.cells
      If TypeName(cell) = "Range" Then
        cell.comment.Delete
        cell.AddComment b.comment
        With cell.comment
          .Shape.TextFrame.AutoSize = 0
          .Shape.TextFrame.AutoSize = 1
          .Shape.Width = .Shape.Width + 10
        End With
      End If
    Next
  Next
  Erase Works
  On Error GoTo 0
End Sub
 
Upvote 0
@thinhdje Không còn cách nào khác:
(***VBA không thể đưa vào Google Spreadsheets)


JavaScript:
'                    _,
' ___   _   _  _ ___(_)
'/ __| / \ | \| | _ | |
'\__ \/ \ \| \\ | _ \ |
'|___/_/ \_|_|\_|___/_|
'
Option Explicit
#If VBA7 Then
#Else
  Public Enum LongLong:[_]:End Enum
  #If Win64 Then
  #Else
    Public Enum LongPtr:[_]:End Enum
  #End If
#End If

Public Const PtrNull As LongPtr = 0
Private Type TypeArguments
  Caller As Range
  comment As String
  cells As Variant
  FontBold As Boolean
  FontSize As Single
End Type

#If VBA7 Then
  Private Declare PtrSafe Function SetTimer Lib "USER32" (ByVal hWnd As LongPtr, ByVal nIDEvent As LongPtr, ByVal uElapse As LongPtr, ByVal lpTimerFunc As LongPtr) As Long
  Private Declare PtrSafe Function KillTimer Lib "USER32" (ByVal hWnd As LongPtr, ByVal nIDEvent As LongPtr) As Long
#Else
  Private Declare Function SetTimer Lib "user32" (ByVal HWnd As Long, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As Long) As Long
  Private Declare Function KillTimer Lib "user32" (ByVal HWnd As Long, ByVal nIDEvent As Long) As Long
#End If

Private Works() As TypeArguments

Function LiveComment(value, ParamArray cells())
  LiveComment = value
  On Error Resume Next
  Dim k%, rg: Set rg = Application.ThisCell
  LiveComment = value
  k = UBound(Works): k = k + 1: ReDim Preserve Works(1 To k)
  With Works(k): Set .Caller = rg: .comment = value: .cells = cells: End With
  Call SetTimer(0&, 0&, 0, AddressOf LiveComment_callback)
End Function

Private Sub LiveComment_callback(ByVal hWnd As LongPtr, ByVal wMsg As LongPtr, ByVal idEvent As LongPtr, ByVal dwTime As LongPtr)
  On Error Resume Next
  KillTimer 0&, idEvent
  Dim lr&, UA%, i&, b As TypeArguments, cell
  UA = UBound(Works)
  For i = 1 To UA
    b = Works(i)
    For Each cell In b.cells
      If TypeName(cell) = "Range" Then
        cell.comment.Delete
        cell.AddComment b.comment
        With cell.comment
          .Shape.TextFrame.AutoSize = 0
          .Shape.TextFrame.AutoSize = 1
          .Shape.Width = .Shape.Width + 10
        End With
      End If
    Next
  Next
  Erase Works
  On Error GoTo 0
End Sub
Đã thử đoạn code này trong GS mà vẫn không lưu đc, vậy chắc hết cách làm trong GS rồi, :(
 
Upvote 0
Web KT
Back
Top Bottom