Để dạng Macro thì chạy tốt, nhưng khi tạo thành adin thì báo lỗi không chạy

Liên hệ QC

haint

Thành viên mới
Tham gia
12/8/06
Bài viết
10
Được thích
2
Chào các thành viên giải pháp excel, tôi mới tập tành sử dụng VBA, chưa rành nên có 1 vấn đề cần được giúp đỡ. Để sử dụng cho công việc, tôi áp dụng macro " nối nhiều file thành 1 file", và thấy chạy tốt. Để cho tiện, tôi tạo thành adin đưa lên ribbon. Nhưng khi chạy thì báo lỗi như sau: Method 'Move' of object 'Sheets' failed. Tôi không biết lý do tại sao, rất mong mọi người giúp đỡ
 
Chào các thành viên giải pháp excel, tôi mới tập tành sử dụng VBA, chưa rành nên có 1 vấn đề cần được giúp đỡ. Để sử dụng cho công việc, tôi áp dụng macro " nối nhiều file thành 1 file", và thấy chạy tốt. Để cho tiện, tôi tạo thành adin đưa lên ribbon. Nhưng khi chạy thì báo lỗi như sau: Method 'Move' of object 'Sheets' failed. Tôi không biết lý do tại sao, rất mong mọi người giúp đỡ
addin của bạn đâu ?
 
Chào vanaccex, mình gửi adin kèm theo. mình tạo macro này theo như hướng dẫn thì chạy được, nhưng khi chuyển thành adin đưa lên ribbon thì báo lỗi. Bạn xem giúp mình nhé
Bài đã được tự động gộp:

Và có vấn đề này nhờ vanaccex giúp đỡ, do mình không rành VBA. Vấn đề thế này, mình nhận file "cham.xls" từ 1 người khác chuyển sang, mình phải xử lý lại dữ liệu trong file "cham.xls" như công thức trong file. Sau đó mình phải dùng hàm vlookup chuyển dữ liệu sang file "Bangdiem_260819.xlsx". Mình muốn tạo 1 đoạn code để trên file "Bangdiem.xlsx" khi chạy nó điều chỉnh dữ liệu trên file cham.xls và vlookup sang file "Bangdiem.xlsx". Nhờ vanaccex giúp mình nhé. Cám ơn bạn
 

File đính kèm

  • CombineWorkbooks.xlam
    11.6 KB · Đọc: 6
  • Bang diem_260819.xlsx
    11.6 KB · Đọc: 5
  • cham.xls
    28.5 KB · Đọc: 5
Lần chỉnh sửa cuối:
Chào vanaccex, mình gửi adin kèm theo. mình tạo macro này theo như hướng dẫn thì chạy được, nhưng khi chuyển thành adin đưa lên ribbon thì báo lỗi. Bạn xem giúp mình nhé
Bài đã được tự động gộp:

Và có vấn đề này nhờ vanaccex giúp đỡ, do mình không rành VBA. Vấn đề thế này, mình nhận file "cham.xls" từ 1 người khác chuyển sang, mình phải xử lý lại dữ liệu trong file "cham.xls" như công thức trong file. Sau đó mình phải dùng hàm vlookup chuyển dữ liệu sang file "Bangdiem_260819.xlsx". Mình muốn tạo 1 đoạn code để trên file "Bangdiem.xlsx" khi chạy nó điều chỉnh dữ liệu trên file cham.xls và vlookup sang file "Bangdiem.xlsx". Nhờ vanaccex giúp mình nhé. Cám ơn bạn
Đây bạn thử code này xem sao
Mã:
Sub CombineWorkbooks()
    Dim FilesToOpen
    Dim x As Integer
    On Error GoTo ErrHandler
    Application.ScreenUpdating = False
    FilesToOpen = Application.GetOpenFilename _
      (FileFilter:="Microsoft Excel Files (*.xlx), *.xlsx", MultiSelect:=True, Title:="Files to Merge")
    
    If TypeName(FilesToOpen) = "Boolean" Then
        MsgBox "No Files were selected"
        GoTo ExitHandler
    End If
       Dim TargetBook, WB As Workbook
       Dim Ws As Worksheet
        Set TargetBook = ActiveWorkbook
       x = 1
        While x <= UBound(FilesToOpen)
            Set WB = Workbooks.Open(Filename:=FilesToOpen(x), UpdateLinks:=False)
            For Each Ws In Workbooks(WB.Name).Sheets
                Ws.Copy after:=TargetBook.Sheets(ThisWorkbook.Sheets.Count)
            Next
            WB.Close savechanges:=False
            x = x + 1
        Wend
