Viết macro để copy giữa các file

Liên hệ QC

thienthanvuive

Thành viên mới
Tham gia
25/2/08
Bài viết
22
Được thích
5
Chào các bạn, mình là người mới chưa biết gì về macro nhờ các bạn việc sau:
1/ Mình có "file1" có mã nhân viên, tên nhân viên cùng với lương của 1 số người trong số họ. Mình nhờ các bạn viết giúp mình 1 macro ở "file2" (file excel khác) thực hiện việc: tìm kiếm trong file1 này những nhân viên nào có lương thì copy tên và mã nhân viên của họ sang file2 trong 1 vùng định trước (ví dụ A1:D10) theo quy tắc: tìm thấy người thứ nhất thì copy tên của họ lên 1 ô của cột A(ô A1), mã nhân viên của họ lên 1 ô khác (ô A2); tìm thấy người thứ 2 thì copy ô của họ lên 1 ô tiếp (ô A3), mã nhân viên của họ lên 1 ô tiếp (ô A4) ... cứ như vậy ... đến nhân viên thứ x có lương (chẳng hạn x=10) thì copy lên 1 ô của cột B (ô B1) như với cột A ... đến nhân viên thứ y có lương (chẳng hạn y=20) thì copy lên 1 ô của cột C (ô C1) như với cột A ...
2/ Giả sử "file1" có 100 tên và mã nhân viên trong đó có lương của 1 số người (ko biết trước), "file3" có 500 tên và mã nhân viên chưa có lương. Trong 500 nhân viên bao gồm một số nhân viên của file1 (ko biết số lượng). Các bạn viết giúp mình 1 macro thực hiện công việc: tìm kiếm trong 500 nhân viên của "file3" có nhân viên nào của "file1" có lương thì copy lương của họ sang cột lương của "file3"; đồng thời nhân viên nào của "file1" có lương mà chưa có tên và mã ở "file3" thì copy mã, tên và lương của họ sang "file3". Cám ơn các bạn nhiều!
 

File đính kèm

Một vài gợi ý: Viết macro trên file2 thực hiện
- Mở file1, copy dữ liệu chuyển sang 1 sheet tạm của file2, đóng file1
- Tìm kiếm trên sheet tạm các dòng thỏa mãn yêu cầu và chuyển vào nơi cần thiết.
- Xóa dữ liệu sheet tạm
 
Upvote 0
Tôi nghĩ bạn nên đi từ thấp lên cao... nếu chưa biết gì thì cho dù mọi người có làm sẳn cho bạn cũng bằng thừa... Bạn ko hiểu thì cũng chẳng giúp ích dc gì cho việc tăng cường kiến thức, đúng ko?
Giãi pháp của tôi là: Với những file có cùng cấu trúc, ta nên gôm chung về 1 file, lúc đó bạn muốn làm gì mà chả dc... Khi nền tảng của bạn đã vững chắc rồi thì vô tư mà tung hoành ngang dọc...
Hic...
ANH TUẤN
 
Upvote 0
thienthanvuive đã viết:
Chào các bạn, mình nhờ các bạn việc sau:
1/ Mình có "file1" có mã nhân viên, tên nhân viên cùng với lương của 1 số người trong số họ. Mình nhờ các bạn viết giúp mình 1 macro ở "file2" (file excel khác) thực hiện việc: tìm kiếm trong file1 này những nhân viên nào có lương thì copy tên và mã nhân viên của họ sang file2 trong 1 vùng định trước (ví dụ A1:D10) theo quy tắc: tìm thấy người thứ nhất thì copy tên của họ lên 1 ô của cột A(ô A1), mã nhân viên của họ lên 1 ô khác (ô A2); tìm thấy người thứ 2 thì copy ô của họ lên 1 ô tiếp (ô A3), mã nhân viên của họ lên 1 ô tiếp (ô A4) ... cứ như vậy ... đến nhân viên thứ x có lương (chẳng hạn x=10) thì copy lên 1 ô của cột B (ô B1) như với cột A ... đến nhân viên thứ y có lương (chẳng hạn y=20) thì copy lên 1 ô của cột C (ô C1) như với cột A ...
Cám ơn các bạn nhiều!
Câu số 1: Bạn xem thêm trong file đính kèm; Chú í đường dẫn của 2 file:
* Hoặc là tạo các thư mục như của mình;
* Hay là sửa lại dòng lệnh tương ứng;

