Gửi thành viên trong diễn đàn!
Mình đang có vấn đề như trên tiêu đề có bác nào biết thì trợ giúp mình với.
Việc copy vào clipboad được copy từ Excel thôi.
Vụ này Em nghi Anh xài dòng sau QuáCâu trả lời là LÀM ĐƯỢC
Nhưng tôi tò mò muốn biết sau khi đã có mảng kết quả, bạn sẽ làm gì tiếp theo?
Vụ này Em nghi Anh xài dòng sau Quá
Set clb = CreateObject("new:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}")
Thì cái này Em cũng học của Anh thôi mà ....Em nghĩ Viết theo cách Set đó hay hơn mấy hàm API nhiềuChuyện đương nhiên rồi (thuật toán cũng khá đơn giản)
Nhưng vấn đề rắc rối không nằm ở đó. Bẫy lỗi mới là thứ khủng khiếp nhất (ai mà biết người ta đã copy thứ gì)
Mình nghĩ kieu manh thừa sức làm bài này. Thử xem!
Thì cái này Em cũng học của Anh thôi mà ....Em nghĩ Viết theo cách Set đó hay hơn mấy hàm API nhiều
OpenClipboard, CopyMemory, GetClipboardData ...........
Thì cái này Em cũng học của Anh thôi mà ....Em nghĩ Viết theo cách Set đó hay hơn mấy hàm API nhiều
OpenClipboard, CopyMemory, GetClipboardData ...........
Thì cách sử dụng DataObject Mình học của Anh Ndu Link SauKiều Mạnh cho xin 1 vài ví dụ để mình học hỏi với, biết đâu áp dụng được cho công việc.
Thanks
Private Const CF_UNICODETEXT As Long = 13
Private Declare Function OpenClipboard Lib "user32.dll" (ByVal hwnd As Long) As Long
Private Declare Function CloseClipboard Lib "user32.dll" () As Long
Private Declare Function GetClipboardData Lib "user32.dll" (ByVal wFormat As Long) As Long
Private Declare Function IsClipboardFormatAvailable Lib "user32.dll" (ByVal wFormat As Long) As Long
Private Declare Function lstrcpy Lib "kernel32.dll" Alias "lstrcpyW" (ByVal lpString1 As Long, ByVal lpString2 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 Function GlobalSize Lib "kernel32" (ByVal hMem As Long) As Long
Private Declare Function EmptyClipboard Lib "user32" () As Long
Sub CopyToClipboard()
Dim text
Dim clb As Object
text = Sheet1.Range("A1").Value
Set clb = CreateObject("new:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}")
clb.SetText text
clb.PutInClipboard
Sheet1.Range("D4").PasteSpecial
Set clb = Nothing
End Sub
Hình như cái này là đưa dữ liệu vào Clipboard chứ không phải lấy dữ liệu từ ClipboardVí dụ đơn Giản thì như vầy: Copy [A1] Paste [D4]
Mã:Sub CopyToClipboard() Dim text Dim clb As Object text = Sheet1.Range("A1").Value Set clb = CreateObject("new:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}") clb.SetText text clb.PutInClipboard Sheet1.Range("D4").PasteSpecial Set clb = Nothing End Sub
Ngoài ra Bạn có thể kết Hợp DataObject + Fso [CreateObject("Scripting.FileSystemObject")]
lấy dữ liệu từ File Txt gán vào Clipboard xong gán lên Sheet xong Bạn muốn hoài cũng ok Cứ chọn Cells x xong Ctrl+V là lại có nữa
Thì Tỷ dụ vậy ... thì đưa nó vào xong mới lấy ra được chứ ...Hình như cái này là đưa dữ liệu vào Clipboard chứ không phải lấy dữ liệu từ Clipboard
Sub CopyToClipboard()
Dim text
Dim clb As Object
text = Sheet1.Range("A1").Value
Set clb = CreateObject("new:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}")
clb.SetText text
clb.PutInClipboard
Sheet1.Range("D4").PasteSpecial
[COLOR=#ff0000][B] clb.Clear [/B][/COLOR] [COLOR=#0000ff][B]''Nếu bỏ dòng này chạy code xong cứ Ctrl+v Hoài khi nào mõi tay thì nghỉ[/B][/COLOR]
Set clb = Nothing
End Sub
Code đó Áp dụng cho 1 cells còn nhiều Cells lỗi code ...Bạn nghiên cứu bài Anh ndu link trênMình sửa thử thế này
text = Sheet4.Range("A1:L7").Value
nó báo lỗi ở dòng này
clb.SetText text
Vậy cái này là copy theo từng ô ah Kiều Mạnh
Em có file đính kèm mong mọi người giúp.
Cái em bị mắc chính là dữ liệu trong file mình cần không liền mạch.
Function Clipboard2Array()
Dim sTmp As String
Dim objClb As Object
Dim aTmp1, aTmp2
Dim lR As Long, lRs As Long, lC As Long, lCs As Long
'On Error Resume Next
If Application.CutCopyMode > 0 Then ''Có hành dong copy trên Range moi tiep tuc
Set objClb = CreateObject("new:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}")
objClb.GetFromClipboard
sTmp = objClb.GetText
If Len(sTmp) Then
If Right(sTmp, 2) = vbCrLf Then sTmp = Left(sTmp, Len(sTmp) - 2)
aTmp1 = Split(sTmp, vbCrLf)
If UBound(aTmp1) > -1 Then ''aTmp1 phai la mot Array thì moi tiep tuc
lRs = UBound(aTmp1) + 1
ReDim aRes(1 To lRs, 1 To 1)
For lR = 1 To lRs
aTmp2 = Split(aTmp1(lR - 1), vbTab)
If lCs = 0 Then ''Gán lCs 1 lan duy nhat
lCs = UBound(aTmp2) + 1
If lCs Then ReDim Preserve aRes(1 To lRs, 1 To lCs)
End If
If lCs Then ''aTmp2 phai la mot Array thì moi tiep tuc
For lC = 1 To lCs
aRes(lR, lC) = aTmp2(lC - 1)
Next
End If
Next
If lRs * lCs Then Clipboard2Array = aRes
End If
End If
Set objClb = Nothing
End If
End Function
Sub ShowForm()
ufTest.Show False
End Sub
Private Sub CommandButton1_Click()
Dim arr
arr = Clipboard2Array
If IsArray(arr) Then
With Me.ListBox1
.ColumnCount = UBound(arr, 2)
.List = arr
MsgBox "Done!", , UBound(arr, 1)
End With
End If
End Sub
Thật tuyệt vời thanh bác ndu96081631!Mời xem file và kiểm tra vì tôi chưa chắc còn chỗ nào thiếu sót không
Hay Ghê ..................Cảm ơn AnhBiết ngay là có giấu "càn khôn" gì đó mà (nên tôi phải hỏi lại cho chắc!
--------------------------------
Tôi thiết kế code thế này:
1> Code trong Module
(ufTest là tên của UserForm)Mã:Function Clipboard2Array() Dim sTmp As String Dim objClb As Object Dim aTmp1, aTmp2 Dim lR As Long, lRs As Long, lC As Long, lCs As Long 'On Error Resume Next If Application.CutCopyMode > 0 Then ''Có hành dong copy trên Range moi tiep tuc Set objClb = CreateObject("new:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}") objClb.GetFromClipboard sTmp = objClb.GetText If Len(sTmp) Then If Right(sTmp, 2) = vbCrLf Then sTmp = Left(sTmp, Len(sTmp) - 2) aTmp1 = Split(sTmp, vbCrLf) If UBound(aTmp1) > -1 Then ''aTmp1 phai la mot Array thì moi tiep tuc lRs = UBound(aTmp1) + 1 ReDim aRes(1 To lRs, 1 To 1) For lR = 1 To lRs aTmp2 = Split(aTmp1(lR - 1), vbTab) If lCs = 0 Then ''Gán lCs 1 lan duy nhat lCs = UBound(aTmp2) + 1 If lCs Then ReDim Preserve aRes(1 To lRs, 1 To lCs) End If If lCs Then ''aTmp2 phai la mot Array thì moi tiep tuc For lC = 1 To lCs aRes(lR, lC) = aTmp2(lC - 1) Next End If Next If lRs * lCs Then Clipboard2Array = aRes End If End If Set objClb = Nothing End If End Function Sub ShowForm() ufTest.Show False End Sub
2> Code trong UserForm
Tôi thiết kế UserForm với 1 CommandButton và 1 ListBox với mục đích test code. Nếu code thực hiện được việc biến giá trị trong Clipboard thành Array thì ta sẽ thấy ngay kết quả ở ListBox
------------------Mã:Private Sub CommandButton1_Click() Dim arr arr = Clipboard2Array If IsArray(arr) Then With Me.ListBox1 .ColumnCount = UBound(arr, 2) .List = arr MsgBox "Done!", , UBound(arr, 1) End With End If End Sub
Mời xem file và kiểm tra vì tôi chưa chắc còn chỗ nào thiếu sót không
Hay Ghê ..................Cảm ơn Anh
Code Anh viết thì Em chỉ học thôi chứ ...khúc Em thấy được khúc không ấy mà ...Anh điều chỉnh lại cho Em học với