Làm sao nhận biết được vùng đang được copy?

Liên hệ QC

Nguyễn Duy Tuân

Nghị Hách
Thành viên danh dự
Tham gia
13/6/06
Bài viết
4,652
Được thích
10,140
Giới tính
Nam
Nghề nghiệp
Giáo viên, CEO tại Bluesofts
Mình có một vướng mắc nhờ các bạn tìm hiểu và chỉ giúp.
Ở sheet1 chọn vùng A1:A10 nhấn copy. Trong VBA có cơ sở nào để nhận biết được vùng đang được copy là A1:A10 ?
 
Anh thử code sau.

Mã:
Sub ChkRange()
If Selection.Rows(1).Address & ":" & Selection.Rows(Selection.Rows.Count).Address = "$A$1:$A$10" Then MsgBox "No day"
End Sub

Mến
 
Gởi Digita
Đáp án của Digita có lẽ không thoả câu hỏi của Tuân rồi. Vì vùng đang active không phải là vùng đang được Copy trong Clipboard.
Thân!
 
Theo tôi đoán thì ý anh Tuân ko phải muốn biết có phải vùng đang dc copy là A1:A10 hay ko... Có lẻ ý anh muốn biết là vùng nào đang nằm trong Clipboard đấy!
Đúng thế ko nhỉ?
ANH TUẤN
 
Gởi Tuân
Bạn xem thử thế này có đúng ý không nhé :
Mã:
Dim OldRange As String

Private Sub Worksheet_SelectionChange(ByVal Target As Excel.Range)
Dim NewRange As String
NewRange = Selection.Address
If Application.CutCopyMode = 0 Then OldRange = NewRange
If Application.CutCopyMode = 1 Then MsgBox OldRange  ' Xem ket qua
End Sub
Thân!
TDN
 
Cũng giống giống như trang web tôi giới thiệu ở trên nhưng ĐẠI UÝ làm ngắn gọn hơn nhiều...
Cám ơn ĐẠI UÝ!
ANH TUẤN
 
tedaynui đã viết:
Gởi Tuân
Bạn xem thử thế này có đúng ý không nhé :
Mã:
Dim OldRange As String

Private Sub Worksheet_SelectionChange(ByVal Target As Excel.Range)
Dim NewRange As String
NewRange = Selection.Address
If Application.CutCopyMode = 0 Then OldRange = NewRange
If Application.CutCopyMode = 1 Then MsgBox OldRange  ' Xem ket qua
End Sub
Thân!
TDN

Nếu vùng copy ở sheet khác thì sao nhỉ ?? Thậm chí là File khác ???


Thân!
 
Gởi Hiếu
Hiếu xem thử File này rồi góp thêm giúp mình nhé. Thanks !
Mã:
Private Sub Workbook_SheetDeactivate(ByVal Sh As Object)
    Call OK
End Sub
'-----------------------
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
    Call OK
End Sub
Mã:
Public OldRange As String
Sub OK()
Dim NewRange As String
NewRange = Selection.Address
If Application.CutCopyMode = 0 Then _
    OldRange = ActiveWorkbook.Name & " : " & ActiveSheet.Name & "!" & NewRange
If Application.CutCopyMode = 1 Then MsgBox OldRange  ' Xem ket qua
End Sub
Thân!
 

File đính kèm

  • Xac dinh vung Copy trong ClipBoard.zip
    12.1 KB · Đọc: 32
Lần chỉnh sửa cuối:
Vừa thử xong... có lý quá ĐẠI UÝ ơi...
Tuy nhiên khi copy vùng tại 1 file khác rồi quay lại file này đáng lý ra phải chỉ định tên file nữa chứ... (Sheet3!$.... thì e rằng ko biết nó ở đâu)
ANH TUẤN
 
anhtuan1066 đã viết:
Vừa thử xong... có lý quá ĐẠI UÝ ơi...
Tuy nhiên khi copy vùng tại 1 file khác rồi quay lại file này đáng lý ra phải chỉ định tên file nữa chứ... (Sheet3!$.... thì e rằng ko biết nó ở đâu)
ANH TUẤN
Hi hi, nếu anh muốn Sheet nào của Workbook khác thì anh thêm code này vào Sheet đó
Mã:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Application.Run "'Xac dinh vung Copy trong ClipBoard.xls'!OK"
End Sub
Hiện thời thì em chưa nghĩ ra cách khác, anh giai thông cảm hén.