PHP:
Option Explicit
Sub CopyAndFilter()
 Dim lRow As Long, jZ As Long
 Dim SoDem As Byte, bCol As Byte
  
 Sheets("Sheet1").Select
 Range("A2:z99").Select:                 Selection.ClearContents
 Sheets("Sheet2").Select
 Cells.Select:                           Selection.ClearContents
 Workbooks.Open Filename:="D:\DQSa\GPE\NhVien1.xls"
 Application.ScreenUpdating = False
 Cells.Select:                           Selection.Copy
 Windows("NhVien02.xls").Activate
 Range("A1").Select:                     ActiveSheet.Paste
 Windows("NhVien1.xls").Activate
 Application.CutCopyMode = False:        ActiveWorkbook.Close
    
 Range("A1:E1").Select:                     Selection.Copy
 Range("G1").Select:                        ActiveSheet.Paste
 Range("G5").Select:                        ActiveSheet.Paste
 Range("K2").Select
 Application.CutCopyMode = False
    
 ActiveCell.FormulaR1C1 = ">0"
 lRow = Range("B65432").End(xlUp).Row
 Range("A1:E" & lRow).AdvancedFilter Action:=xlFilterCopy, CriteriaRange:= _
    Range("G1:K2"), CopyToRange:=Range("G5:K5"), Unique:=False
 lRow = Range("H65432").End(xlUp).Row
 Range("G5:K" & lRow).Select
 Selection.Sort Key1:=Range("G6"), Order1:=xlAscending, Key2:=Range("H6") _
    , Order2:=xlAscending, Key3:=Range("K6"), Order3:=xlAscending, Header:= _
    xlGuess, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
    DataOption1:=xlSortNormal, DataOption2:=xlSortNormal, DataOption3:= _
    xlSortNormal
bCol = 1:                                  SoDem = 5
Sheets("Sheet1").Range("A2:Z999").ClearContents
Do
    SoDem = SoDem + 1
    If (SoDem + 3) Mod 9 = 0 Then bCol = 1 + bCol
    Sheets("Sheet1").Cells(1, bCol + 1) = "DSach"
    If Len(Cells(SoDem, 8)) < 1 Then Exit Do
    Cells(SoDem, 10).Copy Destination:=Sheets("Sheet1").Range(Chr(65 + bCol) & _
            Sheets("Sheet1").Range(Chr(65 + bCol) & "65432").End(xlUp).Row + 2)
    Cells(SoDem, 8).Copy Destination:=Sheets("Sheet1").Range(Chr(65 + bCol) & _
            Sheets("Sheet1").Range(Chr(65 + bCol) & "65432").End(xlUp).Row + 1)
 Loop
 Sheets("Sheet1").Select
End Sub


Sẽ không giải quyết cho bạn câu thứ hai đâu!
Vấn đề ở chổ: Bạn nên nghe theo gợi í của những người 'Đi trước': Nhốt chung vô 1 file thôi!

 

File đính kèm

Upvote 0
vậy em có một sheet1 in trang là "landscap" em muốn copy sang sheet2 cũng giữa nguyên định dạng giống sheet1 thì sao........chứ như thế mổi lần copy thi phải chỉnh sửa lại mất thời gian lắm?
 
Upvote 0
SA_DQ đã viết:
Câu số 1: Bạn xem thêm trong file đính kèm; Chú í đường dẫn của 2 file:
* Hoặc là tạo các thư mục như của mình;
* Hay là sửa lại dòng lệnh tương ứng;

PHP:
Option Explicit
Sub CopyAndFilter()
 Dim lRow As Long, jZ As Long
 Dim SoDem As Byte, bCol As Byte
  
 Sheets("Sheet1").Select
 Range("A2:z99").Select:                 Selection.ClearContents
 Sheets("Sheet2").Select
 Cells.Select:                           Selection.ClearContents
 Workbooks.Open Filename:="D:\DQSa\GPE\NhVien1.xls"
 Application.ScreenUpdating = False
 Cells.Select:                           Selection.Copy
 Windows("NhVien02.xls").Activate
 Range("A1").Select:                     ActiveSheet.Paste
 Windows("NhVien1.xls").Activate
 Application.CutCopyMode = False:        ActiveWorkbook.Close
    
 Range("A1:E1").Select:                     Selection.Copy
 Range("G1").Select:                        ActiveSheet.Paste
 Range("G5").Select:                        ActiveSheet.Paste
 Range("K2").Select
 Application.CutCopyMode = False
    
 ActiveCell.FormulaR1C1 = ">0"
 lRow = Range("B65432").End(xlUp).Row
 Range("A1:E" & lRow).AdvancedFilter Action:=xlFilterCopy, CriteriaRange:= _
    Range("G1:K2"), CopyToRange:=Range("G5:K5"), Unique:=False
 lRow = Range("H65432").End(xlUp).Row
 Range("G5:K" & lRow).Select
 Selection.Sort Key1:=Range("G6"), Order1:=xlAscending, Key2:=Range("H6") _
    , Order2:=xlAscending, Key3:=Range("K6"), Order3:=xlAscending, Header:= _
    xlGuess, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
    DataOption1:=xlSortNormal, DataOption2:=xlSortNormal, DataOption3:= _
    xlSortNormal
