Xuất nhiều sheet thành file excel (2 người xem)

  • Thread starter Thread starter huy vu
  • Ngày gửi Ngày gửi

Người dùng đang xem chủ đề này

huy vu

Thành viên hoạt động
Tham gia
29/2/12
Bài viết
164
Được thích
1
E chào ace trong diễn đàn, anh/chi có thể hươnhs dẫn viết 1 đoạn code, như sau:
- Em có 1 file excel gồm khá nhiều sheet
- E muốn chọn 1 số sheet nhất định (sheet2, sheet3 chẳng hạn)
- Sau đó xuất 2 sheet này sang 1 file excel mới, giữ nguyên hàm số (nếu có)
- Có thể cùng một lúc xuất ra nhiều file excel ở những folder khác nhau ko ạh
E xin cảm ơn và mong trợ giúp!
 
1. Xuất 2 sheets ra file mới code như sau: Sheets(Array("Sheet2", "Sheet3")).Copy
2. Có thể xuất ra nhiều file cho những folder khác nhau
 
Upvote 0
1. Xuất 2 sheets ra file mới code như sau: Sheets(Array("Sheet2", "Sheet3")).Copy
2. Có thể xuất ra nhiều file cho những folder khác nhau
Máy tính ở cq có phân các thư mục cá nhân. Sau khi làm báo cáo xong e muốn export cái là các folder này đều có file báo cáo.. đấy là mục đích của đoạn cốt ạh
 
Upvote 0
Cảm ơn anh
A gợi ý đoạn cốt cho e với ạ. -\\/.
Cơ bản là thế này, thử từng số 18, 50 ,51,52 để biết nó là cái gì
Giả định thư mục BAOCAO đang có tại ổ D, file mới tạo ra có tên là Test
PHP:
Sub CreateNewFile()
Dim path As String, NewFileName As String
path = "D:\BAOCAO\"
NewFileName = "Test"
    Sheets(Array("Sheet1", "Sheet2")).Copy
    With ActiveWorkbook
        .SaveAs path & NewFileName, 18 '50,51,52
        .Close
    End With
End Sub
 
Upvote 0
Cơ bản là thế này, thử từng số 18, 50 ,51,52 để biết nó là cái gì
Giả định thư mục BAOCAO đang có tại ổ D, file mới tạo ra có tên là Test
PHP:
Sub CreateNewFile()
Dim path As String, NewFileName As String
path = "D:\BAOCAO\"
NewFileName = "Test"
    Sheets(Array("Sheet1", "Sheet2")).Copy
    With ActiveWorkbook
        .SaveAs path & NewFileName, 18 '50,51,52
        .Close
    End With
End Sub
E vừa test thử
Đã tạo folder BaoCao ở ổ D
Chay code thì báo lỗi Run time error '9' Subcript out of range
Bôi vàng dòng Code: Sheets(Array("Sheet1", "Sheet2")).Copy
 
Upvote 0
E vừa test thử
Đã tạo folder BaoCao ở ổ D
Chay code thì báo lỗi Run time error '9' Subcript out of range
Bôi vàng dòng Code: Sheets(Array("Sheet1", "Sheet2")).Copy
Bạn kiểm tra lại nhé! Tôi Test thử thấy code hoạt động rất OK.

To anh
quanghai1969: Chắc khi nào rảnh phải nhờ anh dạy vụ này thôi. Mong anh giúp đỡ! Rất ngưỡng mộ anh!
 
Upvote 0
Upvote 0
E vừa test thử
Đã tạo folder BaoCao ở ổ D
Chay code thì báo lỗi Run time error '9' Subcript out of range
Bôi vàng dòng Code: Sheets(Array("Sheet1", "Sheet2")).Copy
Biết trước bạn sẽ lọt ngay vào bẫy này mà. Viết vầy bạn sẽ hình dung và hiểu thêm tẹo. Cố mà tự suy diễn nha. Thử đủ kiểu sẽ ngộ ra nhiều điều.
Sheets(Array("BaoCao", "NhapHang")).Copy
 
