Có đoạn code nào biến mọi thao tác dán thành Paste Values không?

Liên hệ QC

nghiaphuc

Thành viên gạo cội
Thành viên danh dự
Tham gia
25/9/09
Bài viết
5,729
Được thích
8,854
Giới tính
Nam
Nghề nghiệp
Giáo viên
Mình có làm một chương trình quản lý điểm cho trường và mình gặp một vấn đề như sau:
Trong bảng tính, mình đã định dạng nhất quán khung, nền, font chữ, cỡ chữ, CF,... rồi, nhưng khi giáo viên copy điểm từ file điểm cá nhân của họ vào chương trình (vì đây là chương trình dùng chung cho tất cả các môn, các lớp) thì những định dạng ban đầu của mình thường bị biến đổi. Mặc dù nó chẳng làm thay đổi gì chức năng của chương trình (trừ những thứ liên quan đến Validation) nhưng về mặt thẩm mỹ thì rất khó chịu.
Thực tế thì mình đã hướng dẫn rất nhiều lần về thao tác Paste Values, thậm chí mình còn kéo nút Paste Values lên thanh Menu và đặt phím tắt cho nó, nhưng có lẽ do thói quen khó bỏ nên thường thì giáo viên cứ nhấn nút Paste hoặc nhấn Ctrl+V để dán.
Vậy, xin hỏi: Liệu có đoạn code nào có thể biến mọi thao tác dán thành Paste Values không? Ít nhất là biến 2 thao tác: nhấn nút Paste và nhấn Ctrl+V thành Paste Values.
Rất mong nhận được câu trả lời của các anh, chị, em.
Xin chân thành cảm ơn!
 
Mình có làm một chương trình quản lý điểm cho trường và mình gặp một vấn đề như sau:
Trong bảng tính, mình đã định dạng nhất quán khung, nền, font chữ, cỡ chữ, CF,... rồi, nhưng khi giáo viên copy điểm từ file điểm cá nhân của họ vào chương trình (vì đây là chương trình dùng chung cho tất cả các môn, các lớp) thì những định dạng ban đầu của mình thường bị biến đổi. Mặc dù nó chẳng làm thay đổi gì chức năng của chương trình (trừ những thứ liên quan đến Validation) nhưng về mặt thẩm mỹ thì rất khó chịu.
Thực tế thì mình đã hướng dẫn rất nhiều lần về thao tác Paste Values, thậm chí mình còn kéo nút Paste Values lên thanh Menu và đặt phím tắt cho nó, nhưng có lẽ do thói quen khó bỏ nên thường thì giáo viên cứ nhấn nút Paste hoặc nhấn Ctrl+V để dán.
Vậy, xin hỏi: Liệu có đoạn code nào có thể biến mọi thao tác dán thành Paste Values không? Ít nhất là biến 2 thao tác: nhấn nút Paste và nhấn Ctrl+V thành Paste Values.
Rất mong nhận được câu trả lời của các anh, chị, em.
Xin chân thành cảm ơn!
Chắc là phải dùng Onkey thôi
PHP:
Sub Auto_Open()
  Application.OnKey "^v", "PasteValue"
  CommandBars("Cell").Controls("Paste").OnAction = "PasteValue"
  CommandBars("Edit").Controls("Paste").OnAction = "PasteValue"
End Sub
PHP:
Sub PasteValue()
  Selection.PasteSpecial 3
End Sub
Và để reset mấy Action này:
PHP:
Sub Auto_Close()
  Application.OnKey "^v"
  CommandBars("Cell").Reset
  CommandBars("Edit").Reset
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Bạn lưu ý code của bác NDU phần ICON chỉ tác dụng trên Excel 2003 mà thôi.

Chắc là phải dùng Onkey thôi
PHP:
Sub Auto_Open()
  Application.OnKey "^v", "PasteValue"
  CommandBars("Cell").Controls("Paste").OnAction = "PasteValue"
  CommandBars("Edit").Controls("Paste").OnAction = "PasteValue"
End Sub
PHP:
Sub PasteValue()
  Selection.PasteSpecial 3
End Sub
 