bCol = 1:                                  SoDem = 5
Sheets("Sheet1").Range("A2:Z999").ClearContents
Do
    SoDem = SoDem + 1
    If (SoDem + 3) Mod 9 = 0 Then bCol = 1 + bCol
    Sheets("Sheet1").Cells(1, bCol + 1) = "DSach"
    If Len(Cells(SoDem, 8)) < 1 Then Exit Do
    Cells(SoDem, 10).Copy Destination:=Sheets("Sheet1").Range(Chr(65 + bCol) & _
            Sheets("Sheet1").Range(Chr(65 + bCol) & "65432").End(xlUp).Row + 2)
    Cells(SoDem, 8).Copy Destination:=Sheets("Sheet1").Range(Chr(65 + bCol) & _
            Sheets("Sheet1").Range(Chr(65 + bCol) & "65432").End(xlUp).Row + 1)
 Loop
 Sheets("Sheet1").Select
End Sub


Sẽ không giải quyết cho bạn câu thứ hai đâu!
Vấn đề ở chổ: Bạn nên nghe theo gợi í của những người 'Đi trước': Nhốt chung vô 1 file thôi!




Nên viết thành 1 sub có tham số để mình tùy ý chọn dữ liệu gốc (File dữ liệu gốc, sheet gốc, vùng gốc) cũng như copy đến sheet nào, vùng nào.
Như vậy sẽ tùy biến hơn bác ạ.

Thân!
 
Upvote 0
Mr Okebab đã viết:
Nên viết thành 1 sub có tham số để mình tùy ý chọn dữ liệu gốc (File dữ liệu gốc, sheet gốc, vùng gốc) cũng như copy đến sheet nào, vùng nào.
Như vậy sẽ tùy biến hơn bác ạ.

Thân!
Cám ơn bạn. Bạn SA_DQ giúp minh nhé. Mình đi làm cho cty nước ngoài, làm từ 8h sáng đến 9h tối mới về nhà -> muốn học cũng khó; công việc quản lý của mình thì ko dùng nhiều đến excel nhưng mình nhờ các bạn để công việc nhanh hơn. Trước kia mình cũng học lập trình Java và Html rồi, nên các bạn viết giúp mình macro mình đọc cũng hiểu đôi chút (các bạn thêm chú thích vào thì mình hiểu nhanh hơn).
Cảm ơn các bạn nhiều!
 
Upvote 0
Cám ơn bạn. Bạn SA_DQ giúp minh nhé. mình thì ko dùng nhiều đến excel nhưng mình nhờ các bạn để công việc nhanh hơn. Trước kia mình cũng học lập trình Java và Html rồi, nên các bạn viết giúp mình macro mình đọc cũng hiểu đôi chút (các bạn thêm chú thích vào thì mình hiểu nhanh hơn). Cảm ơn các bạn nhiều!
Bạn đã qua Java & Html thì siêu rồi còn gì! & bạn biết về CSDL chứ?
Vì lí do gì bạn chưa thể nhốt chung các file vô làm 1, thì bạn chưa trả lời!
Mình viết đoạn code trên chủ iếu không phải để giúp bạn, mà để bạn biết rằng việc viết thì viết được; nhưng không phải dùng như vậy là được;
Mà là. . . .(đã gợi í bạn rồi)
Để rõ hơn bạn đưa 2 files ví dụ lên xem nào!
Hai file đó bạn để ở thư mục như thế nào!(?) Để mọi người thấu hiểu bạn hơn!
Sung.jpg
 
Lần chỉnh sửa cuối:
Upvote 0
Web KT

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

Back
Top Bottom