Copy nội dung Lisbox vào Clipboard

Liên hệ QC

viehoai

Thành viên gắn bó
Tham gia
22/5/09
Bài viết
2,600
Được thích
2,907
Kính nhờ các anh chị giúp đỡ:
Tôi có 1 Form trong đó có 1 Listbox và Button "Copy to Clipboard". Xin các anh chị giúp đỡ code Khi nhấn nút "Copy to Clipboard" thì code sẽ thực hiện copy nội dung trong ListBox vào Clipboard
Mục đích để khi ta ở bất kì bảng tính nào nếu nhấn Ctrl + V sẽ dán vào bảng tính nội dung trong Listbox đó
Xin cảm ơn các anh chị
 

File đính kèm

  • CopyToClipboard.xls
    30 KB · Đọc: 20
Để nhấn Ctrl+V thì chỉ chép 1 giá trị thôi. Vậy bạn chọn giá trị cột nào.

Nói chung cú pháp như sau:

Mã:
Private Sub CommandButton1_Click()
Dim Dt As DataObject
Set Dt = New DataObject
Dt.SetText "????????????????????????"
Dt.PutInClipboard
End Sub


Bạn muốn đưa cái gì vào Clipboard thì thay vào "???????????????????????????"
 
Lần chỉnh sửa cuối:
Upvote 0
Kính nhờ các anh chị giúp đỡ:
Tôi có 1 Form trong đó có 1 Listbox và Button "Copy to Clipboard". Xin các anh chị giúp đỡ code Khi nhấn nút "Copy to Clipboard" thì code sẽ thực hiện copy nội dung trong ListBox vào Clipboard
Mục đích để khi ta ở bất kì bảng tính nào nếu nhấn Ctrl + V sẽ dán vào bảng tính nội dung trong Listbox đó
Xin cảm ơn các anh chị
Sao lại nghĩ vấn đề theo hướng này?
Đàng nào cũng phải gọi UserForm, vậy lúc nào bạn muốn gán dữ liệu từ ListBox xuống bảng tính thì cứ gán bình thường thôi
Ví dụ thế này:
PHP:
Private Sub CommandButton1_Click()
  With ListBox1
    ActiveCell.Resize(.ListCount, .ColumnCount).Value = .List
  End With
End Sub
Bạn bấm CommandButton trên UserForm thì lập tức dữ liệu từ ListBox sẽ được đưa vào tại vị trí của ActiveCell
Có phải đơn giản hơn không?
 
Upvote 0
Để nhấn Ctrl+V thì chỉ chép 1 giá trị thôi. Vậy bạn chọn giá trị cột nào. Nói chung cú pháp như sau:
Mã:
Private Sub CommandButton1_Click() Dim Dt As DataObject Set Dt = New DataObject Dt.SetText "????????????????????????" Dt.PutInClipboard End Sub
Bạn muốn đưa cái gì vào Clipboard thì thay vào "???????????????????????????"
Không copy cả mãng được hả anh? Em muốn khi nhấn Ctrl+V dán ra bảng tính cả ListBox
Sao lại nghĩ vấn đề theo hướng này? Đàng nào cũng phải gọi UserForm, vậy lúc nào bạn muốn gán dữ liệu từ ListBox xuống bảng tính thì cứ gán bình thường thôi Ví dụ thế này:
PHP:
 Private Sub CommandButton1_Click()   With ListBox1     ActiveCell.Resize(.ListCount, .ColumnCount).Value = .List   End With End Sub
Bạn bấm CommandButton trên UserForm thì lập tức dữ liệu từ ListBox sẽ được đưa vào tại vị trí của ActiveCell Có phải đơn giản hơn không?
Đó là file ví dụ thôi Sư phụ à, thwcj ra em có form sau khi tìm kiếm, lọc v..v cho kết quả ra ListBox ấy và em muốn lấy số liệu đó ở bất kì bảng tính nào bằng một cú Ctrl+V
 
Upvote 0
Không copy cả mãng được hả anh? Em muốn khi nhấn Ctrl+V dán ra bảng tính cả ListBox Đó là file ví dụ thôi Sư phụ à, thwcj ra em có form sau khi tìm kiếm, lọc v..v cho kết quả ra ListBox ấy và em muốn lấy số liệu đó ở bất kì bảng tính nào bằng một cú Ctrl+V
Thì cũng có vấn đề gì đâu chứ! Muốn lọc thì cứ lọc, làm xong, bấm nút 1 cái, lập tức ListBox sẽ được gán xuống ngay vị trí ActiveCell
Ngoài ra, gọi UserForm ở sheet nào mà chẳng được (có thể dùng phím tắt luôn)
 