Upvote 0
Mình có làm một chương trình quản lý điểm cho trường và mình gặp một vấn đề như sau:
Trong bảng tính, mình đã định dạng nhất quán khung, nền, font chữ, cỡ chữ, CF,... rồi, nhưng khi giáo viên copy điểm từ file điểm cá nhân của họ vào chương trình (vì đây là chương trình dùng chung cho tất cả các môn, các lớp) thì những định dạng ban đầu của mình thường bị biến đổi. Mặc dù nó chẳng làm thay đổi gì chức năng của chương trình (trừ những thứ liên quan đến Validation) nhưng về mặt thẩm mỹ thì rất khó chịu.
Thực tế thì mình đã hướng dẫn rất nhiều lần về thao tác Paste Values, thậm chí mình còn kéo nút Paste Values lên thanh Menu và đặt phím tắt cho nó, nhưng có lẽ do thói quen khó bỏ nên thường thì giáo viên cứ nhấn nút Paste hoặc nhấn Ctrl+V để dán.
Vậy, xin hỏi: Liệu có đoạn code nào có thể biến mọi thao tác dán thành Paste Values không? Ít nhất là biến 2 thao tác: nhấn nút Paste và nhấn Ctrl+V thành Paste Values.
Rất mong nhận được câu trả lời của các anh, chị, em.
Xin chân thành cảm ơn!

Với tình huống như của bạn tôi thường làm như sau: thay vì lưu ý người dùng không được làm gì gì đó... thì tôi cứ để cho họ làm thoải mái (tức là chẳng cần phải dặn dò gì vì có dặn thì chắc gì họ đã nghe như bạn đã thấy) cái quan trọng nhất tôi cần là dữ liệu họ nhập vào. Còn muốn định dạng bảng tính như thế nào thì ta viết sẵn code Format_Table với các chức năng: PasteValues, Font, Borders, Patterns... rồi dùng một sự kiện nào đó như Worksheet_Change hoặc Worksheet_BeforeRightClick chẳng hạn để gọi nó, như vậy ta luôn có một bảng tính như ý mà chẳng cần phải yêu cầu người khác chú ý điều gì.
Xin được lưu ý: đừng nghĩ rằng như vậy là chậm và mất thời gian nha với bảng tính khoảng 50 cột và 10000 dòng thì thời gian nó làm tất cả các công việc trên còn nhanh hơn thời gian bạn thực hiện 1 động tác Copy và Paste.
 
Upvote 0
Chắc là phải dùng Onkey thôi
PHP:
Sub Auto_Open()
Application.OnKey "^v", "PasteValue"
CommandBars("Cell").Controls("Paste").OnAction = "PasteValue"
CommandBars("Edit").Controls("Paste").OnAction = "PasteValue"
End Sub
PHP:
Sub PasteValue()
Selection.PasteSpecial 3
End Sub
Và để reset mấy Action này:
PHP:
Sub Auto_Close()
Application.OnKey "^v"
CommandBars("Cell").Reset
CommandBars("Edit").Reset
End Sub

Vẫn còn chổ để dán tại CommandBars("Standard")
Thêm cặp lệnh sau vào cho hết đường dán
Lúc open
Application.CommandBars("Standard").Controls("&Paste").Enabled = False
Lúc Close
Application.CommandBars("Standard").Reset
Hi ... múa rìu qua mắt thợ!
 
Upvote 0
Vẫn còn chổ để dán tại CommandBars("Standard")
Thêm cặp lệnh sau vào cho hết đường dán
Lúc open
Application.CommandBars("Standard").Controls("&Paste").Enabled = False
Lúc Close
Application.CommandBars("Standard").Reset
Hi ... múa rìu qua mắt thợ!
Ai dzà, thằng Paste này nhiều chổ quá, thôi dùng FindControl ha
PHP:
Sub Auto_Open()
  Application.OnKey "^v", "PasteValue"
  CommandBars.FindControl(ID:=22).OnAction = "PasteValue"
  CommandBars.FindControl(ID:=6002).Enabled = False
End Sub
Cũng là 1 cách tham khảo chơi
 
Upvote 0
Ai dzà, thằng Paste này nhiều chổ quá, thôi dùng FindControl ha
PHP:
Sub Auto_Open()
  Application.OnKey "^v", "PasteValue"
  CommandBars.FindControl(ID:=22).OnAction = "PasteValue"
  CommandBars.FindControl(ID:=6002).Enabled = False
End Sub
Cũng là 1 cách tham khảo chơi