ExitHandler:
    Application.ScreenUpdating = True
    Exit Sub
ErrHandler:
    MsgBox Err.Description
    Resume ExitHandler
End Sub
 
Chào vanaccex , khi mở hộp tìm file to merge, thì không nhìn thấy file, mặc dù trong thư mục đó có file.
1569487768608.png
 
Chào vanaccex , khi mở hộp tìm file to merge, thì không nhìn thấy file, mặc dù trong thư mục đó có file.
View attachment 225707
Cái chổ Microsoft Excel Files (*.xlsx) bạn chọn lại kiểu file khác (Kiểu file thực tế của bạn).
Chào vanaccex , khi mở hộp tìm file to merge, thì không nhìn thấy file, mặc dù trong thư mục đó có file.
View attachment 225707
Bạn sửa chổ
Mã:
FilesToOpen = Application.GetOpenFilename _
      (FileFilter:="Microsoft Excel Files (*.xlx), *.xlsx", MultiSelect:=True, Title:="Files to Merge")
thành
Mã:
FilesToOpen = Application.GetOpenFilename _
      (FileFilter:="Microsoft Excel Files (*.xlsx), *.xlsx", MultiSelect:=True, Title:="Files to Merge")
 
Chào vanaccex , khi đưa code vào modul và run thì chạy tốt, nhưng khi save as thành adin và chạy trên rubbon thì treo excel và báo như sau:

1569489706258.png
 

File đính kèm

  • CombineWorkbooks.xlam
    14.6 KB · Đọc: 12
Bạn sửa chỗ anh @giaiphap có note lại đó. Trước khi chạy code bạn phải mở Mới 1 File mới , rồi hãy chạy code nhé !
Em muốn chạy code mà không muốn tạo file mới có được hay không? Có thể chạy code ở tình huống bất kỳ có mở file mới hay không mở đều được. Vậy code sửa lại thế nào ạ?
 
Đây bạn thử code này xem sao
Mã:
Sub CombineWorkbooks()
    Dim FilesToOpen
    Dim x As Integer
    On Error GoTo ErrHandler
    Application.ScreenUpdating = False
    FilesToOpen = Application.GetOpenFilename _
      (FileFilter:="Microsoft Excel Files (*.xlx), *.xlsx", MultiSelect:=True, Title:="Files to Merge")
   
    If TypeName(FilesToOpen) = "Boolean" Then
        MsgBox "No Files were selected"
        GoTo ExitHandler
    End If
       Dim TargetBook, WB As Workbook
       Dim Ws As Worksheet
        Set TargetBook = ActiveWorkbook
       x = 1
        While x <= UBound(FilesToOpen)
            Set WB = Workbooks.Open(Filename:=FilesToOpen(x), UpdateLinks:=False)
            For Each Ws In Workbooks(WB.Name).Sheets
                Ws.Copy after:=TargetBook.Sheets(ThisWorkbook.Sheets.Count)
            Next
            WB.Close savechanges:=False
            x = x + 1
        Wend
ExitHandler:
    Application.ScreenUpdating = True
    Exit Sub
ErrHandler:
    MsgBox Err.Description
    Resume ExitHandler
End Sub

Code của bạn sai ở đoạn này này:

Ws.Copy after:=TargetBook.Sheets(ThisWorkbook.Sheets.Count)
ThisWorkbook chính là cái Add-ins đấy