Upvote 0
Không copy cả mãng được hả anh? Em muốn khi nhấn Ctrl+V dán ra bảng tính cả ListBox Đó là file ví dụ thôi Sư phụ à, thwcj ra em có form sau khi tìm kiếm, lọc v..v cho kết quả ra ListBox ấy và em muốn lấy số liệu đó ở bất kì bảng tính nào bằng một cú Ctrl+V
Dùng 2 vòng lặp, 1 cái duyệt cột, 1 cái duyệt dòng, sau đó đưa từng item thu được vào Clipboard.
Bạn thử theo cách này xem sao nhé.
 
Upvote 0
Đây là code chép cái listbox đó vào ClipBoard và dán vào đâu trên bảng tính theo cấu trúc bảng thì dán:

Mã:
Private Sub CommandButton1_Click()
Dim Dt As DataObject, Tm, i, j
Set Dt = New DataObject
For i = 0 To Me.ListBox1.ListCount - 1
For j = 0 To Me.ListBox1.ColumnCount - 1
Tm = Tm & Me.ListBox1.List(i, j) & IIf(j < Me.ListBox1.ColumnCount - 1, vbTab, vbNewLine)
Next
Next
Dt.SetText Tm
Dt.PutInClipboard
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Đây là code chép cái listbox đó vào ClipBoard và dán vào đâu trên bảng tính theo cấu trúc bảng thì dán:

Mã:
Private Sub CommandButton1_Click()
Dim Dt As DataObject, Tm, i, j
Set Dt = New DataObject
For i = 0 To Me.ListBox1.ListCount - 1
For j = 0 To Me.ListBox1.ColumnCount - 1
Tm = Tm & Me.ListBox1.List(i, j) & IIf(j < Me.ListBox1.ColumnCount - 1, vbTab, vbNewLine)
Next
Next
Dt.SetText Tm
Dt.PutInClipboard
End Sub

Phần khai báo 2 dòng sau

Mã:
Dim Dt As DataObject
Set Dt = New DataObject

Thành 1 dòng là ok anh à.

Mã:
Dim Dt As New DataObject


Mã:
Private Sub CommandButton1_Click()
 Dim dong, cot As Integer, Dt As New DataObject, strText As String
    For dong = 0 To ListBox1.ListCount - 1
     strText = strText & Chr(13)
        For cot = 0 To ListBox1.ColumnCount - 1
           strText = strText & vbTab & ListBox1.List(dong, cot)
        Next
     Next
 Dt.SetText strText
 Dt.PutInClipboard
 Unload Me
    
End Sub
 
Upvote 0
Phần khai báo 2 dòng sau

Mã:
Dim Dt As DataObject
Set Dt = New DataObject

Thành 1 dòng là ok anh à.

Mã:
Dim Dt As New DataObject


Mã:
Private Sub CommandButton1_Click()
 Dim dong, cot As Integer, Dt As New DataObject, strText As String
    For dong = 0 To ListBox1.ListCount - 1
     strText = strText & Chr(13)
        For cot = 0 To ListBox1.ColumnCount - 1
           strText = strText & vbTab & ListBox1.List(dong, cot)
        Next
     Next
 Dt.SetText strText
 Dt.PutInClipboard
 Unload Me
    
End Sub
Làm như anh sealand sẽ chuẩn hơn ---> Không phải Object nào cũng chịu cách khai báo kiểu Dim Dt As New DataObject (khai báo xong, không Set nó không chịu)
Ví dụ Dim sh As New Worksheet chẳng xài được gì nếu không có động tác Set
Nếu thấy rắc rối quá, ta dùng With... End With là ngon lành nhất
 
Upvote 0
Làm như anh sealand sẽ chuẩn hơn ---> Không phải Object nào cũng chịu cách khai báo kiểu Dim Dt As New DataObject (khai báo xong, không Set nó không chịu)
Ví dụ Dim sh As New Worksheet chẳng xài được gì nếu không có động tác Set
Nếu thấy rắc rối quá, ta dùng With... End With là ngon lành nhất

Đúng vậy, WorksheetFunction chẳng hạn. Nó không chịu cách khai báo đó.
Domfootwear lưu ý code ráp dạng đó là phải bỏ 1 chr(13) đầu tiên kẻ thừa cột và chép không chính xác.
 
Lần chỉnh sửa cuối:
Upvote 0
Nếu dùng Office 2003 thì có chiêu này cũng thuộc dạng "độc chiêu" đây:
PHP:
Private Sub CommandButton1_Click()
 With CreateObject("OWC11.Spreadsheet")
   With .Range(.Cells(1, 1), .Cells(ListBox1.ListCount, ListBox1.ColumnCount))
     .Value = ListBox1.List: .Copy
   End With
 End With
 Unload Me