Cho em hỏi có code nào vừa Vô hiệu hóa Icon 2003 và 2010 kg?
Em cảm ơn!
 
Upvote 0
Mã:
Sub PasteValue()
  Selection.PasteSpecial 3
End Sub
Sub Auto_Open()
  Application.OnKey "^v", "PasteValue"
  CommandBars.FindControl(ID:=22).OnAction = "PasteValue"
  CommandBars.FindControl(ID:=6002).Enabled = False
End Sub
Sub Auto_Close()
  Application.OnKey "^v"
  CommandBars("Cell").Reset
  CommandBars("Edit").Reset
  CommandBars.FindControl(ID:=6002).Enabled = True
End Sub
Hiện nay em đang sử dụng code trên cho Excel 2003 thì kết quả rất tốt, nhưng cho Excel 2010 thì Icon (xem hình) này vẫn còn tác dụng, nghĩa là nó không mờ đi (để khỏi bấm nó được nữa)
Thầy cô & anh chị giúp em cho thằng này nó không còn tác dụng nữa được không? Nếu được hay không được, xin vui lòng fản hồi giúp em
Em cảm ơn!Pastevalue.GIF
 
Upvote 0
Hiện nay em đang sử dụng code trên cho Excel 2003 thì kết quả rất tốt, nhưng cho Excel 2010 thì Icon (xem hình) này vẫn còn tác dụng, nghĩa là nó không mờ đi (để khỏi bấm nó được nữa)
Thầy cô & anh chị giúp em cho thằng này nó không còn tác dụng nữa được không? Nếu được hay không được, xin vui lòng fản hồi giúp em
Em cảm ơn!

Đây lại là 1 bài toán khác liên quan đến việc điều khiển các control trên Ribbon (không phải CommandBars)
Không dễ xơi đâu (trên diễn đàn mình, code liên quan đến ribbon cũng không nhiều)
 
Upvote 0
Chủ đề đúng mong mỏi của em quá. Nhưng em mới vào diễn đàn nên không làm được như các bác trao đổi với nhau. Bác nào làm sẵn 1 file hay hướng dẫn tỉ mỉ hơn được không?
 
Upvote 0
Chủ đề đúng mong mỏi của em quá. Nhưng em mới vào diễn đàn nên không làm được như các bác trao đổi với nhau. Bác nào làm sẵn 1 file hay hướng dẫn tỉ mỉ hơn được không?

- Mở flle Excel muốn thực hiện
- Nhấn Alt + F11
- Trong menu của cửa sổ VBA vào Insert --> Module
- Dán đoạn code sau vào.
- Lưu file, thoát file mở lại file này. (hoặc bấm Alt + F8 --> chọn Macro Auto_Open --> Run)

Mã:
[B]Sub Auto_Open()
    With Application
        .OnKey "^v", "PasteValue"
        .CommandBars.FindControl(ID:=6002).Enabled = False
        .CommandBars("Cell").Controls("Paste").OnAction = "PasteValue"
        .CommandBars("Edit").Controls("Paste").OnAction = "PasteValue"
    End With
End Sub
Sub PasteValue()
    Selection.PasteSpecial 3
End Sub
Sub Auto_Close()
    With Application
        .OnKey "^v"
        .CommandBars("Standard").Reset
        .CommandBars("Cell").Reset
        .CommandBars("Edit").Reset
    End With
End Sub[/B]
 
Lần chỉnh sửa cuối:
Upvote 0
- Mở flle Excel muốn thực hiện
- Nhấn Alt + F11
- Trong menu của cửa sổ VBA vào Insert --> Module
- Dán đoạn code sau vào.
- Lưu file, thoát file mở lại file này. (hoặc bấm Alt + F8 --> chọn Macro Auto_Open --> Run)

Mã:
[B]Sub Auto_Open()
    With Application
        Application.OnKey "^v", "PasteValue"
        .CommandBars.FindControl(ID:=6002).Enabled = False
        .CommandBars("Cell").Controls("Paste").OnAction = "PasteValue"
        CommandBars("Edit").Controls("Paste").OnAction = "PasteValue"
    End With
End Sub
Sub PasteValue()
    Selection.PasteSpecial 3
End Sub
Sub Auto_Close()
    With Application
        .OnKey "^v"
        .CommandBars("Standard").Reset
        .CommandBars("Cell").Reset
        .CommandBars("Edit").Reset
    End With
