Sub ValueToTable()
Dim i As Long
For j = 7 To 9 'j chay tu thu tu cot G => thu tu cot I
For i = 1 To 9 '=Count(C8:C100)
If Cells(i + 7, 4) = Cells(7, j) Then 'So sanh
Cells(1000, j).End(3).Offset(1, 0) = Cells(i + 7, 3) 'Dien du lieu vao bang
End If
Next
Next
End Sub
Cảm ơn anh Ninh nhé!Bạn có thể ngâm cứu code sau để tuỳ biến
Mã:Sub ValueToTable() Dim i As Long For j = 7 To 9 'j chay tu thu tu cot G => thu tu cot I For i = 1 To 9 '=Count(C8:C100) If Cells(i + [COLOR=#0000CD][B]7[/B][/COLOR], 4) = Cells([COLOR=#FF0000][B]7[/B][/COLOR], j) Then 'So sanh Cells([COLOR=#FF0000][B]1000[/B][/COLOR], j).End([COLOR=#800080][B]3[/B][/COLOR]).Offset([COLOR=#008000][B]1[/B][/COLOR], 0) = Cells(i + [COLOR=#0000CD][B]7[/B][/COLOR], [B]3[/B]) 'Dien du lieu vao bang End If Next Next End Sub
Thì việc của bạn là phải giả lập dữ liệu cho giống với thật (nếu không muốn đưa file thật lên đây)Em đã test code chạy thấy chậm chậm, nếu bảng dữ liệu 1 của Em tầm 1500 dòng và bảng 2 khoảng 40 cột thì code trên liệu có chậm lắm không ạ?
Xin chào Thầy Cô và các Anh chị trong GPE!
Em đang gặp một vướng mắc như đã trình bày cụ thể trong file kèm.
Mong Thầy Cô và Anh Chị tìm cách giúp đỡ ạ!
Em xin cảm ơn!
Tôi tưởng bạn đang tìm hiểu VBA, nên thắc mắc để học hỏi, thế nên tôi đã "com men" một số dòng. Nhưng hoá ra là hỏi bâng quơ cho dữ liệu thựcCảm ơn anh Ninh nhé!
Code chạy rất đúng ý với file đính kèm, tuy nhiên em vẫn chưa hiểu lắm,phiền anh chỉ rõ thêm ạ:
-Có phải những số màu xanh là của bảng 1 và những số màu đỏ là của bảng 2 phải không anh?
-Số 3-1-3 ý nghĩa là gì vậy anh?
Em đã test code chạy thấy chậm chậm, nếu bảng dữ liệu 1 của Em tầm 1500 dòng và bảng 2 khoảng 40 cột thì code trên liệu có chậm lắm không ạ?
Thì việc của bạn là phải giả lập dữ liệu cho giống với thật (nếu không muốn đưa file thật lên đây)
Tôi cũng chưa hình dung lọc thế để làm gì nữa
Tôi thấy bài này nhưng chưa viết code vì.... tính tôi hơi kỳ: Phải thấy được sự cần thiết và sự hữu ích sau này thì mới tiến hành viết code. Hiếm khi viết code chỉ dùng 1 lần
Anh Ninh thông cảm cho ạ có những cái mà em không thể up lên được. vì đó là thông tin nội bộ.Tôi tưởng bạn đang tìm hiểu VBA, nên thắc mắc để học hỏi, thế nên tôi đã "com men" một số dòng. Nhưng hoá ra là hỏi bâng quơ cho dữ liệu thực
Thôi thì...biết vậy lần sau đợi thực rồi làm
Cảm ơn Anh Nhập môn ạ! Em muốn dùng VBA cơ. Vì sử dụng công thức mảng em cũng có áp dụng rồi:khi thầy viết bảng bụi phấn rơi rơi.....
G8=INDEX($C$8:$C$16,SMALL(IF($D$8:$D$16=G$7,ROW($C$8:$C$16)-7,""),ROW(1:1)))-->Ctrl shift enter
làm sao để bẫy lỗi
Bảng giờ.....xài bảng từ, bụi phấn ...........cóc có rơikhi thầy viết bảng bụi phấn rơi rơi.....
G8=INDEX($C$8:$C$16,SMALL(IF($D$8:$D$16=G$7,ROW($C$8:$C$16)-7,""),ROW(1:1)))-->Ctrl shift enter
làm sao để bẫy lỗi
Bẫy lỗi "dzì" nè=IF(ROW(A1)>COUNTIF($D$8:$D$16,G$7),"",INDEX($C$8:$C$16,SMALL(IF($D$8:$D$16=G$7,ROW($C$8:$C$16)-7,""),ROW(1:1))))
Cảm ơn Thầy Cò ạ!Bảng giờ.....xài bảng từ, bụi phấn ...........cóc có rơi
Bẫy lỗi "dzì" nè
Xì- pam í a xì- pam
To: KUMI
40 tổ làm 40 sheet, híc, sao không làm một bảng lọc thôi, cần xem hay in Tổ thì lôi tổ đó ra thôi
Thân
Thôi thì cứ giữ nguyên cấu trúc như file hiện có của bạn. Bạn sử dụng code sau cho đối tượng ThisWorkbook, lưu ý: Ngoại trừ Sheet1, các sheet còn lại phải có tên giống như trong cột BP (cột D) của Sheet1, vì code sẽ dựa trên tên sheet để lấy dữ liệu.Cảm ơn Thầy Cò ạ!
Sở dĩ con tách nhiều Sheets như vậy là vì dữ liệu không chỉ đơn giản là mấy cột đó thôi đâu ạ. mà còn rất nhiều cột và nhiều dòng khác nữa.
Con chỉ phác họa những ý chính cần thiết làm sao đủ để áp dụng được vào file thật của mình thôi ạ.
Ý kiến của Thầy con thấy rất có lý đấy ạ, vì mình có thể dùng auto filter để quản lý.
Nhưng hiện giờ file này liên quan đến nhiều các file khác quá. Nếu thay đổi cấu trúc e là mệt hơn nhiều đó ạ. Hì, có lẽ sau này có nhiều thời gian và kiến thức con sẽ xem lại sau vậy.
Cảm ơn sự góp ý của Thầy!
Mục đích làm vậy là để đưa các mã số từ bảng 2 tại mỗi cột sang mỗi Sheet khác nhau dành cho mỗi tổ.
Nói cách khác là bảng 2 của con chỉ là dữ liệu phụ.
Xin hỏi các Thầy có cách nào để tính tổng khi autofil không ạ?To: KUMI
40 tổ làm 40 sheet, híc, sao không làm một bảng lọc thôi, cần xem hay in Tổ thì lôi tổ đó ra thôi
Thân
Mục đích của con chỉ là đưa mã số từ bảng 1 các cột mã số ở từng Sheet nhỏ là công đoạn cuối cùng rồi Thầy ạ! mục đích là để quản lý thông tin của từng người,từng bộ phận.Vậy hỏi tiếp: Bạn đưa danh sách ấy sang các sheet để làm gì? Dùng làm validation list chăng?
Vấn đề của bạn có thể giải quyết êm đẹp bằng hàm SUBTOTAL, bạn thử xem, dễ ẹc à.Xin hỏi các Thầy có cách nào để tính tổng khi autofil không ạ?
Các Thầy xem file kèm ạ!
Thôi thì cứ giữ nguyên cấu trúc như file hiện có của bạn. Bạn sử dụng code sau cho đối tượng ThisWorkbook, lưu ý: Ngoại trừ Sheet1, các sheet còn lại phải có tên giống như trong cột BP (cột D) của Sheet1, vì code sẽ dựa trên tên sheet để lấy dữ liệu.
[GPECODE=vb]Private Sub Workbook_SheetActivate(ByVal Sh As Object)
Dim Tmp, Arr(), i As Long, k As Long, S As String
Application.ScreenUpdating = False
If Sh.Name = "Sheet1" Then Exit Sub
Tmp = Sheet1.[C810000]: S = Sh.Name
Sh.[B1110000].Clear
ReDim Arr(1 To UBound(Tmp), 1 To 2)
For i = 1 To UBound(Tmp)
If IsEmpty(Tmp(i, 1)) Then Exit For
If Tmp(i, 2) = S Then
k = k + 1
Arr(k, 1) = k: Arr(k, 2) = Tmp(i, 1)
End If
Next
If k = 0 Then Exit Sub
Sh.[B11].Resize(k, 2) = Arr
Sh.[D11].Resize(k) = S
Sh.[B11].CurrentRegion.Borders.LineStyle = 1
Application.ScreenUpdating = True
End Sub[/GPECODE]
- Nếu không muốn cập nhật cột Bộ phận thì bạn bỏ dòng lệnh thứ 17 đi.Cảm ơn Anh Nghĩa Phúc đã dành thời gian để nghĩ cách giúp em.
Em Test với file kèm thì đúng ạ.
Nhưng để đưa vào file thực em nghĩ chưa ổn lắm. Vì file thực của Em số dòng cột mỗi Sheets là Cố định (khoảng 120 dòng và 80 cột).
Ngoài 2 cột minh họa ra thì còn các cột thể hiện thông tin về mỗi cá nhân theo từng hạng mục.
Vì thế em chỉ muốn cập nhật dữ liệu kiểu value cho một cột duy nhất là cột mã số thôi ạ. Nhưng em thử file thấy cập nhật cả định dạng và cột bộ phận nữa ạ.
Ngoài có thể thay thế sự kiện Workbook_SheetActivate bằng việc chạy code được không Anh? Nghĩa là chỉ khi nào chạy code mới cập nhật anh ạ? chứ không nhất thiết phải liên tục khi đổi sheet như vậy ạ.
- Nếu không muốn cập nhật cột Bộ phận thì bạn bỏ dòng lệnh thứ 17 đi.
- Nếu không muốn thay đổi định dạng thì bạn sửa dòng thứ 6 thành Sh.[B11:C10000].ClearContents
- Bạn hoàn toàn có thể thay sử kiện Workbook_SheetActivate bởi 1 Sub trong Module, chỉ cần khai báo 1 biến Sh kiểu WorkSheet, sử dụng vòng lặp For để duyệt qua các sheet của Workbook là được.
- Còn việc code chạy ổn với file thực của bạn thì tôi đành chịu vì không biết file thực của bạn ra sao.
Thiệt tình cứ nhìn mấy file Merge cell là thấy oải, chẳng muốn nghiên cứu gì thêm. Hãy bố trí dữ liệu cho khoa học đi bạn ơi.Hi, Em cảm ơn Anh Phúc nhiều nhé! Code của anh em áp dụng được vào file kèm rồi ạ.
Em tiện đây em xin hỏi thêm nếu trong trường hợp em áp dụng với một file kèm như thế này, thì code phải sửa thế nào vậy Anh?
Cảm ơn anh ạ!
Về cơ bản thì nó là thế này:Dạ vâng! Cảm ơn Anh đã chỉ giáo ạ. Em hỏi như vậy cũng là nghĩ do nghĩ đến một file tương tự dạng này thôi ạ.
Vậy nếu bỏ Merge cell thì như thế này.
Liệu code trên có thể sửa lại để phù hợp với dạng này không ạ?
nghĩa là dữ liệu điền xen kẽ qua 2 dòng. Anh xem thêm file kèm ạ!
Về cơ bản thì nó là thế này:
[GPECODE=vb]Sub LocDuLieu()
Dim Tmp, Arr(), i As Long, k As Long, Sh As Worksheet, S As String
Application.ScreenUpdating = False
For Each Sh In ThisWorkbook.Sheets
If Sh.Name <> "Sheet1" Then
Tmp = Sheets("Sheet1").[C810000]: S = Sh.Name
Sh.[B11:C10000].ClearContents
ReDim Arr(1 To 3 * UBound(Tmp), 1 To 2)
k = 1
For i = 1 To UBound(Tmp)
If IsEmpty(Tmp(i, 1)) Then Exit For
If Tmp(i, 2) = S Then
Arr(k, 1) = k \ 3 + 1: Arr(k, 2) = Tmp(i, 1)
k = k + 3
End If
Next
If k = 1 Then Exit Sub
Sh.[B11].Resize(k - 3, 2) = Arr
End If
Next
Application.ScreenUpdating = True
End Sub[/GPECODE]
Còn thêm màu mè, mắm muối gì đó thì tùy bạn.
Chỉnh sửa code trên một chút sẽ hợp lý hơn:Em cảm ơn ạ! Hiện tại em đã thử thấy rất ổn. Sau có vấn đề gì phát sinh em lại tìm anh..hihi!