Upvote 0
Cơ bản là thế này, thử từng số 18, 50 ,51,52 để biết nó là cái gì
Giả định thư mục BAOCAO đang có tại ổ D, file mới tạo ra có tên là Test
PHP:
Sub CreateNewFile()
Dim path As String, NewFileName As String
path = "D:\BAOCAO\"
NewFileName = "Test"
    Sheets(Array("Sheet1", "Sheet2")).Copy
    With ActiveWorkbook
        .SaveAs path & NewFileName, 18 '50,51,52
        .Close
    End With
End Sub
Các con số có ý nghĩa như sau:
Mã:
Sub XuatExcel()
    Application.DisplayAlerts = False
    Dim Path As String, NewFileName As String
    Path = "E:\BAOCAO\"
    NewFileName = "Test"
    Sheets(Array("Report", "DNTN")).Copy
    With ActiveWorkbook
        .SaveAs Path & NewFileName, [COLOR=#ff0000][B]50[/B][/COLOR]
                ' ________ Lua chon tham so ______________
                ' 18 xuat ra XLS 97 - 2003
                ' 50 xuat ra XLSB
                ' 51 xuat ra XLSX
                ' 52 xuat ra XLSM
        .Close
    End With
    Application.DisplayAlerts = True
End Sub

Chơi số 50 là gọn nhẹ nhất, đuôi XLSB file nhẹ đi tận 10 lần
Cảm ơn anh QuangHai !!!
 
Upvote 0
Chỉ có điều e chưa làm được ý cuối cùng, xuất ra nhiều folder khác nhau cùng lúc
E đang làm thành nhiều Sub và gọi vào sub TongHop

Sao phải khổ thế

suy nghĩ chút là làm được ngay mà, theo kiểu này



Mã:
[I][COLOR=#008000]'' lập 2 mảng, mảng 1 chứa tên các sheets[/COLOR][/I]
ArrTenSheets= Array(    Array("Report1", "DNTN1"), Array("Report2", "DNTN2"),Array("Report3", "DNTN3") )
ArrTenFolders=Array(     "C:\BaoCao\Ketqua1",       "C:\BaoCao\Ketqua2",       "C:\BaoCao\Ketqua3" )

[COLOR=#008000][I]''rồi dùng FOR truy cập lặp là xong[/I][/COLOR]


For i=1 to ubound(ArrrTenFolders)
      [I][COLOR=#008000] ''xu ly cho arrTenSheets(i), và ArrrTenFolders(i) GIONG NHU SUB bạn đã làm -- hoặc gọi SUB truyền tham số luôn là OK[/COLOR][/I]

next i


bạn Biết VBA nên tự làm tốt nhé
 
Upvote 0
Sao phải khổ thế

suy nghĩ chút là làm được ngay mà, theo kiểu này



Mã:
[I][COLOR=#008000]'' lập 2 mảng, mảng 1 chứa tên các sheets[/COLOR][/I]
ArrTenSheets= Array(    Array("Report1", "DNTN1"), Array("Report2", "DNTN2"),Array("Report3", "DNTN3") )
ArrTenFolders=Array(     "C:\BaoCao\Ketqua1",       "C:\BaoCao\Ketqua2",       "C:\BaoCao\Ketqua3" )

[COLOR=#008000][I]''rồi dùng FOR truy cập lặp là xong[/I][/COLOR]


For i=1 to ubound(ArrrTenFolders)
      [I][COLOR=#008000] ''xu ly cho arrTenSheets(i), và ArrrTenFolders(i) GIONG NHU SUB bạn đã làm -- hoặc gọi SUB truyền tham số luôn là OK[/COLOR][/I]

next i


bạn Biết VBA nên tự làm tốt nhé
Cảm ơn bạn nhiều. Tôi cũng suy nghĩ đến vòng lập để nó lập đi lập lại vài vòng tùy vào số folder muốn copy đến.
 
Upvote 0
Thử chạy code này
Giả sử bạn lưu các đường dẫn cần copy tới từ ô A1 đến ô A5 của sheet1:
[GPECODE=vb]
Sub XuatExcelTest()
Application.DisplayAlerts = False
Dim Path, i As Long
Dim Name As String
Name = "TEST"
With Sheet1
Path = .Range("A1:A5").Value
End With
Sheets(Array("Report", "DNTN")).Copy
With ActiveWorkbook
For i = 1 To UBound(Path)
.SaveAs Path(i, 1) & Name, 50
' 50 xuat ra XLSB
' 18 xuat ra XLS 97 - 2003
' 51 xuat ra XLSX
' 52 xuat ra XLSM
Next
.Close
End With
Application.DisplayAlerts = True
End Sub
[/GPECODE]
 
Lần chỉnh sửa cuối:
Upvote 0
Code anh Cá Ngừ F1 chạy rồi ạ...cảm ơn anh.
Bạn vuivui85 có code khác chia sẻ không ạ.

Chào bạn!
Trước đây tôi có xây dựng 1 ứng dụng tương đối hoàn chỉnh liên quan đến việc Save sheet thành file tại đây:
http://www.giaiphapexcel.com/forum/showthread.php?84992-Code-save-as-sheet-hiện-hành/page2
Ứng dụng cho phép:
- Save 1 sheet hoặc nhiều sheet
- Chọn đường dẫn lưu file tùy ý
- Chọn save file theo nhiều định dạng khác nhau (kể cả thành PDF)
- Mọi thao tác được thực hiện trên Toolbar
--------------------------
Bạn xem thử có xài được không
 
Upvote 0
Chào bạn!
Trước đây tôi có xây dựng 1 ứng dụng tương đối hoàn chỉnh liên quan đến việc Save sheet thành file tại đây:
http://www.giaiphapexcel.com/forum/showthread.php?84992-Code-save-as-sheet-hiện-hành/page2
Ứng dụng cho phép:
- Save 1 sheet hoặc nhiều sheet
- Chọn đường dẫn lưu file tùy ý
- Chọn save file theo nhiều định dạng khác nhau (kể cả thành PDF)
- Mọi thao tác được thực hiện trên Toolbar
--------------------------
Bạn xem thử có xài được không
Em cảm ơn. e sẽ nghiên cứu ạ
 
Upvote 0
Cơ bản là thế này, thử từng số 18, 50 ,51,52 để biết nó là cái gì
Giả định thư mục BAOCAO đang có tại ổ D, file mới tạo ra có tên là Test
PHP:
Sub CreateNewFile()
Dim path As String, NewFileName As String
path = "D:\BAOCAO\"
NewFileName = "Test"
    Sheets(Array("Sheet1", "Sheet2")).Copy
    With ActiveWorkbook
        .SaveAs path & NewFileName, 18 '50,51,52
        .Close
    End With
End Sub
Cảm ơn code của anh QuangHai.
Cho em hỏi thêm những sheet em xuất ra nó có kèm theo vài cái shape em muốn nó xoá đi luôn thì phải thêm code như thế nào?
Mong được anh và mọi người giúp đỡ!
 
Upvote 0
Cảm ơn code của anh QuangHai.
Cho em hỏi thêm những sheet em xuất ra nó có kèm theo vài cái shape em muốn nó xoá đi luôn thì phải thêm code như thế nào?
Mong được anh và mọi người giúp đỡ!

Bật cái ghi macro (record macro) lên rồi thao tác xoá, dừng ghi macro. Vào xem coi nó ghi như thế nào nhé.
 
Upvote 0
Cảm ơn code của anh QuangHai.
Cho em hỏi thêm những sheet em xuất ra nó có kèm theo vài cái shape em muốn nó xoá đi luôn thì phải thêm code như thế nào?
Mong được anh và mọi người giúp đỡ!

PHP:
Sub CreateNewFile()
Dim path As String, NewFileName As String
path = "D:\BAOCAO\"
NewFileName = "Test"
Application.CopyObjectsWithCells = False
    Sheets(Array("Sheet1", "Sheet2")).Copy
    With ActiveWorkbook
        .SaveAs path & NewFileName, 18 '50,51,52
        .Close
    End With
Application.CopyObjectsWithCells = True
End Sub
Với code này mà kêu record macro thì chắc không khả thi rồi.
 
Upvote 0
PHP:
Sub CreateNewFile()
Dim path As String, NewFileName As String
path = "D:\BAOCAO\"
NewFileName = "Test"
Application.CopyObjectsWithCells = False
    Sheets(Array("Sheet1", "Sheet2")).Copy
    With ActiveWorkbook
        .SaveAs path & NewFileName, 18 '50,51,52
        .Close
    End With
Application.CopyObjectsWithCells = True
End Sub
Với code này mà kêu record macro thì chắc không khả thi rồi.
Cảm ơn anh rất nhiều!
Làm phiền anh và các bạn giúp thêm 1 tí nữa: Em muốn đưa 1 vài module đi kèm với file vừa xuất ra thì phải thêm code như thế nào?
Mong được anh và mọi người giúp đỡ!
 
Upvote 0
Cảm ơn anh rất nhiều!
Làm phiền anh và các bạn giúp thêm 1 tí nữa: Em muốn đưa 1 vài module đi kèm với file vừa xuất ra thì phải thêm code như thế nào?
Mong được anh và mọi người giúp đỡ!

Muốn có cả module khả năng phải export tứng module ra file *.bas.roi import ngược lại. Không biết quá trình này có tự động đc ko?
 
Upvote 0
Muốn có cả module khả năng phải export tứng module ra file *.bas.roi import ngược lại. Không biết quá trình này có tự động đc ko?
Chẳng có gì là không thể.
Muốn xuất module ra thì
PHP:
Application.VBE.ActiveVBProject.VBComponents("Module1").Export "AddModule.bas"
Muốn lấy vào thì
PHP:
Application.VBE.ActiveVBProject.VBComponents.Import "AddModule.bas"
 
Upvote 0
Em thêm code vào để export ra nhưng nó báo lỗi ngay dòng code export luôn anh Quang Hải.
 
Upvote 0
Em thêm code vào để export ra nhưng nó báo lỗi ngay dòng code export luôn anh Quang Hải.
Bạn phải vào Macro Security, tìm mục macro setting rồi check trong mục Trust Access to The VBA Project
Nếu muốn tự động luôn thì thêm mấy dòng lệnh này vào đầu code
PHP:
Dim regKey As String
regKey = "HKEY_CURRENT_USER\Software\Microsoft\Office\" & Application.Version & "\Excel\Security\AccessVBOM"
CreateObject("WScript.Shell").RegWrite regKey, 1, "REG_DWORD"
 
Lần chỉnh sửa cuối:
Upvote 0
Bạn phải vào Macro Security, tìm mục macro setting rồi check trong mục Trust Access to The VBA Project
Nếu muốn tự động luôn thì thêm mấy dòng lệnh này vào đầu code
PHP:
Dim regKey As String
regKey = "HKEY_CURRENT_USER\Software\Microsoft\Office\" & Application.Version & "\Excel\Security\AccessVBOM"
CreateObject("WScript.Shell").RegWrite regKey, 1, "REG_DWORD"
Em làm như anh hướng dẫn thành công như mong muốn. Còn tự động thì chưa thành công, em đang đùng office 2010 không biết có ảnh hưởng gì không vậy anh?
Cảm ơn anh rất nhiều!
 
Lần chỉnh sửa cuối:
Upvote 0
Em làm như anh hướng dẫn thành công như mong muốn. Còn tự động thì chưa thành công, em đang đùng office 2010 không biết có ảnh hưởng gì không vậy anh?
Cảm ơn anh rất nhiều!
Còn thiếu 1 câu lệnh sau khi Import module
PHP:
Application.VBE.ActiveVBProject.VBComponents.Import "AddModule.bas"  
Kill "AddModule.bas"
 
Upvote 0
Có lúc được lúc không anh Quang Hải ơi.
- Nếu có pass VBA thì chắc chắn chạy không được (chắc nó không cho truy cập vào)
- Phải vào Trust center chọn ok phát rồi ra mới chạy được, mặc dù Trust access to the VBA... đã được đánh dấu rồi (office 2010)
Chắc em phải bán tự động 1 lần.
Cảm ơn anh nhiều!
Chúc anh ngủ ngon!
-------------------------------
Muốn xuất module ra và import vào thì bắt buộc phải không có mật khẩu VBA (Anh Quang Hải có thể giúp thêm phần này để khi chạy code nó "tự mở" mật khẩu VBA ra để làm việc sau đó đóng lại)
Còn phần khai báo và thêm code để nó tự động check Trust access to the VBA... thì cũng không cần thiết vì vào option chọn 1 lần và nhớ mãi thì cũng không phiền gì.
 
Lần chỉnh sửa cuối:
Upvote 0
Có lúc được lúc không anh Quang Hải ơi.
- Nếu có pass VBA thì chắc chắn chạy không được (chắc nó không cho truy cập vào)
- Phải vào Trust center chọn ok phát rồi ra mới chạy được, mặc dù Trust access to the VBA... đã được đánh dấu rồi (office 2010)
Chắc em phải bán tự động 1 lần.
Cảm ơn anh nhiều!
Chúc anh ngủ ngon!
-------------------------------
Muốn xuất module ra và import vào thì bắt buộc phải không có mật khẩu VBA (Anh Quang Hải có thể giúp thêm phần này để khi chạy code nó "tự mở" mật khẩu VBA ra để làm việc sau đó đóng lại)
Còn phần khai báo và thêm code để nó tự động check Trust access to the VBA... thì cũng không cần thiết vì vào option chọn 1 lần và nhớ mãi thì cũng không phiền gì.
Mấy vụ tạo password để che giấu kiến thức thì mình kém lắm. Nhưng lại khoái phá pass của người khác để học cái họ giấu.
Thôi bạn hãy đợi thành viên khác giúp tiếp về vấn đề này nha.
 
Upvote 0
Mấy vụ tạo password để che giấu kiến thức thì mình kém lắm. Nhưng lại khoái phá pass của người khác để học cái họ giấu.
Thôi bạn hãy đợi thành viên khác giúp tiếp về vấn đề này nha.

Đặt mật khẩu để người dùng phổ thông họ khỏi chọc ngoáy vào đó gây ra lỗi chứ để bảo mật thì mật khẩu VBA đâu có làm khó được các cao thủ đâu anh.
 
Upvote 0
Sau khi vận dụng code của các thành viên, e ra code này, xuất ra nhiều Folder khác nhau (đường dẫn lưu ở [V2:V8] sheet7), code chạy tốt:
[GPECODE=vb]Sub XuatExcelTest()
Application.DisplayAlerts = False
On Error Resume Next
Dim Path, i As Long
Dim Name As String
Name = "ABC"
With Sheet7
Path = .Range("V2:V8").Value
End With
Sheets(Array("Report","DNTN")).Copy
With ActiveWorkbook
For i = 1 To UBound(Path)
.SaveAs Path(i, 1) & Name, 50
' 50 xuat ra XLSB
' 18 xuat ra XLS 97 - 2003
' 51 xuat ra XLSX
' 52 xuat ra XLSM
Next
.Close
End With
MsgBox "Data has been successfully Exported!"
Application.DisplayAlerts = True
End Sub
[/GPECODE]
Tuy nhiên Cho e hỏi thêm 1 chút, Một số sheet xuất ra của em có code, e không muốn copy phần code của sheet sang file mới thì thay đổi code thế nào?
E xin cảm ơn
 
Upvote 0
Thử nghiên cứu code xóa Module:
[GPECODE=vb]Sub Delete_Module()
Dim vbCom As Object
Set vbCom = Application.VBE.ActiveVBProject.VBComponents
vbCom.Remove VBComponent:=vbCom.Item("Module1")
End Sub[/GPECODE]
 
Upvote 0
Sau khi vận dụng code của các thành viên, e ra code này, xuất ra nhiều Folder khác nhau (đường dẫn lưu ở [V2:V8] sheet7), code chạy tốt:
[GPECODE=vb]Sub XuatExcelTest()
Application.DisplayAlerts = False
On Error Resume Next
Dim Path, i As Long
Dim Name As String
Name = "ABC"
With Sheet7
Path = .Range("V2:V8").Value
End With
Sheets(Array("Report","DNTN")).Copy
With ActiveWorkbook
For i = 1 To UBound(Path)
.SaveAs Path(i, 1) & Name, 50
' 50 xuat ra XLSB
' 18 xuat ra XLS 97 - 2003
' 51 xuat ra XLSX
' 52 xuat ra XLSM
Next
.Close
End With
MsgBox "Data has been successfully Exported!"
Application.DisplayAlerts = True
End Sub
[/GPECODE]
Tuy nhiên Cho e hỏi thêm 1 chút, Một số sheet xuất ra của em có code, e không muốn copy phần code của sheet sang file mới thì thay đổi code thế nào?
E xin cảm ơn
Đơn giản nhất là thay số 50 thành số 51 là được rồi
 
Upvote 0
Thử nghiên cứu code xóa Module:
[GPECODE=vb]Sub Delete_Module()
Dim vbCom As Object
Set vbCom = Application.VBE.ActiveVBProject.VBComponents
vbCom.Remove VBComponent:=vbCom.Item("Module1")
End Sub[/GPECODE]
Đã diệt thì diệt cho tận gốc chứ
PHP:
Sub DeleteAllVBACode()
Dim VBProj As VBIDE.VBProject
Dim VBComp As VBIDE.VBComponent
Dim CodeMod As VBIDE.CodeModule
  Set VBProj = ActiveWorkbook.VBProject
    For Each VBComp In VBProj.VBComponents
       If VBComp.Type = vbext_ct_Document Then
          Set CodeMod = VBComp.CodeModule
          CodeMod.DeleteLines 1, CodeMod.CountOfLines
       Else
          VBProj.VBComponents.Remove VBComp
       End If
    Next VBComp
End Sub
 
Upvote 0
Ôi cảm ơn a QUANGHAI, những cái đơn giản trong tầm tay nhiều khi cũng không nhìn ra &&&%$R
Cuộc sống đơn giản vậy đôi khi cứ phức tạp hóa vấn đề nên không nhìn ra cái j cả.
Tuy nhiên, để tối ưu file xuất ra (xlsb cho nhẹ) thì bạn cũng phải nghiên cứu thêm code xóa module của a Hải.
 
Upvote 0
Cuộc sống đơn giản vậy đôi khi cứ phức tạp hóa vấn đề nên không nhìn ra cái j cả.
Tuy nhiên, để tối ưu file xuất ra (xlsb cho nhẹ) thì bạn cũng phải nghiên cứu thêm code xóa module của a Hải.
Copy code vào 1 module, trước vòng For thì gọi nó ra là được, chẳng phải nghiên nghiến gì cả
 
Upvote 0

File đính kèm

  • DelCode.jpg
    DelCode.jpg
    115.9 KB · Đọc: 4
  • ThucHanh.xlsb
    ThucHanh.xlsb
    25.6 KB · Đọc: 4
Upvote 0
Upvote 0
Quá nuột nà ạ !!! Cảm ơn anh Hải và anh Cá ạ
Mã:
Sub XuatExcelTest()
    Application.DisplayAlerts = False
    On Error Resume Next
    Dim Path, i As Long
    Dim Name As String
    Name = "ABC"
    With Sheet7
        Path = .Range("V2:V8").Value
    End With
    Sheets(Array("Report","DNTN")).Copy
    With ActiveWorkbook
  DeleteAllVBACode        
  For i = 1 To UBound(Path)
        .SaveAs Path(i, 1) & Name, 50
                ' 50 xuat ra XLSB
                ' 18 xuat ra XLS 97 - 2003
                ' 51 xuat ra XLSX
                ' 52 xuat ra XLSM
        Next
        .Close
    End With
    MsgBox "Data has been successfully Exported!"
    Application.DisplayAlerts = True
End Sub
Mã:
Sub DeleteAllVBACode()
Dim VBProj As VBIDE.VBProject
Dim VBComp As VBIDE.VBComponent
Dim CodeMod As VBIDE.CodeModule
  Set VBProj = ActiveWorkbook.VBProject
    For Each VBComp In VBProj.VBComponents
       If VBComp.Type = vbext_ct_Document Then
          Set CodeMod = VBComp.CodeModule
          CodeMod.DeleteLines 1, CodeMod.CountOfLines
       Else
          VBProj.VBComponents.Remove VBComp
       End If
    Next VBComp
End Sub
 
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0

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

Back
Top Bottom