Mình có file DS hoc sinh.xls . Sheet1 là danh sách học sinh toàn khối . Mình muốn tự động cập nhật có điều kiện sang các sheet khác . Cụ thể : Em nào ở lớp 6/1 thì tự động cập nhật sang sheet 6/1 , Em nào ở lớp 6/2 thì tự động cập nhật sang sheet 6/2 .... nếu Sheet1 là danh sách học sinh toàn khối có chỉnh sửa thì các sheet kia cũng tự động cập nhật . Rất mong các bạn giúp đỡ , cám ơn rất nhiều !
có File đính kèm :
Bạn thử lại nhé, mình chưa xem kỹ lại đâu
Cách tạo nút:
View ==> Toolbars ==> Control Toolbox
Khi thanh công cụ hiện lên bạn thò "anh tý" vào hình cái nút bấm chọn, thò vào bảng tính vẽ cái nút, double click chép code vào là ...xong
Bạn concogia ơi ! Mình làm thử thì nó chạy ngon lắm , nhưng mình làm thiệt thì lúc đầu nó cũng chạy tốt , đến lúc gần xong thì nó báo lỗi tùm lum . Thôi mình gởi file nhờ bạn chỉnh giùm mình với nha . Nhờ bạn thêm dùm code hai cái nút DS CHUYEN ĐI và nút DS BO HOC để mình lọc qua 2 sheet CHUYEN DI và BO HOC . Còn ở các sheet từng lớp nếu có thể bạn bỏ dùm mình cột lớp nha bạn vì DS từng lớp nên mình muốn ghi phía trên tiêu đề . Bạn làm ơn giúp mình với , mình cám ơn bạn rất nhiều .
Bạn concogia ơi ! Mình làm thử thì nó chạy ngon lắm , nhưng mình làm thiệt thì lúc đầu nó cũng chạy tốt , đến lúc gần xong thì nó báo lỗi tùm lum . Thôi mình gởi file nhờ bạn chỉnh giùm mình với nha . Nhờ bạn thêm dùm code hai cái nút DS CHUYEN ĐI và nút DS BO HOC để mình lọc qua 2 sheet CHUYEN DI và BO HOC . Còn ở các sheet từng lớp nếu có thể bạn bỏ dùm mình cột lớp nha bạn vì DS từng lớp nên mình muốn ghi phía trên tiêu đề . Bạn làm ơn giúp mình với , mình cám ơn bạn rất nhiều .
Khi copy code vào các nút bạn copy dư cái này: Option Explicit ở trên đầu, xóa mấy em đó đi là ổn
Đây là code khối 1 (thêm phần xóa cột lớp)
Mã:
Private Sub CommandButton1_Click()
Application.ScreenUpdating = False
Dim Ws As Worksheet, i, J As Integer
For J = 1 To 6
Set Ws = Sheets("1." & J)
Ws.Range(Ws.[A4], Ws.[O4].End(xlDown)).Clear
With Range([a1], [a1000].End(xlUp)).Resize(, 15)
.AutoFilter Field:=15, Criteria1:="1/" & J
.SpecialCells(xlCellTypeVisible).Copy Ws.[A4]
.AutoFilter
End With
Ws.[O:O].Delete
For i = 1 To Ws.Range(Ws.[B5], Ws.[B5].End(xlDown)).Rows.Count
Ws.Cells(i + 4, 1) = i
Next
Next
Application.ScreenUpdating = True
End Sub
Chú ý khi copy chỉ cần copy từ Application....thôi nhé
Tạo nút BOHOC, them sheet mới tên BOHOC, chép cái này vào nút BOHOC
Mã:
Private Sub CommandButton9_Click()
Application.ScreenUpdating = False
Dim Ws As Worksheet, i As Integer
Set Ws = Sheets("BOHOC")
Ws.Range(Ws.[A4], Ws.[O4].End(xlDown)).Clear
With Range([a1], [a1000].End(xlUp)).Resize(, 15)
.AutoFilter Field:=15, Criteria1:="BH"
.SpecialCells(xlCellTypeVisible).Copy Ws.[A4]
.AutoFilter
End With
For i = 1 To Ws.Range(Ws.[B5], Ws.[B5].End(xlDown)).Rows.Count
Ws.Cells(i + 4, 1) = i
Next
Application.ScreenUpdating = True
End Sub
Tương tự như thế khi bạn tạo nút và sheet học sinh chuyển đi ( bạn sửa: Set Ws = Sheets("BOHOC") thành Set Ws = Sheets("DI") & Criteria1:="BH" thành Criteria1:="DI" nhé)
Híc, chúc bạn làm lại ngon cơm (làm nhiều lần mới nhớ nhiều)
Có 2 vấn đề với câu hỏi của bạn:
1/Giải quyết vấn đề cụ thể của bài: Mình viết 2 hàm rất nhỏ để giải quyết vấn đề này. Nhưng khó khăn là bạn dùng tên làm tiêu chuẩn trong khi tên rất dài tiềm ẩn sai sót làm các hàm tìm kiếm và tổng hợp theo điều kiện bị sai lệch. Ví dụ: Đố bạn 2 tên này có gì khác nhau: Fork R Gear Shift ( 24211 - KPH - 9001) và Fork R Gear Shift ( 24211 - KPH - 9001)
Do vậy, khi nhập nên dùng validation , Combobox hay chép dán chứ gõ trực tiếp e không ổn cho việc thống kê, kể cả các hàm trong 1 sheet. Mình tranh thủ viết đêm nên chưa soát hết được, bạn kiểm tra chỗ sao sai thì chắc là tên đó bị sai và dùng copy rồi paste vào thay thế tất cả các ô tên đó trên sheet tháng và sheet tổng hợp.
Hàm 1: Mình đổi CodeName các sheet tháng thành Tn. Ví dụ Sheet "Jan" thành T1
Mã:
Function Look(ByVal ch, cl1, cl2 As String, m As Date) As Double
Dim sh As Worksheet, i
Dim c As Range
Set sh = Choose(Month(m), T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12)
With sh.Range(cl1 & "1:" & cl1 & "500")
Set c = .Find(ch, LookIn:=xlValues, LookAt:=xlWhole, SearchOrder:=xlByColumns)
If Not c Is Nothing Then
Look = sh.Cells(c.Row, cl2)
Else
Look = 0
End If
End With
End Function
Cú pháp =Look(TenSP,Cot_ten,Cot_tim,Thang_tim)
Hàm 2: Hàm Sumif cải biên:
Mã:
Function LookSum(ByVal ch As String, cl As String, m As Date) As Double
Dim sh As Worksheet, i
Set sh = Choose(Month(m), T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12)
i = sh.[b65536].End(xlUp).Row
LookSum = WorksheetFunction.SumIf(sh.Range("C5:C" & i), "=" & ch, sh.Range(cl & "5:" & cl & i))
End Function
Cú pháp: =LookSum(Ten,Cot_tien,Thang)
Lưu ý trong các hàm này cột là ký tự cột. ví dụ cột D nhập "D"
2/Bạn nên cải tiến File không nhập thế này mà nhập chung 1 sheet DATA sau đó sử lý các báo cáo. Nen bổ xung cột Mã SP để việc tổng hợp và sử lý dữ liệu chính xác nhất.
mình có file ds hoc sinh.xls . Sheet1 là danh sách học sinh toàn khối . Mình muốn tự động cập nhật có điều kiện sang các sheet khác . Cụ thể : Em nào ở lớp 6/1 thì tự động cập nhật sang sheet 6/1 , em nào ở lớp 6/2 thì tự động cập nhật sang sheet 6/2 .... Nếu sheet1 là danh sách học sinh toàn khối có chỉnh sửa thì các sheet kia cũng tự động cập nhật . Rất mong các bạn giúp đỡ , cám ơn rất nhiều !
Có file đính kèm :
Có 2 vấn đề với câu hỏi của bạn:
1/Giải quyết vấn đề cụ thể của bài: Mình viết 2 hàm rất nhỏ để giải quyết vấn đề này. Nhưng khó khăn là bạn dùng tên làm tiêu chuẩn trong khi tên rất dài tiềm ẩn sai sót làm các hàm tìm kiếm và tổng hợp theo điều kiện bị sai lệch. Ví dụ: Đố bạn 2 tên này có gì khác nhau: Fork R Gear Shift ( 24211 - KPH - 9001) và Fork R Gear Shift ( 24211 - KPH - 9001)
Do vậy, khi nhập nên dùng validation , Combobox hay chép dán chứ gõ trực tiếp e không ổn cho việc thống kê, kể cả các hàm trong 1 sheet. Mình tranh thủ viết đêm nên chưa soát hết được, bạn kiểm tra chỗ sao sai thì chắc là tên đó bị sai và dùng copy rồi paste vào thay thế tất cả các ô tên đó trên sheet tháng và sheet tổng hợp.
Hàm 1: Mình đổi CodeName các sheet tháng thành Tn. Ví dụ Sheet "Jan" thành T1
Mã:
Function Look(ByVal ch, cl1, cl2 As String, m As Date) As Double
Dim sh As Worksheet, i
Dim c As Range
Set sh = Choose(Month(m), T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12)
With sh.Range(cl1 & "1:" & cl1 & "500")
Set c = .Find(ch, LookIn:=xlValues, LookAt:=xlWhole, SearchOrder:=xlByColumns)
If Not c Is Nothing Then
Look = sh.Cells(c.Row, cl2)
Else
Look = 0
End If
End With
End Function
Cú pháp =Look(TenSP,Cot_ten,Cot_tim,Thang_tim)
Hàm 2: Hàm Sumif cải biên:
Mã:
Function LookSum(ByVal ch As String, cl As String, m As Date) As Double
Dim sh As Worksheet, i
Set sh = Choose(Month(m), T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12)
i = sh.[b65536].End(xlUp).Row
LookSum = WorksheetFunction.SumIf(sh.Range("C5:C" & i), "=" & ch, sh.Range(cl & "5:" & cl & i))
End Function
Cú pháp: =LookSum(Ten,Cot_tien,Thang)
Lưu ý trong các hàm này cột là ký tự cột. ví dụ cột D nhập "D"
2/Bạn nên cải tiến File không nhập thế này mà nhập chung 1 sheet DATA sau đó sử lý các báo cáo. Nen bổ xung cột Mã SP để việc tổng hợp và sử lý dữ liệu chính xác nhất.
Bạn nào giúp mình đoạn code này với : mình muốn nhấn vào nút Khoi 1 thì toàn bộ danh sách khối một sẽ copy sang sheet K1 , nút Khoi 2 thì sang sheet K2 ... mình làm hoài vẫn chưa được . mình gởi file nhờ các bạn sửa code dùm nha :
Macro này được triệu gọi từ 5 macro gắn với 5 nút lệnh của bạn
PHP:
Sub AdvFilter(Khoi As Byte)
Dim Sh As Worksheet, eRw As Long, ShName As String
eRw = [c65500].End(xlUp).Row
Range("B1:O" & eRw).AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=Range( _
"Y1:Y2"), CopyToRange:=Range("AA1:AN1"), Unique:=False
ShName = Switch(Khoi = 1, "K1", Khoi = 2, "K2", Khoi = 3, "K3", Khoi = 4, "K4", Khoi = 5, "K5")
Set Sh = Sheets(ShName)
[aa1].CurrentRegion.Copy Destination:=Sh.[B2]
Sh.Select: Set Sh = Nothing
End Sub
Cám ơn bạn HYen17 rất nhiều . Quả thật cách của bạn mình đọc không hiểu lắm , vì mình dân mới tập sự , nhưng vô tình nó gợi ý cho mình thay vì chỗ Criteria1:="1/" thì phải viết Criteria1:="1/*" là OK . Nó chạy rất tốt . Mình sẽ từ từ nghiên cứu thêm về cách của bạn .Nhưng dù sau mình cũng cám ơn bạn rất nhiều .
Mình không rành VB code, chỉ biết record macro rồi chỉnh sửa chút xíu cho phù hợp.
Mình đang có một file excel theo doĩ chi tiết hàng ngaỳ mỗi ngaỳ là 1 cột, kéo daì cho 12 tháng (file 1) nhưng report cần gủi cho sếp (file 2) chỉ cần paste value 7 cột của 7 ngaỳ gần nhất.
Có cách nào so sánh ngaỳ của từng cột trên file 1, nếu cột đó <= today+7 thì copy-paste vale qua file 2
Nhờ các bạn giúp mình viết đoạn code cho phù hợp
Rất mong nhận được phản hồi và xin cảm ơn nhiều
Để tránh phải sửa chữa và trọng tâm bạn nên có 1 file mẫu, bạn xoá bớt dữ liệu để nhel file nha. Trên file có sheet ghi chép hàng ngày và sheet báo cáo. Như vậy, mọi người sẽ tìm cách chép dữ liệu sang sheet báo cáo cho bạn tuỳ theo ngày báo cáo.
Mình không rành VB code, chỉ biết record macro rồi chỉnh sửa chút xíu cho phù hợp.
Mình đang có một file excel theo doĩ chi tiết hàng ngaỳ mỗi ngaỳ là 1 cột, kéo daì cho 12 tháng (file 1) nhưng report cần gủi cho sếp (file 2) chỉ cần paste value 7 cột của 7 ngaỳ gần nhất.
Có cách nào so sánh ngaỳ của từng cột trên file 1, nếu cột đó <= today+7 thì copy-paste vale qua file 2
Nhờ các bạn giúp mình viết đoạn code cho phù hợp
Rất mong nhận được phản hồi và xin cảm ơn nhiều
Để tránh phải sửa chữa và trọng tâm bạn nên có 1 file mẫu, bạn xoá bớt dữ liệu để nhel file nha. Trên file có sheet ghi chép hàng ngày và sheet báo cáo. Như vậy, mọi người sẽ tìm cách chép dữ liệu sang sheet báo cáo cho bạn tuỳ theo ngày báo cáo.
Cảm ơn bạn, nhưng bạn ơi, mình tính lồng đoạn VB code này vô 1 đoạn VB khác để bấm nút là tự động copy- paste value vô sheet report gửi đi, nếu được nhờ bạn giúp mình đoạn code để thực hiện copy theo điều kiện trong vòng 7 ngaỳ tiếp theo kể từ ngaỳ hiện taị nhé.
Đoạn code dưới đây chỉ đơn giản là thao tác copy toàn bộ rồi paste value và paste format qua file report gửi đi. Bạn tham khaỏ nhé, rất mong nhận được sự hỗ trợ của bạn.
Sub senddailyreport() 'Macro recorded 17/08/2010 by Annq
Còn đây là file phát sinh riêng và file báo cáo riêng. Khi lập báo cáo mở file báo cáo rồi nhập ngày nhấn nút báo cáo là code sẽ mở file phatsinh chép dữ liệu điền vào báo cáo.
Yêu cầu: 2 file có thể để bất cứ đâu miễn chúng cùng chung thư mục, bạn phải tải về giải nén ra ổ đĩa Code mới tìm thấy file Phat Sinh
Bạn ơi, cảm ơn bạn nhiều lắm, đúng là mình đang hí hoáy làm sao để liên kết ra cái file report khác thì được bạn hướng dẫn luôn.
Cho mình hỏi thêm chút xíu
Hiện giờ, mếu muốn baó cáo từ ngaý 1/9-7/9 thì phaỉ chọn ngaỳ baó caó là ngaỳ 7/9.
Nếu mình muốn baó cáo vẩn là từ ngày 1/9-7/9 nhưng gõ vô ô màu vàng là ngày 1/9 thì phải làm sao.
Thêm một chút xíu nữa, mình muốn để cái nút tạo báo cáo ở file phát sinh để file báo cáo gửi cho sếp hết sức đơn giản và không báo macro khi mở file ra (nếu không sếp hết hồn không thèm xem báo cáo mà tưởng virut)
Mình biết là phiền bạn nhưng rất mong được tiếp tục giúp đỡ
Việc chắc chắn sẽ dễ hơn trừ ngược. Bạn tham khảo Code để tìm hiểu đi. Mình sẽ có bài cho bạn nhưng không phải bây giờ.
Thông cảm nha, mình chỉ mong tốt cho bạn thôi.
Có 1 mẹo để sử dụng chính code không phải sửa nhiều là dòng
ng = sh1.[e2] bạn sửa thành ng = sh1.[e2] + 4
Nhưng đây không cơ bản vì code theo yêu cầu mới có thể gọn gàng hơn.