End Sub[/B]

Thật tuyệt vời. Đúng mong mỏi của em. Em test thử trên Excel 2003 thì ngon rồi, Em cần kiểm tra test thử trên Excel 2007 và 2010. Nếu gặp trục trặc em hỏi thêm bác nhé.
 
Upvote 0
Bác thanhlanh ơi, trong Code trên của bác, chưa khống chế được cách Paste bằng phím Enter. (Em dùng Excel 2003, chưa thử phiên bản khác). Bác hoàn thiện thêm được không ?
 
Upvote 0
Bác thanhlanh ơi, trong Code trên của bác, chưa khống chế được cách Paste bằng phím Enter. (Em dùng Excel 2003, chưa thử phiên bản khác). Bác hoàn thiện thêm được không ?

Cũng được nhưng nan giải chớ không phải không được.

Chép code này vào Module:
Mã:
Option Explicit
Declare Function SetWindowsHookEx Lib _
                                  "user32" Alias "SetWindowsHookExA" (ByVal idHook As Long, ByVal lpfn As Long, _
                                                                      ByVal hmod As Long, ByVal dwThreadId As Long) As Long
Declare Function CallNextHookEx Lib "user32" _
                                (ByVal hHook As Long, ByVal nCode As Long, ByVal wParam As Long, lParam As Any) As Long
