Cần cả nhà hỗ trợ copy và chuyển toàn bộ code VBA từ từ file sang nhiều file khác

Liên hệ QC
Tôi tuân thủ nội quy khi đăng bài

stevenjoln5

Thành viên mới
Tham gia
21/3/12
Bài viết
6
Được thích
9
Chào cả nhà,
Em có 1 file excel chứa code và 5 file excel trắng không có code. Em muốn chuyển code của file chứa code vào các file trắng chưa có code.
Mong cả nhà giúp đỡ hỗ trợ em có cách nào chỉ cần chọn danh sách các file cần copy code vô thì VBA sẽ thực hiện việc copy chuyển code này không ạ.
 

File đính kèm

  • File trống chưa có code 5.xlsb
    7.6 KB · Đọc: 5
  • File trống chưa có code 4.xlsm
    8.1 KB · Đọc: 6
  • File trống chưa có code 1.xlsx
    8.1 KB · Đọc: 4
  • File trống chưa có code 2.xlsx
    8.1 KB · Đọc: 3
  • File trống chưa có code 3.xlsx
    8.1 KB · Đọc: 10
  • File chứa code VBA.xlsm
    13.1 KB · Đọc: 9
Chào cả nhà,
Em có 1 file excel chứa code và 5 file excel trắng không có code. Em muốn chuyển code của file chứa code vào các file trắng chưa có code.
Mong cả nhà giúp đỡ hỗ trợ em có cách nào chỉ cần chọn danh sách các file cần copy code vô thì VBA sẽ thực hiện việc copy chuyển code này không ạ.
1/ Tiêu đề dài quá.
2/ Copy thêm một file, xóa dữ liệu thành file trắng không xóa code rồi nhân bản theo số lượng mong muốn là xong thôi.
 
Upvote 0
1/ Tiêu đề dài quá.
2/ Copy thêm một file, xóa dữ liệu thành file trắng không xóa code rồi nhân bản theo số lượng mong muốn là xong thôi.
Dạ em đã cập nhật lại tiêu đề
Em muốn chuyển hàng loạt bằng VBA ạ chứ không phải thao tác bằng tay vì nhiều file sẽ có cấu trúc khác nhau nếu xóa và copy thì không ổn ạ
 
Upvote 0
Chào cả nhà,
Em có 1 file excel chứa code và 5 file excel trắng không có code. Em muốn chuyển code của file chứa code vào các file trắng chưa có code.
Mong cả nhà giúp đỡ hỗ trợ em có cách nào chỉ cần chọn danh sách các file cần copy code vô thì VBA sẽ thực hiện việc copy chuyển code này không ạ.
Theo mình biết thì copy module và form từ file này sang file khác thì phải thiết lập thư viện comp... ở Reference đó. Đứng từ file có macro để chạy code, chọn đến file chỉ định (đích).

'Thu tuc copy source code to other workbook
'needs a reference to : Visual basic for Application Extensibility 5.3 ,
'or run this code : ThisWorkbook.VBProject.References.AddFromFile "C:\Program Files (x86)\Common Files\Microsoft Shared\VBA\VBA6\VBE6EXT.OLB"
'from immediate window (ctrl+G) or create a small sub
 
Lần chỉnh sửa cuối:
Upvote 0
Loại bài này ở đây đã có ròi. Chịu khó tìm.

Tôi chỉ mách đến thế thôi. Đối với tôi, công việc tự động chuyển code vào file là chuyện của dân gieo vi rút. Tôi không muốn dây dưa.
 