Thân !
 
Cảm ơn các bác đã nghiên cứu giúp.

anhtuan1066 đã viết:
Theo tôi đoán thì ý anh Tuân ko phải muốn biết có phải vùng đang dc copy là A1:A10 hay ko... Có lẻ ý anh muốn biết là vùng nào đang nằm trong Clipboard đấy!
Đúng thế ko nhỉ?

Vâng, nếu biết được đối tượng Range hay Object của Excel nằm trong Clipboard thì tốt quá nhưng em sợ hơi khó. Vấn đề em muốn biết đích xác vùng đang được chọn Copy/Cut.

Theo chỉ dẫn của bạn tedaynui mình cũng đã nghĩ đến nhưng bị sai trong trường hợp sau:
Khi chọn lệnh Copy ở tại Sheet1, ô A1 (Sheet1!A1), sau đó chọn tiếp A2 và chọn lệnh Copy thì các thông báo luôn luôn vẫn chỉ là Sheet1!A1 (đúng phải là Sheet1!A2)
Trường hợp trên chỉ chạy đúng nếu trước khi nhấn copy thì phải nhấn phím ESC đã (khi đó Application.CutCopyMode = 0 và OldRange sẽ nhận địa chỉ mới bởi OldRange = NewRange)

Về đoạn code trong file của tedaynui có đoạn
Mã:
Public OldRange As String

Sub OK()
Dim NewRange As String
NewRange = Selection
If Application.CutCopyMode = 0 Then _
    OldRange = ActiveWorkbook.Name & " : " & ActiveSheet.Name & "!" & NewRange
If Application.CutCopyMode = 1 Then MsgBox OldRange  ' Xem ket qua
End Sub

Theo mình làm thế này tiện hơn
Mã:
Public OldRange As String

Sub OK()
Dim NewRange As String
NewRange = Selection[COLOR="Blue"].Address(1, 1, 1, True)[/COLOR]
If Application.CutCopyMode = 0 Then OldRange = NewRange
If Application.CutCopyMode = 1 Then MsgBox OldRange  ' Xem ket qua
End Sub

Vấn đề này mình nghĩ mãi vẫn chưa ra, rất mong các bác tiếp tục nghiên cứu giúp.
 
Lần chỉnh sửa cuối:
À, thì ra ý bạn Tuấn là làm sao bẩy được cái copy cut event và khi bẩy được nó rồi thì coi cái vùng được cut/copy có phải là A1:A10 trước khi c. Có phải vậy không?

Dùng cái Change event không thì không ổn trong việc này. Chỉ còn giải pháp là disable cut / copy trên thanh menu rồi dùng thủ tục OnKey để bẩy lệnh cut / copy rồi bước cuối cùng là kiểm tra địa chỉ vùng được chọn.

Nếu quí vị nào có cách khác nữa thì xin chỉ dùm.

Mến
 
- Đếm số ô được chọn, các bác sem chơi cho vui :-=!!!

Mã:
Sub CountSelectedCells()
    On Error Resume Next
    Dim visiCells As Long
    If TypeName(Selection) <> "Range" Then
        MsgBox "Please select a range.     ", vbExclamation, "Count Selected Cells"
        Exit Sub
    Else
        visiCells = MsgBox("Do you want to count only filtered cells?     " & vbNewLine & "(Push ""No"" to count all selected cells)", _
                           vbQuestion + vbYesNo, "Count Selected Cells")
        If visiCells = vbYes And Selection.Cells.Count > 1 Then Selection.Cells.SpecialCells(xlCellTypeVisible).Select
        If Selection.Cells.Count = 1 Then
            MsgBox "There is 1 cell selected.", , "Count Selected Cells"
        Else
            MsgBox "There are " & Selection.Cells.Count & " cells selected.", , "Count Selected Cells"
        End If
    End If
End Sub
 
Web KT
Back
Top Bottom