End Sub
Ngắn gọn không?
 
Upvote 0
Nếu dùng Office 2003 thì có chiêu này cũng thuộc dạng "độc chiêu" đây:
PHP:
Private Sub CommandButton1_Click()
 With CreateObject("OWC11.Spreadsheet")
   With .Range(.Cells(1, 1), .Cells(ListBox1.ListCount, ListBox1.ColumnCount))
     .Value = ListBox1.List: .Copy
   End With
 End With
 Unload Me
End Sub
Ngắn gọn không?
Thật là hay đối với Spreadsheet, em cũng đã thử với các định dạng, khi xuất ra bảng tính rất tốt, em hiểu nó giống như một sheet của bảng tính. Điều em không biết nó nằm ở đâu? trong khi đó các Sheet là bảng tính mà chúng ta có thể thấy tất cả. Còn Spreadsheet thì sao? Xin Sư phụ và các anh chị giải thích và nếu được nói ưu điểm, nhược của cái này và sao Excel khác 2003 lại không được?
Xin cảm ơn các anh rất nhiều
 
Upvote 0
Thật là hay đối với Spreadsheet, em cũng đã thử với các định dạng, khi xuất ra bảng tính rất tốt, em hiểu nó giống như một sheet của bảng tính. Điều em không biết nó nằm ở đâu? trong khi đó các Sheet là bảng tính mà chúng ta có thể thấy tất cả. Còn Spreadsheet thì sao?
Đúng ra ta chèn 1 SpreadSheet vào UserForm sẽ trực quan hơn... Nhưng đàng nào thì cũng dùng có 1 lần, thôi ta dùng theo kiểu ảo vậy
Giống ví dụ này:
PHP:
Sub Test()
  With CreateObject("Forms.ComboBox.1")
    .AddItem "a"
    .AddItem "b"
    .AddItem "c"
    MsgBox .ListCount
  End With
End Sub
Ta Add vào 1 ComboBox "ảo" 3 Item ---> Dù chẳng nhìn thấy ComboBox nào nhưng MsgBox vẫn cho kết quả = 3
---------------------------------------
Xin Sư phụ và các anh chị giải thích và nếu được nói ưu điểm, nhược của cái này và sao Excel khác 2003 lại không được?
Ưu điểm hay khuyết điểm tôi không dám mạnh dạn phát biểu (vì cũng đang học)... Riêng phần SpreadSheet, sở dĩ không dùng được trên Excel 2007 và 2010 vì Control này đã bị remove trên các version đời mới rồi... Muốn dùng thì phải cài thêm vào
Ngay cả trên Excel 2003 thì SpreadSheet cũng không phải có sẵn ---> Nếu bạn dùng được, chẳng qua vì khi cài Office bạn đã vô tình cài luôn thành phần MS Office Web Components mà thôi
 
Upvote 0
Hi cả nhà , cho em hỏi nếu e chỉ muốn copy dòng đang chọn trong listbox thì e sẽ phải thay đổi những gì trong đoạn code này :

Dim Dt As DataObject, Tm, i, j
Set Dt = New DataObject
For i = 0 To Me.ListBox1.ListCount - 1
For j = 0 To Me.ListBox1.ColumnCount - 1
Tm = Tm & Me.ListBox1.List(i, j) & IIf(j < Me.ListBox1.ColumnCount - 1, vbTab, vbNewLine)
Next
Next
Dt.SetText Tm
Dt.PutInClipboard
 
Upvote 0
Đây là code chép cái listbox đó vào ClipBoard và dán vào đâu trên bảng tính theo cấu trúc bảng thì dán:

Mã:
Private Sub CommandButton1_Click()
Dim Dt As DataObject, Tm, i, j
Set Dt = New DataObject
For i = 0 To Me.ListBox1.ListCount - 1
For j = 0 To Me.ListBox1.ColumnCount - 1
Tm = Tm & Me.ListBox1.List(i, j) & IIf(j < Me.ListBox1.ColumnCount - 1, vbTab, vbNewLine)
Next
Next
Dt.SetText Tm
Dt.PutInClipboard
End Sub
Cám ơn anh đã chia sẻ đoạn code. Đoạn code của anh khi dùng trên office 2016 (có đăng ký bản quyền) thì không sao, nhưng khi dùng trên office 2016 (không có đăng ký bản quyền) thì bị lỗi như hình (bên dưới). Nhờ anh & các anh chị cao nhân chỉ giáo & hỗ trợ giúp em.
Em xin cám ơn1679473564380.png
 
Upvote 0
Web KT
Back
Top Bottom