Declare Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As Long) As Long
Declare Function GetActiveWindow Lib "user32" () As Long
Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
                            (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Const HC_ACTION = 0
Const WM_KEYDOWN = &H100
Const WH_KEYBOARD_LL = 13
Dim keyCodeEvent As Long
Dim LenClipboard
Type KBDLLHOOKSTRUCT
    vkCode As Long
    scanCode As Long
    flags As Long
    time As Long
    dwExtraInfo As Long
End Type
Function EnterEvent(ByVal nCode As Long, ByVal wParam As Long, lParam As KBDLLHOOKSTRUCT) As Long
    Dim keyCode As Long
    keyCode = lParam.vkCode
    If GetActiveWindow = FindWindow("XLMAIN", Application.Caption) Then
        If (nCode = HC_ACTION) Then
            If wParam = WM_KEYDOWN Then
                If keyCode = 13 Then
                    LenDataFormClipboard
                    If LenClipboard > 2 Then
                        PasteValue
                        ClearClipboard
                    End If
                End If
            End If
        End If
    End If
    EnterEvent = CallNextHookEx(0, nCode, wParam, ByVal lParam)
End Function
Sub KeyEvent(rng As Range)
    keyCodeEvent = SetWindowsHookEx(WH_KEYBOARD_LL, AddressOf EnterEvent, Application.Hinstance, 0)
    'ClearClipboard
End Sub
Public Sub Unhook_KeyBoard()
    If keyCodeEvent <> 0 Then UnhookWindowsHookEx keyCodeEvent
End Sub
' *******************************************************************************
Sub ClearClipboard()
    Dim MyData As Object
    Set MyData = CreateObject("new:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}")
    MyData.SetText ""
    MyData.PutInClipboard
    Set MyData = Nothing
End Sub
Sub LenDataFormClipboard()
    On Error Resume Next
    With CreateObject("new:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}")
        .GetFromClipboard
        LenClipboard = Len(.GetText)
    End With
End Sub
' *******************************************************************************
' *******************************************************************************
' *******************************************************************************
Sub Auto_Open()
    With Application
        .OnKey "^v", "PasteValue"
        .CommandBars.FindControl(ID:=6002).Enabled = False
        .CommandBars("Cell").Controls("Paste").OnAction = "PasteValue"
        .CommandBars("Edit").Controls("Paste").OnAction = "PasteValue"
    End With
End Sub
Sub PasteValue()
    On Error Resume Next
    Selection.PasteSpecial 3
End Sub
Sub Auto_Close()
    With Application
        .OnKey "^v"
        .CommandBars("Standard").Reset
        .CommandBars("Cell").Reset
        .CommandBars("Edit").Reset
    End With
End Sub


Chép code này vào các Sheet
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
    Unhook_KeyBoard
End Sub
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Unhook_KeyBoard
    KeyEvent Target
End Sub
 

File đính kèm

  • PasteValue.xls
    33 KB · Đọc: 79
Upvote 0
Tôi thấy có chiêu này cũng đơn giản đây:
1> Code trong Module
PHP:
Public rng_Old As Range
Sub PutDataToClipboard()
  Dim aSrc, Arr(), tmp()
  Dim lR As Long, lC As Long
  Dim Text As String
  On Error Resume Next
  If TypeOf rng_Old Is Range Then
    If rng_Old.Count = 1 Then
      Text = rng_Old.Value
    Else
      aSrc = rng_Old.Value
      ReDim tmp(1 To UBound(aSrc, 2))
      ReDim Arr(1 To UBound(aSrc, 1))
      For lR = 1 To UBound(aSrc, 1)
        For lC = 1 To UBound(aSrc, 2)
          tmp(lC) = aSrc(lR, lC)
        Next
        Arr(lR) = Join(tmp, vbTab)
      Next
      Text = Join(Arr, vbCrLf)
    End If
    With CreateObject("new:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}")
      .SetText Text
      .PutInClipboard
    End With
  End If
End Sub
2> Code trong Sheet
PHP:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
  If Application.CutCopyMode = 0 Then Set rng_Old = Selection
  If Application.CutCopyMode Then PutDataToClipboard
End Sub
Code viết ở mức đơn giản nhất, chắc còn phải cải tiến thêm nữa
Được cái là code dùng cho Excel 2003, 2007 hay 2010 gì cũng được tuốt
 

File đính kèm

  • PasteValue_UsingDataObject.xls
    32 KB · Đọc: 77
Lần chỉnh sửa cuối:
Upvote 0
Tôi thấy có chiêu này cũng đơn giản đây:
1> Code trong Module
PHP:
Public rng_Old As Range
Sub PutDataToClipboard()
  Dim aSrc, Arr(), tmp()
  Dim lR As Long, lC As Long
  Dim Text As String
  On Error Resume Next
  If TypeOf rng_Old Is Range Then
    If rng_Old.Count = 1 Then
      Text = rng_Old.Value
    Else
      aSrc = rng_Old.Value
      ReDim tmp(1 To UBound(aSrc, 2))
      ReDim Arr(1 To UBound(aSrc, 1))
      For lR = 1 To UBound(aSrc, 1)
        For lC = 1 To UBound(aSrc, 2)
          tmp(lC) = aSrc(lR, lC)
        Next
        Arr(lR) = Join(tmp, vbTab)
      Next
      Text = Join(Arr, vbCrLf)
    End If
    With CreateObject("new:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}")
      .SetText Text
      .PutInClipboard
    End With
  End If
End Sub
2> Code trong Sheet
PHP:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
  If Application.CutCopyMode = 0 Then Set rng_Old = Selection
  If Application.CutCopyMode Then PutDataToClipboard
End Sub
Code viết ở mức đơn giản nhất, chắc còn phải cải tiến thêm nữa


Ừ thì cải tiến. Triết lý đơn giản thôi. Trong Clipboard dữ liệu có thể ở nhiều dạng khác nhau. Vd. khi ta copy vào Clipboard một bảng (vùng dữ liệu có các đường kẻ ô) thì trong clipboard dữ liệu đồng thời có ở dạng: HTML, Rich Edit text, text Unicode, text OEM, CSV (hơi bị nhiều dạng) v...v
Tất nhiên các dạng HTML, Rich Edit text v...v có chứa format (mầu chữ, các đường kẻ, chữ nghiêng ...) còn dạng CSV và text unicode, text OEM là chỉ có chữ mà thôi.
Vậy ta đọc từ clipboard ra dạng text, rồi cái text "nguyên chất" kia ta lại "nạp" vào clipboard. Các dạng có trước sẽ bị xóa - cái "nạp" kia là thao tác copy dữ liệu mới vào clipboard.

Mã:
Sub PutDataToClipboard()
Dim Text As String, a As Object
    On Error Resume Next
    Set a = CreateObject("new:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}")
    With a
        .GetFromClipboard
        Text = .GetText
    End With
    Set a = CreateObject("new:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}")
    With a
        .SetText Text
        .PutInClipboard
    End With
End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If Application.CutCopyMode Then PutDataToClipboard
End Sub
--------------------
Dùng Windows API
---------
sheet
Mã:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If Application.CutCopyMode Then ChangeClipboardData
End Sub

module
Mã:
Private Const GMEM_MOVEABLE As Long = &H2
Private Const GMEM_DDESHARE As Long = &H2000
Private Const CF_UNICODETEXT = 13
Private Declare Function OpenClipboard Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Function SetClipboardData Lib "user32.dll" (ByVal wFormat As Long, ByVal hMem As Long) As Long
Private Declare Function EmptyClipboard Lib "user32.dll" () As Long
Private Declare Function CloseClipboard Lib "user32" () As Long
Private Declare Function GetClipboardData Lib "user32" (ByVal wFormat As Long) As Long
Private Declare Function GlobalSize Lib "kernel32" (ByVal hMem As Long) As Long
Private Declare Function GlobalAlloc Lib "kernel32.dll" (ByVal wFlags As Long, ByVal dwBytes As Long) As Long
Private Declare Function GlobalLock Lib "kernel32.dll" (ByVal hMem As Long) As Long
Private Declare Function GlobalUnlock Lib "kernel32.dll" (ByVal hMem As Long) As Long
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" _
    (Destination As Any, Source As Any, ByVal Length As Long)
    
Sub ChangeClipboardData()
Dim hData As Long, pData As Long, size As Long, hNewData As Long, pNewData As Long
    If OpenClipboard(0) = 0 Then Exit Sub
    
    hData = GetClipboardData(CF_UNICODETEXT)
    If hData <> 0 Then
        pData = GlobalLock(hData)
        size = GlobalSize(hData)
        
        hNewData = GlobalAlloc(GMEM_MOVEABLE Or GMEM_DDESHARE, size)
        pNewData = GlobalLock(hNewData)
        CopyMemory ByVal pNewData, ByVal pData, size
        GlobalUnlock hData
        GlobalUnlock hNewData
        
        EmptyClipboard
        SetClipboardData CF_UNICODETEXT, hNewData
    End If
    CloseClipboard
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Ừ thì cải tiến. Triết lý đơn giản thôi. Trong Clipboard dữ liệu có thể ở nhiều dạng khác nhau. Vd. khi ta copy vào Clipboard một bảng (vùng dữ liệu có các đường kẻ ô) thì trong clipboard dữ liệu đồng thời có ở dạng: HTML, Rich Edit text, text Unicode, text OEM, CSV (hơi bị nhiều dạng) v...v
Tất nhiên các dạng HTML, Rich Edit text v...v có chứa format (mầu chữ, các đường kẻ, chữ nghiêng ...) còn dạng CSV và text unicode, text OEM là chỉ có chữ mà thôi.
Vậy ta đọc từ clipboard ra dạng text, rồi cái text "nguyên chất" kia ta lại "nạp" vào clipboard. Các dạng có trước sẽ bị xóa - cái "nạp" kia là thao tác copy dữ liệu mới vào clipboard.

Chính xác là vậy!
Nghĩ ra được hướng đi nhưng phương pháp tiến hành của em lại hơi.. NGỐ
Ẹc... Ẹc... Tự nhiên lại For.. Next làm cóc khô gì không biết
Cảm ơn anh!
 
Upvote 0
Thêm một cách nữa tương tự
Mã:
Sub PasteFromClipboard()
    Dim objData As Object, sData As String
    On Error Resume Next
    Set objData = CreateObject("HTMLfile")
    sData = objData.ParentWindow.ClipboardData.GetData("text")
    objData.ParentWindow.ClipboardData.SetData "text", Chr(32) & sData
    Set objData = Nothing
End Sub

Mã:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If Application.CutCopyMode Then PasteFromClipboard
End Sub

Cách trước của mình dài nhưng dùng được phím Enter để dán và không dùng được trên Ex2007 về sau.
 
Upvote 0
Mã:
Sub PutDataToClipboard()
Dim Text As String, a As Object
    On Error Resume Next
    Set a = CreateObject("new:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}")
    With a
        .GetFromClipboard
        Text = .GetText
    End With
    Set a = CreateObject("new:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}")
    With a
        .SetText Text
        .PutInClipboard
    End With
End Sub

Rút gọn thành
Mã:
Sub PutDataToClipboard()
Dim Text As String
    On Error Resume Next
    With CreateObject("new:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}")
        .GetFromClipboard
        Text = .GetText
        .Clear
        .SetText Text
        .PutInClipboard
    End With
End Sub
 
Upvote 0
Web KT

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

Back
Top Bottom