Upvote 0
Theo mình biết thì copy module và form từ file này sang file khác thì phải thiết lập thư viện comp... ở Reference đó. Đứng từ file có macro để chạy code, chọn đến file chỉ định (đích).
Mã:
Public Sub CopyComponentsModules()  'copies code from sheets/Thisworkbook/Userforms/Modules/Classes  to a new workbook
    Dim src As CodeModule, dest As CodeModule
    Dim i&
    Dim Fname As Variant, sFileName As String
    Dim WB_Dest As Workbook
    Dim Comp As VBComponent
    
    'sFileName = Trim(Application.Range("txtLostFileName").Value)
    Fname = Application.GetOpenFilename(FileFilter:="Excel files (*.xlsm;*.xlsb), *.xlsm;*.xlsb", Title:="Chon file can copy code macro", MultiSelect:=False)
    If Fname = False Then
        MsgBoxUni UNC("Cha chän file cÇn copy macro!"), vbCritical + vbOKOnly, UNC("Chó ý")
        Exit Sub
    End If
    sFileName = Fname
    sFileName = CutLoR2(sFileName, "\", False)
    If Not Len(sFileName) > 0 Then
        MsgBoxUni UNC("Cha thÊy tªn file cÇn copy macro!"), vbCritical + vbOKOnly, UNC("Chó ý")
        Exit Sub
    End If
    If Not IsLegalFilename(sFileName) Then
        MsgBoxUni UNC("Tªn file cÇn copy macro kh«ng hîp lÖ!"), vbCritical + vbOKOnly, UNC("Chó ý")
        Exit Sub
    End If
    
    On Error Resume Next 'needed for testing if component already exists in destination WorkBook and for cross-references.
    If IsFileOpen(sFileName) Then
        Set WB_Dest = Application.Workbooks(sFileName)  '///////////<==Input workbook name here/////
    Else
        Set WB_Dest = Workbooks.Open(FileName:=sFileName, Password:=OPassword, ReadOnly:=False, UpdateLinks:=0)
        'Set WB_Dest = Workbooks.Open(FileName:=sFileName, ReadOnly:=False, UpdateLinks:=0)
        'ActiveWindow.Visible = False
    End If
    If WB_Dest Is Nothing Then '''Set WB_Dest = Application.Workbooks.Add
        MsgBoxUni UNC("Kh«ng t×m thÊy file cÇn copy macro ®ang ®îc më!"), vbCritical + vbOKOnly, UNC("Chó ý")
        Exit Sub
    End If
    
    'Copy userform
    CopyUserForm "DatePickerForm", WB_Dest
    CopyUserForm "frmGetDataOpt", WB_Dest
    CopyUserForm "frmListAcc", WB_Dest
    CopyUserForm "frmListObj", WB_Dest
    CopyUserForm "frmProgress", WB_Dest
    'Copy source code
    For Each Comp In ThisWorkbook.VBProject.VBComponents
        If Comp.Type <> vbext_ct_MSForm Then
                'i = i + 1
                'sh.Cells(i, 1).Value = Comp.Name
    
                'Set Source code module
                Set src = Comp.CodeModule  'ThisWorkbook.VBProject.VBComponents("Sheet1").CodeModule
    
                'test if destination component exists first
                i = 0: i = Len(WB_Dest.VBProject.VBComponents(Comp.Name).Name)
                If i <> 0 Then 'or: if err=0 then
                    Set dest = WB_Dest.VBProject.VBComponents(Comp.Name).CodeModule
                Else 'create component
                    With WB_Dest.VBProject.VBComponents.Add(Comp.Type)
                        .Name = Comp.Name
                        Set dest = .CodeModule
                    End With
                End If
    
                'copy module/Form/Sheet/Class 's code:
                dest.DeleteLines 1, dest.CountOfLines
                dest.AddFromString src.Lines(1, src.CountOfLines)
        End If
    Next Comp
    
    'Add references as well :
    Dim Ref As Reference
    For Each Ref In ThisWorkbook.VBProject.References
        'Debug.Print Ref.Name 'Nom
        WB_Dest.VBProject.References.AddFromFile Ref.FullPath
        'Debug.Print Ref.FullPath 'Chemin complet
        'Debug.Print Ref.Description 'Description de la référence
        'Debug.Print Ref.IsBroken 'Indique si la référence est manquante
        'Debug.Print Ref.Major & "." & Ref.Minor 'Version
        'Debug.Print "---"
    Next Ref
    
    Err.Clear: On Error GoTo 0
    
    WB_Dest.Activate
    MsgBox "Copy macro completed! Please save the lost-macro file!", vbOKOnly, "Note"
    
    Set Ref = Nothing
    Set src = Nothing
    Set dest = Nothing
    Set Comp = Nothing
    Set WB_Dest = Nothing
End Sub

Đây là code mình copy từ người khác, có mấy hàm và sub con khác sử dụng trong đây, nhưng bạn vẫn có thể tham khảo được
 
Upvote 0
Nếu 5 file thì làm thủ công export import thì đã xong từ đời nào.
 
Upvote 0
Chào cả nhà,
Em có 1 file excel chứa code và 5 file excel trắng không có code. Em muốn chuyển code của file chứa code vào các file trắng chưa có code.
Mong cả nhà giúp đỡ hỗ trợ em có cách nào chỉ cần chọn danh sách các file cần copy code vô thì VBA sẽ thực hiện việc copy chuyển code này không ạ.
Copy code giống nhau cho nhiều file là hạ sách, cần chạy 1 code VBA trên các file khác nhau có thể dùng công cụ Add in, hoặc chỉ cần mở file có code và cần chạy file nào thì gọi file đó để xử lý, nếu không được mới tính kế cuối cùng là copy code
 
Upvote 0
Nếu thế thì nên biến file xlsm thành template trắng
rồi dùng VBA độc lập nhân file đó ra thôi, là xong
(chắc bạn biết viết code rồi, việc này không khó)

Còn đi con đường trực tiếp thì tìm hiểu về VBproject component ... sẽ giúp ích
 
Upvote 0
Chào cả nhà,
Em có 1 file excel chứa code và 5 file excel trắng không có code. Em muốn chuyển code của file chứa code vào các file trắng chưa có code.
Mong cả nhà giúp đỡ hỗ trợ em có cách nào chỉ cần chọn danh sách các file cần copy code vô thì VBA sẽ thực hiện việc copy chuyển code này không ạ.
Để tí rảnh tôi thử làm xem.
 
Upvote 0
Tôi nghĩ bài này cái chính là bàn bạc cái giải pháp của chủ thớt có hợp lý, có giải pháp nào khác tốt hơn chứ không phải là code cho được cái giải pháp mà chủ thớt đưa ra.
 
Upvote 0
Tôi nghĩ bài này cái chính là bàn bạc cái giải pháp của chủ thớt có hợp lý, có giải pháp nào khác tốt hơn chứ không phải là code cho được cái giải pháp mà chủ thớt đưa ra.
Các bác cứ bàn giải pháp, còn tôi thử code để học.
 
Upvote 0
Thực ra tôi chưa trải nghiệm nhiều với Excel nên chưa nghĩ ra được nó để làm gì? Úng dụng vô cái gì?
Tôi đã từng làm 1 lần: Từ file kế toán có menu xuất ra file sổ sách, tôi insert code luôn vào file đó cho việc in hàng loạt để khi mở file sổ sách ra bấm chạy thôi. Chừ thì yêu cầu khác 1 chút là copy code nên tiện thể thử xem phải code thế nào.

@stevenjoln5 (sao lại đổi ra cái tên gì gì thế này): Code không lưu file, với chủ ý là có một số file có dạng .xlsx không chứa được macro nên để bạn ưng lưu lại với tên gì đó thì tự lưu.

Đọc hướng dẫn sử dụng trước khi chạy code!
 

File đính kèm

  • CopyCodeVBAToAnotherFile_stevenjoln5.xlsm
    20.2 KB · Đọc: 10
Upvote 0
Thực ra tôi chưa trải nghiệm nhiều với Excel nên chưa nghĩ ra được nó để làm gì? Úng dụng vô cái gì?
Nó có ứng dụng chứ không hẳn là vô ích.
Nhưng quan niệm của tôi là cái lợi luôn luôn phải so với cái hại.
Gieo code đại trà cũng như đem thuốc kháng sinh phát cho mỗi nhà vậy. Chính bản thân việc phát thuốc không phải là xấu. Người phát thuốc có bảo đảm được người nhận biết cách dùng hay không mới là chỗ chính.
 
Upvote 0
Cái này theo tui thì nên sử dụng file chứa code và lưu nó thành Add-Ins và sử dụng chung cho tất cả các file. Còn lười nửa thì dùng tạm cái này, Copy code được Module, UserForm và Class Module, còn code trong Sheet và ThisWorkbook thì chưa làm được.
Muốn chạy được thì trước hết mở Excel lên vào File và chon Options, các bước còn lại xem hình.
H1.png

Xong thoát Excel và mở ứng dụng lên và tiếp tục xem hình.
H2.png
Chọn các mục cần thiết và nháy nút Chèn Code, đợi khi nhận được thông báo và mở thư mục chứa file lưu xem kết quả.
 

File đính kèm

  • Luoi oi la luoi.zip
    4.1 MB · Đọc: 13
Upvote 0
Copy code được Module, UserForm và Class Module, còn code trong Sheet và ThisWorkbook thì chưa làm được.
Code này chép được hết các loại module. Nhưng khi Workbook nguồn có nhiều sheet hơn Workbook đích thì tôi chưa biết cách chép code mà tạm thời chép nguyên sheet qua (code trong sheet sẽ đi theo sheet).
Rich (BB code):
Sub CopyCodeVBA_All()
    Dim wbNguon As Workbook, wbDich As Workbook, iLine&, iCount&, sPath, FullName
    Dim Dcomp As VBIDE.VBComponent, Ncomp As VBIDE.VBComponent
    Dim codeMod_Nguon As CodeModule, codeMod_Dich As CodeModule
    Dim ShN As Worksheet, ShD As Worksheet, chk As Boolean
    
    Set wbNguon = ThisWorkbook
    Application.ScreenUpdating = False
    sPath = Application.GetOpenFilename(Title:="CHON FILE", _
    FileFilter:="Excel Files *.xls* (*.xls*),", MultiSelect:=True)
    On Error Resume Next
    If sPath = False Then
        If Err.Number <> 0 Then GoTo Arr
        MsgBox "Không có file nào.", vbExclamation, "Sorry!"
        Exit Sub
    Else
Arr:
        For Each FullName In sPath
            Set wbDich = Workbooks.Open(FullName)
            For Each Ncomp In wbNguon.VBProject.VBComponents
                For Each Dcomp In wbDich.VBProject.VBComponents
                    iCount = iCount + 1
                    If Ncomp.Name = Dcomp.Name Then
                        Set codeMod_Nguon = wbNguon.VBProject.VBComponents(Ncomp.Name).CodeModule
                        Set codeMod_Dich = wbDich.VBProject.VBComponents(Dcomp.Name).CodeModule
                        iLine = codeMod_Nguon.CountOfLines
                        codeMod_Dich.InsertLines iLine, codeMod_Nguon.Lines(1, iLine)
                        Exit For
                    End If
                Next
                If iCount = wbDich.VBProject.VBComponents.Count Then
                    If Ncomp.Name = "Module2" Then GoTo Next_
                    Dim Comp As VBIDE.VBComponent
                    If Ncomp.Type = vbext_ct_Document Then
                        For Each ShN In wbNguon.Worksheets
                            For Each ShD In wbDich.Worksheets
                                If ShN.CodeName = ShD.CodeName Then chk = True: Exit For
                            Next
                            If chk = False Then
                                wbNguon.Sheets(ShN.Name).Copy After:=wbDich.Sheets(wbDich.Sheets.Count)
                            End If
                            chk = False
                        Next
                        
                    Else
                        Set Comp = wbDich.VBProject.VBComponents.Add(Ncomp.Type)
                        Set codeMod_Dich = Comp.CodeModule
                        Set codeMod_Nguon = wbNguon.VBProject.VBComponents(Ncomp.Name).CodeModule
                        iLine = codeMod_Nguon.CountOfLines
                        codeMod_Dich.InsertLines iLine, codeMod_Nguon.Lines(1, iLine)
                    End If
                    
                End If
Next_:          iCount = 0
            Next
        Next
    End If
    Application.ScreenUpdating = True
    Set wbNguon = Nothing: Set wbDich = Nothing
    Set Dcomp = Nothing: Set Ncomp = Nothing: Set Comp = Nothing
    Set codeMod_Nguon = Nothing: Set codeMod_Dich = Nothing
End Sub
 
Upvote 0
Thực ra tôi chưa trải nghiệm nhiều với Excel nên chưa nghĩ ra được nó để làm gì? Úng dụng vô cái gì?
Ví dụ điển hình của ứng dụng chính:
- Người ta có thể đưa ra một mớ files có macro cho nhiều người dùng. Sau đó cập nhật lại phiên bản mới của macro. Đợi đêm về không ai làm việc, lôi đám files ấy ra, móc bỏ phiên bản cũ, nhét vào phiên bản mới. Một quy trình hữu hiệu.
Tuy nhiên quy trình này rất nguy hiểm, đòi hỏi người nhét code này phải có trình độ quản lý code cao. Một trong những lỗi mà tay mơ hay gặp phải là "Đóng Mộc Phiên Bản". Tức là làm sao người dùng hiểu được là "code hôm qua bạn chạy là phiên bản x, hôm nay sẽ là phiên bản x1".
Và nếu người gieo code có lương tâm thì sẽ có thêm mấy giòng giải thích những điểm cải tiến.

Ở mấy bài trước tôi có gợi ý thử mà chả ai trong thớt này hiểu.
Công việc này phần nhỏ là viết code, phần chủ yếu là quản lý code.
Trên GPE này, số người viết code giỏi hơn tôi có rất nhiều. Nhưng quản lý thì không có mấy ai đâu.
 
Upvote 0
- Người ta có thể đưa ra một mớ files có macro cho nhiều người dùng. Sau đó cập nhật lại phiên bản mới của macro. Đợi đêm về không ai làm việc, lôi đám files ấy ra, móc bỏ phiên bản cũ, nhét vào phiên bản mới. Một quy trình hữu hiệu.
À anh đưa thêm một ví dụ này thì mới hiểu đây cũng là một kỹ thuật dùng để cập nhật ứng dụng có macro (.xlsm). Cách này thì phải copy từng module code.
Trước đây em cũng có viết code để tự động cập nhật ứng dụng Excel nhưng mà là cập nhật Add-in Excel (.xlam) chứ không phải dạng file xlsm/xlsb. Cập nhật Add-in thì nó dễ hơn xlsm/xlsb vì nó không có dữ liệu đi kèm, chỉ cần kết nối internet - kiểm tra phiên bản - download - ghi đè là xong. Còn cập nhật ứng dụng bằng cách copy Macro này có vẻ phức tạp, cần nhiều bước (code) để xử lý hơn nhiều.

Screen Shot 2023-08-15 at 00.57.32.png Screen Shot 2023-08-15 at 01.15.51.png
 
Upvote 0
Web KT

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

Back
Top Bottom