=> Ws.Copy after:=TargetBook.Sheets(TargetBook .Sheets.Count)
------------------------------------------------------
và thường thì người ta để toàn file Excel chung nên không cần phân biệt xlsx hay gì gì chi cho mệt:
FilesToOpen = Application.GetOpenFilename _
(FileFilter:="All Files (*.*), *.*", MultiSelect:=True, Title:="Select Files")
------------------------------------------------------
và bị dư ở chổ này này:
For Each Ws In Workbooks(WB.Name).Sheets
=> For Each Ws In WB.Worksheets
------------------------------------------------------
và khai báo sẽ dể bị hiểu nhầm ở chổ này này:
Dim TargetBook, WB As Workbook

=> Dim TargetBook As Workbook, WB As Workbook
Hoặc Dim TargetBook, WB
Hoặc Dim TargetBook As Object, WB As Object
 
Code của bạn sai ở đoạn này này:

Ws.Copy after:=TargetBook.Sheets(ThisWorkbook.Sheets.Count)
ThisWorkbook chính là cái Add-ins đấy

=> Ws.Copy after:=TargetBook.Sheets(TargetBook .Sheets.Count)
------------------------------------------------------
và thường thì người ta để toàn file Excel chung nên không cần phân biệt xlsx hay gì gì chi cho mệt:
FilesToOpen = Application.GetOpenFilename _
(FileFilter:="All Files (*.*), *.*", MultiSelect:=True, Title:="Select Files")
------------------------------------------------------
và bị dư ở chổ này này:
For Each Ws In Workbooks(WB.Name).Sheets
=> For Each Ws In WB.Worksheets
------------------------------------------------------
và khai báo sẽ dể bị hiểu nhầm ở chổ này này:
Dim TargetBook, WB As Workbook

=> Dim TargetBook As Workbook, WB As Workbook
Hoặc Dim TargetBook, WB
Hoặc Dim TargetBook As Object, WB As Object
Em Vân cảm ơn các góp ý của anh @giaiphap và anh @HeSanbi về vấn đề em Vân sửa code của bạn @haint
 
Đây bạn thử code này xem sao
Mã:
Sub CombineWorkbooks()
    Dim FilesToOpen
    Dim x As Integer
    On Error GoTo ErrHandler
    Application.ScreenUpdating = False
    FilesToOpen = Application.GetOpenFilename _
      (FileFilter:="Microsoft Excel Files (*.xlx), *.xlsx", MultiSelect:=True, Title:="Files to Merge")
   
    If TypeName(FilesToOpen) = "Boolean" Then
        MsgBox "No Files were selected"
        GoTo ExitHandler
    End If
       Dim TargetBook, WB As Workbook
       Dim Ws As Worksheet
        Set TargetBook = ActiveWorkbook
       x = 1
        While x <= UBound(FilesToOpen)
            Set WB = Workbooks.Open(Filename:=FilesToOpen(x), UpdateLinks:=False)
            For Each Ws In Workbooks(WB.Name).Sheets
                Ws.Copy after:=TargetBook.Sheets(ThisWorkbook.Sheets.Count)
            Next
            WB.Close savechanges:=False
            x = x + 1
        Wend
ExitHandler:
    Application.ScreenUpdating = True
    Exit Sub
ErrHandler:
    MsgBox Err.Description
    Resume ExitHandler
End Sub
Nên dùng For x = 1 to UBound (hoặc For Each) thay cho While.
Sao không copy tất cả các sheet một lần mà copy từng sheet? Copy lần lượt từng sheet sẽ làm hỏng các công thức có tham chiếu đến sheet khác.
 
Nên dùng For x = 1 to UBound (hoặc For Each) thay cho While.
Sao không copy tất cả các sheet một lần mà copy từng sheet? Copy lần lượt từng sheet sẽ làm hỏng các công thức có tham chiếu đến sheet khác.
Dạ Vâng ạ ! Em Vân sửa theo code bạn @hanit luôn ạ nên không em xem xét kĩ chỗ này ạ !

Em Vân cảm ơn anh @huuthang_bd nhiều ạ
 
Web KT
Back
Top Bottom