Copy vùng dữ liệu theo lựa chọn từ ComboBox (1 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

Võ Thiếu Gia

Thành viên hoạt động
Tham gia
19/7/08
Bài viết
105
Được thích
54
Dear các anh/chị,
Tình hình là mình cũng chưa rành lắm về VBA. Nhưng do nhu cầu công việc lặp đi lặp lại, nên nhờ các anh/chị tạo giúp mình đoạn code như trong fike đính kèm.

Thanks & Best Regards
VTG
 

File đính kèm

File đính kèm

Upvote 0
Thanks Nhapmon,
Nhưng mình chỉ cần Copy từ Cột C đến cột AB

bạn sửa đoạn code combobox1_change lại một chút là được

Private Sub ComboBox1_Change()
ngay = Format(ComboBox1.Value, "dd/mm")
Cells.Find(What:=ngay, After:=ActiveCell, LookIn:=xlValues, LookAt:= _
xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False _
, SearchFormat:=False).Activate
ActiveCell.Offset(, 2).Resize(9, 26).copy

End Sub

thêm cái màu đỏ vô, đổi 28-->26
 
Upvote 0
đụng ba cái định dạng ngày oải thiệt...........Find hoài mà nó ko thấy............hichic
xài đỡ cái này nha..........................

Find Method đối với dữ liệu dạng Date có chút rắc rối. Phải tìm nó theo dạng chuổi và đúng theo format mà vùng cần tìm đang thiết lập.
Ví dụ: Vùng A:A đang thiết lập Custom Format theo dạng dd/mm thì bạn phải tìm chuổi theo dạng này
Vậy, tổng quát ta sẽ:
1> Chuyển format vùng cần tìm sang 1 kiểu gì đó tùy ý
2> Lấy giá trị trong ComboBox, chuyển thành Date thật sự, xong, dùng hàm Format chuyển nó thành kiểu chuổi giống như đã format ở bước 1
Bây giờ là có thể Find thoải mái
Ví dụ:
Mã:
Private Sub ComboBox1_Change()
  Dim strDate As String, lDate As Long, aTmp, rFind As Range, rCopy As Range
  On Error Resume Next
  strDate = ComboBox1.Value
  aTmp = Split(strDate, "/")
  lDate = CLng(DateSerial(aTmp(2), aTmp(1), aTmp(0)))
  With Range("A2:AB10000")
    .Resize(, 1).NumberFormat = "dd/mm/yyyy"
    Set rFind = .Resize(, 1).Find(Format(lDate, "dd/mm/yyyy"), , xlValues, xlWhole)
    If Not rFind Is Nothing Then
      Set rCopy = Intersect(.Cells, rFind.EntireRow)
      '[COLOR=#ff0000][B]rCopy.Select[/B][/COLOR]
      [COLOR=#ff0000][B]rCopy.Copy[/B][/COLOR]
    End If
  End With
End Sub
Chổ màu đỏ bạn muốn thế nào tùy ý nhé
 
Upvote 0
bạn sửa đoạn code combobox1_change lại một chút là được

Private Sub ComboBox1_Change()
ngay = Format(ComboBox1.Value, "dd/mm")
Cells.Find(What:=ngay, After:=ActiveCell, LookIn:=xlValues, LookAt:= _
xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False _
, SearchFormat:=False).Activate
ActiveCell.Offset(, 2).Resize(9, 26).copy

End Sub

thêm cái màu đỏ vô, đổi 28-->26

Dear nhapmon,
Lại xảy ra vấn đề. Khi cột "Ngày" thay đổi thì code sẽ ko còn tác dụng. Còn cách nào để cột "Ngày" thay đổi mà code vẫn chạy được không bạn
 
Upvote 0
Find Method đối với dữ liệu dạng Date có chút rắc rối. Phải tìm nó theo dạng chuổi và đúng theo format mà vùng cần tìm đang thiết lập.
Ví dụ: Vùng A:A đang thiết lập Custom Format theo dạng dd/mm thì bạn phải tìm chuổi theo dạng này
Vậy, tổng quát ta sẽ:
1> Chuyển format vùng cần tìm sang 1 kiểu gì đó tùy ý
2> Lấy giá trị trong ComboBox, chuyển thành Date thật sự, xong, dùng hàm Format chuyển nó thành kiểu chuổi giống như đã format ở bước 1
Bây giờ là có thể Find thoải mái
Ví dụ:
Mã:
Private Sub ComboBox1_Change()
  Dim strDate As String, lDate As Long, aTmp, rFind As Range, rCopy As Range
  On Error Resume Next
  strDate = ComboBox1.Value
  aTmp = Split(strDate, "/")
  lDate = CLng(DateSerial(aTmp(2), aTmp(1), aTmp(0)))
  With Range("A2:AB10000")
    .Resize(, 1).NumberFormat = "dd/mm/yyyy"
    Set rFind = .Resize(, 1).Find(Format(lDate, "dd/mm/yyyy"), , xlValues, xlWhole)
    If Not rFind Is Nothing Then
      Set rCopy = Intersect(.Cells, rFind.EntireRow)
      '[COLOR=#ff0000][B]rCopy.Select[/B][/COLOR]
      [COLOR=#ff0000][B]rCopy.Copy[/B][/COLOR]
    End If
  End With
End Sub
Chổ màu đỏ bạn muốn thế nào tùy ý nhé

ndu ơi,
Mình vẫn không thể hiểu.
Anh giúp chỉ VTG đoạn code đó làm như thế nào đi
Thanks
 
Upvote 0
Thanks Nhapmon,
Nhưng mình chỉ cần Copy từ Cột C đến cột AB

Ah, nếu vậy thì phải sửa đôi chút (do có merge cell)
Mã:
Private Sub ComboBox1_Change()
  Dim strDate As String, lDate As Long, aTmp, rFind As Range, rCopy As Range
  strDate = ComboBox1.Value
  aTmp = Split(strDate, "/")
  lDate = CLng(DateSerial(aTmp(2), aTmp(1), aTmp(0)))
  With Range("A2:AB10000")
    .Resize(, 1).NumberFormat = "dd/mm/yyyy"
    Set rFind = .Resize(, 1).Find(Format(lDate, "dd/mm/yyyy"), , xlValues, xlWhole)
    If Not rFind Is Nothing Then
      Set rCopy = Intersect(.Cells, .Offset(, 2), rFind.EntireRow)
      Set rCopy = rCopy.Resize(rFind.MergeArea.Rows.Count)
      rCopy.Copy
    End If
  End With
End Sub
-----------------------------------------------
ndu ơi,
Mình vẫn không thể hiểu.
Anh giúp chỉ VTG đoạn code đó làm như thế nào đi
Thanks

Cho code vào Sheet 1 thôi: Sự kiện Change của ComboBox
 
Upvote 0
Dear các anh/chị,
Tình hình là mình cũng chưa rành lắm về VBA. Nhưng do nhu cầu công việc lặp đi lặp lại, nên nhờ các anh/chị tạo giúp mình đoạn code như trong fike đính kèm.

Thanks & Best Regards
VTG

Bạn thử cái này xem có được không nhé.
 

File đính kèm

Upvote 0
Ah, nếu vậy thì phải sửa đôi chút (do có merge cell)
Mã:
Private Sub ComboBox1_Change()
  Dim strDate As String, lDate As Long, aTmp, rFind As Range, rCopy As Range
  strDate = ComboBox1.Value
  aTmp = Split(strDate, "/")
  lDate = CLng(DateSerial(aTmp(2), aTmp(1), aTmp(0)))
  With Range("A2:AB10000")
    .Resize(, 1).NumberFormat = "dd/mm/yyyy"
    Set rFind = .Resize(, 1).Find(Format(lDate, "dd/mm/yyyy"), , xlValues, xlWhole)
    If Not rFind Is Nothing Then
      Set rCopy = Intersect(.Cells, .Offset(, 2), rFind.EntireRow)
      Set rCopy = rCopy.Resize(rFind.MergeArea.Rows.Count)
      rCopy.Copy
    End If
  End With
End Sub
-----------------------------------------------


Cho code vào Sheet 1 thôi: Sự kiện Change của ComboBox

Dear Anh NDU,
Mình đưa code vào nhưng không hiểu sao không chạy được.
Với định dạng ngày mình muốn giữ y như cũ có được không.
Chi tiết anh xem trong file đính kèm nha
Thanks
 

File đính kèm

Upvote 0
Bạn thử cái này xem có được không nhé.

Code của bạn... buồn cười quá nhỉ
???
Bạn thay ComboBox bằng Dropdown rồi... For... Next gì gì đó... Tóm lại code viết quá thừa
Code của bạn có thể sửa thành:
Mã:
Sub test()
  Dim k As Long
  With Sheet1.Range("A4:AB10000")
    k = .Parent.DropDowns(Application.Caller).Value
    .Resize(9, .Columns.Count - 2).Offset((k - 1) * 10, 2).Copy
  End With
End Sub
-----------------
Dear Anh NDU,
Mình đưa code vào nhưng không hiểu sao không chạy được.
Với định dạng ngày mình muốn giữ y như cũ có được không.
Chi tiết anh xem trong file đính kèm nha
Thanks
Bạn cho code vào file XLSX thì lấy đếch gì mà chạy (lưu file 1 phát, lập tức code bị mất sạch)
 
Upvote 0
Dear Anh NDU,
Mình đưa code vào nhưng không hiểu sao không chạy được.
Với định dạng ngày mình muốn giữ y như cũ có được không.
Còn một chi tiết nữa: Là khi ngày ở cột A:A thay đổi, tì code vẫn chạy được luôn anh.
Chi tiết anh xem trong file đính kèm nha

Thanks

Mong anh giúp dùm, Vì mình dùng thường xuyên file này
 

File đính kèm

Upvote 0
Dear Anh NDU,
Mình đã chuyển qua 97-2003 mà vẫn không chạy được: Run time error 9
Anh xem trong file đính kèm giúp mình nhé
Bạn bảo tôi xem file ở bài nào đây?
Bạn chuyển định dạng file thành XLSM hoặc XLS, cho code vào trong đó rồi thử nghiệm. Nếu bị lỗi hãy đưa lên đây
Chán quá!
 
Upvote 0
Bạn bảo tôi xem file ở bài nào đây?
Bạn chuyển định dạng file thành XLSM hoặc XLS, cho code vào trong đó rồi thử nghiệm. Nếu bị lỗi hãy đưa lên đây
Chán quá!

Sorry anh NDU,
Không biết sao mình acttach file mà không đi được.
File này mình chuyển sang XLS
Nhờ anh xem giúp nhé
Thanks alot..hihi
 
Upvote 0
Dear ANh NDU,
Không hiểu sao mình không thể tải file lên được.
Mình đã chuyển qua XLS, xong khi tải lên thì mạng báo là Error. Sorry anh vì sự bất tiện này
 
Upvote 0
Dear ANh NDU,
Không hiểu sao mình không thể tải file lên được.
Mình đã chuyển qua XLS, xong khi tải lên thì mạng báo là Error. Sorry anh vì sự bất tiện này

chắc bạn hết quota rùi............
1-gởi các file trước xuống
2-đổi thành đuôi xlsx
3-bạn nén file lại.............
 
Upvote 0
Dear ANh NDU,
Không hiểu sao mình không thể tải file lên được.
Mình đã chuyển qua XLS, xong khi tải lên thì mạng báo là Error. Sorry anh vì sự bất tiện này
Bạn nén file lại rồi upload. Có lẽ file excel của bạn có dung lượng lớn hơn 97kb.
 
Upvote 0
Code của bạn... buồn cười quá nhỉ
???
Bạn thay ComboBox bằng Dropdown rồi... For... Next gì gì đó... Tóm lại code viết quá thừa
Code của bạn có thể sửa thành:
Mã:
Sub test()
  Dim k As Long
  With Sheet1.Range("A4:AB10000")
    k = .Parent.DropDowns(Application.Caller).Value
    .Resize(9, .Columns.Count - 2).Offset((k - 1) * 10, 2).Copy
  End With
End Sub
-----------------
Không phải em thay cái ComboBox bằng Dropdown đâu sư phụ. Đó là nguyên bản file đinh kèm của tác giả ở bài #1.
Em chỉ cố gắng làm sao cho ra kết quả tác giả mong muốn thôi.

Code của em đối với sư phụ có thể là "buồn cười quá", nhưng với em thì không buồn cười lắm vì dù sao nó vẫn ra kết quả. Hơn nữa cũng nhờ nó mà em học thêm đc thuộc tính Dropdown của sư phụ.

P/S: Chẳng hiểu sao em test thử code của sư phụ mà nó cứ báo lỗi: Unable to get the Dropdowns property of the Worksheet class. Hình như Excel đòi kích hoạt cái gì đó thì phải. Cái này em mù tịt, sư phụ chỉ giúp em với.
 
Lần chỉnh sửa cuối:
Upvote 0
Quên mất cái vụ nén lại...hihi.
Nhờ các anh/chị chỉ giúp mình với
 

File đính kèm

Upvote 0
Quên mất cái vụ nén lại...hihi.
Nhờ các anh/chị chỉ giúp mình với

Cái List trong ComboBox ở đâu rồi? Bạn buồn cười thật đó!
----------
Mà thôi, ngay từ đâu tôi định hỏi mà cứ quên:
- Tại sao bạn cần copy?
- Copy là để paste vào nơi nào đó chăng?
- Vậy sao không viết code để làm luôn (copy và paste đến đích)
Ai lại viết code nữa vời thế này?
 
Lần chỉnh sửa cuối:
Upvote 0
Không biết nữa anh NDU,
Mình chép nguyên cái code của anh bỏ vô mà...hic
 
Upvote 0
Cái List trong ComboBox ở đâu rồi? Bạn buồn cười thật đó!
----------
Mà thôi, ngay từ đâu tôi định hỏi mà cứ quên:
- Tại sao bạn cần copy?
- Copy là để paste vào nơi nào đó chăng?
- Vậy sao không viết code để làm luôn (copy và paste đến đích)
Ai lại viết code nữa vời thế này?

Hihi, Chỉ là cần đến copy thôi anh NDU. Còn past là mình past qua file khác anh à
 
Upvote 0
Upvote 0
Paste ra file nào cũng được, sao bạn không code 1 lần luôn? Tức copy và paste
---------------

File là của bạn. Bạn không biết thì AI BIẾT
Thôi, nghỉ chơi!

Anh giúp giúp mình đi. Còn cái file để past vào do nó hay thay đổi, và mỗi chu kỳ lại khác nhau. Nên mình chỉ cần đến copy thôi anh à.
 
Upvote 0
Paste ra file nào cũng được, sao bạn không code 1 lần luôn? Tức copy và paste
---------------

File là của bạn. Bạn không biết thì AI BIẾT
Thôi, nghỉ chơi!

thôi anh giúp bạn ấy đi.................
cái combobx list đó là do tôi tạo ra, tại vì lúc đâu bạn ấy tạo một cái list phụ làm source cho dropdown.
tôi thấy vậy mất công quá nên xoá đi cái list phụ đó.........vào tạo lại combobox.............chắc vì vậy bạn ấy ko biết
 
Upvote 0
thôi anh giúp bạn ấy đi.................
cái combobx list đó là do tôi tạo ra, tại vì lúc đâu bạn ấy tạo một cái list phụ làm source cho dropdown.
tôi thấy vậy mất công quá nên xoá đi cái list phụ đó.........vào tạo lại combobox.............chắc vì vậy bạn ấy ko biết

Mai sẽ tiếp!
Ẹc... Ẹc...
 
Upvote 0
Tiếp tục cho bạn đây!
1> Code chuyển đổi dữ liệu thành mảng (trong Module)
Mã:
Function Convert2Array(ByVal CustomFormat As String, ByVal IgnoreBlanks As Boolean, ParamArray arrays())
  Dim aTmp, arr(), Item, tmp As String
  Dim i As Long, n As Long
  On Error Resume Next
  For i = LBound(arrays) To UBound(arrays)
    aTmp = arrays(i)
    If Not IsArray(aTmp) Then aTmp = Array(aTmp)
    For Each Item In aTmp
      tmp = IIf(TypeName(Item) = "Error", "", Trim(CStr(Item)))
      If IgnoreBlanks = False Or Len(tmp) Then
        n = n + 1
        ReDim Preserve arr(1 To n)
        If Len(CustomFormat) Then
          arr(n) = Format(tmp, CustomFormat)
        Else
          arr(n) = tmp
        End If
      End If
    Next
  Next
  If n Then Convert2Array = arr
End Function
2> Nạp list cho ComboBox (trong Sheet1)
Mã:
Private Sub ComboBox1_DropButtonClick()
  Dim arrays, arr
  On Error Resume Next
  arrays = Sheet1.Range("A4:A10000")
  arr = Convert2Array("dd/mm", True, arrays)
  Sheet1.ComboBox1.List() = arr
End Sub
3> Code copy dữ liệu khi chọn ComboBox
Mã:
Private Sub ComboBox1_Click()
  Dim strDate As String, rFind As Range, rCopy As Range
  On Error Resume Next
  strDate = ComboBox1.Value
  With Range("A2:AB10000")
    Set rFind = .Resize(, 1).Find(strDate, , xlValues, xlWhole)
    If Not rFind Is Nothing Then
      Set rCopy = Intersect(.Cells, .Offset(, 2), rFind.EntireRow)
      Set rCopy = rCopy.Resize(rFind.MergeArea.Rows.Count)
      rCopy.Copy
    End If
  End With
End Sub
Với code này, mọi thay đổi ngày tháng tại cột A sẽ lập tức được cập nhật vào ComboBox
Xem file
 

File đính kèm

Upvote 0
Tiếp tục cho bạn đây!
1> Code chuyển đổi dữ liệu thành mảng (trong Module)
Mã:
Function Convert2Array(ByVal CustomFormat As String, ByVal IgnoreBlanks As Boolean, ParamArray arrays())
  Dim aTmp, arr(), Item, tmp As String
  Dim i As Long, n As Long
  On Error Resume Next
  For i = LBound(arrays) To UBound(arrays)
    aTmp = arrays(i)
    If Not IsArray(aTmp) Then aTmp = Array(aTmp)
    For Each Item In aTmp
      tmp = IIf(TypeName(Item) = "Error", "", Trim(CStr(Item)))
      If IgnoreBlanks = False Or Len(tmp) Then
        n = n + 1
        ReDim Preserve arr(1 To n)
        If Len(CustomFormat) Then
          arr(n) = Format(tmp, CustomFormat)
        Else
          arr(n) = tmp
        End If
      End If
    Next
  Next
  If n Then Convert2Array = arr
End Function
2> Nạp list cho ComboBox (trong Sheet1)
Mã:
Private Sub ComboBox1_DropButtonClick()
  Dim arrays, arr
  On Error Resume Next
  arrays = Sheet1.Range("A4:A10000")
  arr = Convert2Array("dd/mm", True, arrays)
  Sheet1.ComboBox1.List() = arr
End Sub
3> Code copy dữ liệu khi chọn ComboBox
Mã:
Private Sub ComboBox1_Click()
  Dim strDate As String, rFind As Range, rCopy As Range
  On Error Resume Next
  strDate = ComboBox1.Value
  With Range("A2:AB10000")
    Set rFind = .Resize(, 1).Find(strDate, , xlValues, xlWhole)
    If Not rFind Is Nothing Then
      Set rCopy = Intersect(.Cells, .Offset(, 2), rFind.EntireRow)
      Set rCopy = rCopy.Resize(rFind.MergeArea.Rows.Count)
      rCopy.Copy
    End If
  End With
End Sub
Với code này, mọi thay đổi ngày tháng tại cột A sẽ lập tức được cập nhật vào ComboBox
Xem file

Thanks anh NDU rất rất nhiều. Tuy nhiên, mình có thể làm thêm code để đến khi mình chọn ở ở dòng nào thì con trỏ chuột chạy theo đến dòng đó không anh.
Ví dụ: Khi mình chọn ngày 10/09 thì con trỏ chuột sẽ nằm ở cell A14:A22 không anh.
 
Upvote 0
Thanks anh NDU rất rất nhiều. Tuy nhiên, mình có thể làm thêm code để đến khi mình chọn ở ở dòng nào thì con trỏ chuột chạy theo đến dòng đó không anh.
Ví dụ: Khi mình chọn ngày 10/09 thì con trỏ chuột sẽ nằm ở cell A14:A22 không anh.

Quá dễ:
Mã:
Private Sub ComboBox1_Click()
  Dim strDate As String, rFind As Range, rCopy As Range
  On Error Resume Next
  strDate = ComboBox1.Value
  With Range("A2:AB10000")
    Set rFind = .Resize(, 1).Find(strDate, , xlValues, xlWhole)
    If Not rFind Is Nothing Then
      Set rCopy = Intersect(.Cells, .Offset(, 2), rFind.EntireRow)
      Set rCopy = rCopy.Resize(rFind.MergeArea.Rows.Count)
      [COLOR=#ff0000][B]Application.Goto rCopy[/B][/COLOR]
      rCopy.Copy
    End If
  End With
End Sub
Chổ màu đỏ là chổ thêm vào
 
Upvote 0
Dear anh NDU,
Không hiểu sao code của anh khi bỏ vào file gốc của em lại không chạy được.
Em có đổi tên Sheét thành đúng tên sheet "Scorecacrd" trong file gốc.
Anh xem giúp em nhé.
Thanks
 

File đính kèm

Upvote 0
Dear anh NDU,
Không hiểu sao code của anh khi bỏ vào file gốc của em lại không chạy được.
Em có đổi tên Sheét thành đúng tên sheet "Scorecacrd" trong file gốc.
Anh xem giúp em nhé.
Thanks

hình như sửa lại như vậy được nè

Private Sub ComboBox1_DropButtonClick()
Dim arrays, arr
On Error Resume Next
arrays = Sheets("Scorecard").Range("A4:A10000") ' hoặc sheet7
arr = Convert2Array("dd/mm", True, arrays)
Sheets("Scorecard").ComboBox1.List() = arr ' hoặc sheet7
End Sub

chắc là bạn nên trang bị cho một một ít kiến thức về vba, nếu muốn sử dụng nó
 
Upvote 0
hình như sửa lại như vậy được nè

Private Sub ComboBox1_DropButtonClick()
Dim arrays, arr
On Error Resume Next
arrays = Sheets("Scorecard").Range("A4:A10000") ' hoặc sheet7
arr = Convert2Array("dd/mm", True, arrays)
Sheets("Scorecard").ComboBox1.List() = arr ' hoặc sheet7
End Sub

chắc là bạn nên trang bị cho một một ít kiến thức về vba, nếu muốn sử dụng nó

Thanks Let's GâuGâu nhiều.
Chắc là phải trang bị vấn đề này thật rồi. Kém cỏi quá...hichic
 
Upvote 0

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

Back
Top Bottom