Code save as sheet hiện hành

Liên hệ QC

pro8x

Thành viên hoạt động
Tham gia
3/11/11
Bài viết
142
Được thích
24
Các thầy cho e hỏi về đoanj code để saveas sheet hiện hành với ah. Cụ thể e có 1 file có khoảng 10 sheet, giờ e muốn tạo 1 code saveas để khi chạy code này thì sẽ saveas file dưới dạng .xls nhưng chỉ save sheet hiện hành thui.E có viết code nhưng nó save cả file tìm mãi ma không ra.mong các thầy giúp +-+-+-+ +-+-+-+
 
Mình cũng hay lưu sheet hiện hành để gửi báo cáo riêng 1 sheet. Code mình viết bằng Record rồi thực hiện thôi (tạo một workbook mới > move copy sheet hiện hành qua workbook mới > lưu file .xls > close workbook.
Mã:
Sub ChonNoiLuuBaoCao()
Dim MyFolder As String
    With Application.FileDialog(msoFileDialogFolderPicker)
        If .Show = True Then
            MyFolder = .SelectedItems(1)
            Call LuuBaoCao
        Else
            Exit Sub
        End If
    End With
End Sub
  
Sub LuuBaoCao()
On Error Resume Next
Application.ScreenUpdating = False
Dim x As String, a As String, b As String
    x = ThisWorkbook.Name
    b = ActiveSheet.Name 'Ten sheet hien hanh
    Workbooks.Add 'Tao moi 01 workbook
    a = b & " " & Day(Now()) & "-" & Month(Now()) & "-" & Right(Year(Now()), 2) 'Ten sheet + ngay thang nam
    y = a & ".xls" 'Ten file khi save as type *xls
    
    [B][COLOR=#ff0000]ActiveWorkbook.SaveAs Filename:=y, FileFormat:= _
    xlExcel8, CreateBackup:=False 'save as type *xls[/COLOR][/B]
    Windows(x).Activate
    With ActiveSheet
        .Select
        .Copy Before:=Workbooks(y).Sheets(1)
    End With
    With Workbooks(y)
        .Activate
        .Save
        .Close
    End With
    MsgBox "SaveAs file thanh cong", vbInformation, "Thong Bao"
Application.ScreenUpdating = True
End Sub

anh NDU ơi góp ý giúp em nếu bỏ qua thông báo replace file khi trùng tên cũ thì em nên viết vào code này thêm dòng lệnh nào nữa vậy anh.
Đê ý dòng code màu đỏ nha
Thêm vào dòng lệnh Application.DisplayAlerts = False trước dòng màu đò và Application.DisplayAlerts = True sau dòng màu đỏ. Tức
Mã:
Application.DisplayAlerts = False 
[COLOR=#ff0000][B]ActiveWorkbook.SaveAs Filename:=y, FileFormat:= _
    xlExcel8, CreateBackup:=False 'save as type *xls[/B][/COLOR]
Application.DisplayAlerts = True
 
Upvote 0
Ah thầy ơi ý e là thế này.
Ví dụ file chính có các macro thì khi saveas file saveas vẫn phải có các macro đó. Không biết có được không ah mong thầy giúp
Tưởng chỉ lưu sheet đó ra như dạng backup data thôi chứ, lưu macro theo chi cho nặng file.
 
Upvote 0
Code xuất sheet hiện hành thành File riêng trong cùng thư mục

Anh NDU ơi! mình gửi File mẫu rồi nè anh xem dùm nha. Thân ái chào anh.
File mẫu View attachment file mau 1.rar
 
Upvote 0
Upvote 0
Mình đang dùng excel 2003 anh chỉ rõ một tí nha qua video trên mình không hiểu. Cám ơn anh nhiều.

Tôi không dùng Excel 2003 nên không biết đâu
Vậy có vấn đề gì, bạn cứ quay phim quá trình bạn thao tác rồi đưa lên đây nhé
Ngoài ra, nếu nghi ngờ file này bị lỗi, bạn có thể thí nghiệm bằng 1 file mới khác xem quá trình SaveSheet có trục trặc gì không?
 
Upvote 0
Tôi không dùng Excel 2003 nên không biết đâu
Vậy có vấn đề gì, bạn cứ quay phim quá trình bạn thao tác rồi đưa lên đây nhé
Ngoài ra, nếu nghi ngờ file này bị lỗi, bạn có thể thí nghiệm bằng 1 file mới khác xem quá trình SaveSheet có trục trặc gì không?
Cám ơn anh nhiều , mình có làm rồi nhưng xuất ra là thư mục rỗng, mình cũng biết tại sao nữa. Anh xem code này nhé

Sub SaveFile()


Dim Ans As Integer
Dim Filt As String

Ans = MsgBox("Confirm you want to save this File." _
& (Chr(13) & Chr(10)) & (Chr(13) & Chr(10)) & _
"File will save as: Backup - (SheetNumber).xls in current directory", vbYesNo)


If Ans = vbNo Then Exit Sub
Application.DisplayAlerts = False
ThisWorkbook.SaveCopyAs Filename:=ActiveWorkbook.Path & "\Backup - " & ThisWorkbook.Name
Application.DisplayAlerts = True
ThisWorkbook.Close
End Sub


code này lưu (backup) nguyên cả 1 file trong cùng 1 thư mục.
Nhưng mình chỉ cần save sheet hiện hành thành 1 file riêng.
file đính kèm View attachment backup.xls
 
Upvote 0

Xin lỗi phải lôi ra việc cũ. Nhưng thấy rất hay. Em có tạo toppic tương tự vấn đề này
nóng lòng chưa có câu trả lời. Lục những toppic có liên quan.

Sẵn đây rất mong anh NDU giúp thêm cách coppy tương tự nhưng chỉ coppy 1 vùng chỉ định trước ở sheet nguồn.
Em cám ơn nhiều!
 

File đính kèm

  • file nguon.xlsm
    24.3 KB · Đọc: 26
Lần chỉnh sửa cuối:
Upvote 0
Xin lỗi thầy ndu vì e hỏi lại chủ đề này.
E hiện tại đang dùng 2 addin liên quan đến sheet.
1 cái là có phím tắt ctrl shift c để mở sheet hiện hành ra 1 file mới.
Còn 1 cái của thầy là lưu luôn ra 1 file riêng mà ko mở file đấy.
Có cách nào để chỉ dùng 1 addin của thầy mà có lựa chọn là lưu file hoặc lưu và mở file ko ạ?
 
Upvote 0
Code cho bạn đây:
Mã:
Function SaveSheet(ByVal Sheets2Save As Object, ByVal FileName2Save As String, _
                   ByVal FileFormat As XlFileFormat, ByVal OverWrite As Boolean) As String
  Dim bChk As Boolean
  Dim Folder2Save As String, sComm As String, Ext As String, ErrMsg As String
  Dim fso As Object, oWsh As Object, wkb As Workbook
  On Error GoTo ExitFunc
  Set fso = CreateObject("Scripting.FileSystemObject")
  bChk = fso.FileExists(FileName2Save)
  If (bChk = False) Or OverWrite Then
    Folder2Save = Mid(FileName2Save, 1, InStrRev(FileName2Save, "\") - 1)
    If fso.FolderExists(Folder2Save) = False Then
      Set oWsh = CreateObject("Wscript.Shell")
      sComm = "MkDir " & """" & Folder2Save & """"
      oWsh.Run "cmd /u /c " & sComm, 0, True
    End If
    If fso.FolderExists(Folder2Save) Then
      Ext = fso.GetExtensionName(FileName2Save)
      If Len(Ext) Then FileName2Save = Left(FileName2Save, Len(FileName2Save) - Len(Ext) - 1)
      If (TypeName(Sheets2Save) = "Sheets") Or (TypeName(Sheets2Save) = "Worksheet") Then
        Application.DisplayAlerts = False
        Sheets2Save.Copy
        Set wkb = ActiveWorkbook
        With wkb
          .SaveAs FileName2Save, FileFormat
          SaveSheet = .FullName
          .Close (True)
        End With
        Application.DisplayAlerts = True
      End If
    End If
  End If
ExitFunc:
  ErrMsg = Err.Description
  If Err.Number = 1004 Then
    If Not wkb Is Nothing Then
      If UCase(wkb.Name) <> UCase(Sheets2Save.Parent.Name) Then wkb.Close (False)
    End If
    MsgBox ErrMsg
  End If
  Set fso = Nothing: Set oWsh = Nothing
End Function
Mã:
Sub Main()
' XlFileFormat = xlExcel8                      <===> File Extension = "xls"
' XlFileFormat = xlOpenXMLWorkbook             <===> File Extension = "xlsx"
' XlFileFormat = xlExcel12                     <===> File Extension = "xlsb"
' XlFileFormat = xlOpenXMLWorkbookMacroEnabled <===> File Extension = "xlsm"
  Dim wks As Object, FileFormat As XlFileFormat
  Dim FileName As String, szSaved As String
  Application.ScreenUpdating = False
  [COLOR=#ff0000]Set wks = ThisWorkbook.Sheets(Array("Sheet1", "Sheet2"))[/COLOR] '>> wks bao gom nhieu sheet
  'Set wks = ThisWorkbook.Worksheets("Sheet1")             '>> wks là 1 sheet duy nhat
[COLOR=#ff0000] FileName = "D:\ABC\Test.xls"
  FileFormat = xlExcel8[/COLOR]
  szSaved = SaveSheet(wks, FileName, FileFormat, True)
  If Len(szSaved) Then MsgBox "File """ & szSaved & """ have been successfully saved!"
  Application.ScreenUpdating = True
End Sub
Hàm SaveSheet bạn không cần quan tâm, chỉ cần biết áp dụng tại sheet Main
Cú pháp hàm:
SaveSheet(Sheet cần lưu, Đường dẫn file sẽ lưu, kiểu định dạng file, cho lưu đè hay không?)
Lưu ý:
- Sheet cần lưu (Sheets2Save) có thể là 1 hoặc nhiều sheet
Ví dụ:
Set wks = ThisWorkbook.Sheets(Array("Sheet1", "Sheet2")) ---> Lưu 2 sheet thành file
Set wks = ThisWorkbook.Worksheets("Sheet1") ---> Lưu 1 sheet duy nhất
- Đường dẫn file sẽ lưu (FileName2Save): Thư mục chứa đường dẫn đến file có thể đã tồn tại hoặc chưa. Nếu thư mục lưu file chưa tồn tại thì code sẽ tự động tạo ra nó
- kiểu định dạng file (FileFormat):
FileFormat = xlExcel8 <===> Đuôi file = "xls"​
FileFormat = xlOpenXMLWorkbook <===> Đuôi file = "xlsx"​
FileFormat = xlExcel12 <===> Đuôi file = "xlsb"​
FileFormat = xlOpenXMLWorkbookMacroEnabled <===> File Đuôi file = "xlsm"​
- Cho lưu đè (OverWrite): OverWrite = TRUE sẽ cho lưu đè và ngược lại
-------------------
Vậy bạn chỉ cần quan tâm 3 dòng code màu đỏ và khai báo cho đúng là đủ
Anh Tuấn ơi! em cũng đang sử dụng code này của anh. Nếu mà muốn bỏ các công thức (chỉ lây giá trị) trong sheet khi lưu thành file mới thì sửa code thế nào vậy anh.
 
Upvote 0
Anh Tuấn ơi! em cũng đang sử dụng code này của anh. Nếu mà muốn bỏ các công thức (chỉ lây giá trị) trong sheet khi lưu thành file mới thì sửa code thế nào vậy anh.

Ôi topic quá hay và tuyệt vời. Tks Thầy Tuấn và các anh chị trong topic này đã chia sẻ kiến thức quý báu này.

Em đúng cũng là đang cần thầy Tuấn đưa ra giải pháp bổ sung cho vấn đề của bạn chiến dịch đã nêu. Rất mong thầy hướng dẫn ạ.

Tks all.
 
Upvote 0
Code cho bạn đây:
Mã:
Function SaveSheet(ByVal Sheets2Save As Object, ByVal FileName2Save As String, _
                   ByVal FileFormat As XlFileFormat, ByVal OverWrite As Boolean) As String
  Dim bChk As Boolean
  Dim Folder2Save As String, sComm As String, Ext As String, ErrMsg As String
  Dim fso As Object, oWsh As Object, wkb As Workbook
  On Error GoTo ExitFunc
  Set fso = CreateObject("Scripting.FileSystemObject")
  bChk = fso.FileExists(FileName2Save)
  If (bChk = False) Or OverWrite Then
    Folder2Save = Mid(FileName2Save, 1, InStrRev(FileName2Save, "\") - 1)
    If fso.FolderExists(Folder2Save) = False Then
      Set oWsh = CreateObject("Wscript.Shell")
      sComm = "MkDir " & """" & Folder2Save & """"
      oWsh.Run "cmd /u /c " & sComm, 0, True
    End If
    If fso.FolderExists(Folder2Save) Then
      Ext = fso.GetExtensionName(FileName2Save)
      If Len(Ext) Then FileName2Save = Left(FileName2Save, Len(FileName2Save) - Len(Ext) - 1)
      If (TypeName(Sheets2Save) = "Sheets") Or (TypeName(Sheets2Save) = "Worksheet") Then
        Application.DisplayAlerts = False
        Sheets2Save.Copy
        Set wkb = ActiveWorkbook
        With wkb
          .SaveAs FileName2Save, FileFormat
          SaveSheet = .FullName
          .Close (True)
        End With
        Application.DisplayAlerts = True
      End If
    End If
  End If
ExitFunc:
  ErrMsg = Err.Description
  If Err.Number = 1004 Then
    If Not wkb Is Nothing Then
      If UCase(wkb.Name) <> UCase(Sheets2Save.Parent.Name) Then wkb.Close (False)
    End If
    MsgBox ErrMsg
  End If
  Set fso = Nothing: Set oWsh = Nothing
End Function
Mã:
Sub Main()
' XlFileFormat = xlExcel8                      <===> File Extension = "xls"
' XlFileFormat = xlOpenXMLWorkbook             <===> File Extension = "xlsx"
' XlFileFormat = xlExcel12                     <===> File Extension = "xlsb"
' XlFileFormat = xlOpenXMLWorkbookMacroEnabled <===> File Extension = "xlsm"
  Dim wks As Object, FileFormat As XlFileFormat
  Dim FileName As String, szSaved As String
  Application.ScreenUpdating = False
  [COLOR=#ff0000]Set wks = ThisWorkbook.Sheets(Array("Sheet1", "Sheet2"))[/COLOR] '>> wks bao gom nhieu sheet
  'Set wks = ThisWorkbook.Worksheets("Sheet1")             '>> wks là 1 sheet duy nhat
[COLOR=#ff0000] FileName = "D:\ABC\Test.xls"
  FileFormat = xlExcel8[/COLOR]
  szSaved = SaveSheet(wks, FileName, FileFormat, True)
  If Len(szSaved) Then MsgBox "File """ & szSaved & """ have been successfully saved!"
  Application.ScreenUpdating = True
End Sub
Hàm SaveSheet bạn không cần quan tâm, chỉ cần biết áp dụng tại sheet Main
Cú pháp hàm:
SaveSheet(Sheet cần lưu, Đường dẫn file sẽ lưu, kiểu định dạng file, cho lưu đè hay không?)
Lưu ý:
- Sheet cần lưu (Sheets2Save) có thể là 1 hoặc nhiều sheet
Ví dụ:
Set wks = ThisWorkbook.Sheets(Array("Sheet1", "Sheet2")) ---> Lưu 2 sheet thành file
Set wks = ThisWorkbook.Worksheets("Sheet1") ---> Lưu 1 sheet duy nhất
- Đường dẫn file sẽ lưu (FileName2Save): Thư mục chứa đường dẫn đến file có thể đã tồn tại hoặc chưa. Nếu thư mục lưu file chưa tồn tại thì code sẽ tự động tạo ra nó
- kiểu định dạng file (FileFormat):
FileFormat = xlExcel8 <===> Đuôi file = "xls"​
FileFormat = xlOpenXMLWorkbook <===> Đuôi file = "xlsx"​
FileFormat = xlExcel12 <===> Đuôi file = "xlsb"​
FileFormat = xlOpenXMLWorkbookMacroEnabled <===> File Đuôi file = "xlsm"​
- Cho lưu đè (OverWrite): OverWrite = TRUE sẽ cho lưu đè và ngược lại
-------------------
Vậy bạn chỉ cần quan tâm 3 dòng code màu đỏ và khai báo cho đúng là đủ
bác NuNu ơi cho em hỏi thêm một chút nếu chỉ muốn copy giá trị có được không bác. Ý em là khi save ra file mới vẫn còn công thức bác ạ. Em cảm ơn bác nhiều nhiều....
 
Upvote 0
Code cho bạn đây:
Mã:
Function SaveSheet(ByVal Sheets2Save As Object, ByVal FileName2Save As String, _
                   ByVal FileFormat As XlFileFormat, ByVal OverWrite As Boolean) As String
  Dim bChk As Boolean
  Dim Folder2Save As String, sComm As String, Ext As String, ErrMsg As String
  Dim fso As Object, oWsh As Object, wkb As Workbook
  On Error GoTo ExitFunc
  Set fso = CreateObject("Scripting.FileSystemObject")
  bChk = fso.FileExists(FileName2Save)
  If (bChk = False) Or OverWrite Then
    Folder2Save = Mid(FileName2Save, 1, InStrRev(FileName2Save, "\") - 1)
    If fso.FolderExists(Folder2Save) = False Then
      Set oWsh = CreateObject("Wscript.Shell")
      sComm = "MkDir " & """" & Folder2Save & """"
      oWsh.Run "cmd /u /c " & sComm, 0, True
    End If
    If fso.FolderExists(Folder2Save) Then
      Ext = fso.GetExtensionName(FileName2Save)
      If Len(Ext) Then FileName2Save = Left(FileName2Save, Len(FileName2Save) - Len(Ext) - 1)
      If (TypeName(Sheets2Save) = "Sheets") Or (TypeName(Sheets2Save) = "Worksheet") Then
        Application.DisplayAlerts = False
        Sheets2Save.Copy
        Set wkb = ActiveWorkbook
        With wkb
          .SaveAs FileName2Save, FileFormat
          SaveSheet = .FullName
          .Close (True)
        End With
        Application.DisplayAlerts = True
      End If
    End If
  End If
ExitFunc:
  ErrMsg = Err.Description
  If Err.Number = 1004 Then
    If Not wkb Is Nothing Then
      If UCase(wkb.Name) <> UCase(Sheets2Save.Parent.Name) Then wkb.Close (False)
    End If
    MsgBox ErrMsg
  End If
  Set fso = Nothing: Set oWsh = Nothing
End Function
Mã:
Sub Main()
' XlFileFormat = xlExcel8                      <===> File Extension = "xls"
' XlFileFormat = xlOpenXMLWorkbook             <===> File Extension = "xlsx"
' XlFileFormat = xlExcel12                     <===> File Extension = "xlsb"
' XlFileFormat = xlOpenXMLWorkbookMacroEnabled <===> File Extension = "xlsm"
  Dim wks As Object, FileFormat As XlFileFormat
  Dim FileName As String, szSaved As String
  Application.ScreenUpdating = False
  [COLOR=#ff0000]Set wks = ThisWorkbook.Sheets(Array("Sheet1", "Sheet2"))[/COLOR] '>> wks bao gom nhieu sheet
  'Set wks = ThisWorkbook.Worksheets("Sheet1")             '>> wks là 1 sheet duy nhat
[COLOR=#ff0000] FileName = "D:\ABC\Test.xls"
  FileFormat = xlExcel8[/COLOR]
  szSaved = SaveSheet(wks, FileName, FileFormat, True)
  If Len(szSaved) Then MsgBox "File """ & szSaved & """ have been successfully saved!"
  Application.ScreenUpdating = True
End Sub
Hàm SaveSheet bạn không cần quan tâm, chỉ cần biết áp dụng tại sheet Main
Cú pháp hàm:
SaveSheet(Sheet cần lưu, Đường dẫn file sẽ lưu, kiểu định dạng file, cho lưu đè hay không?)
Lưu ý:
- Sheet cần lưu (Sheets2Save) có thể là 1 hoặc nhiều sheet
Ví dụ:
Set wks = ThisWorkbook.Sheets(Array("Sheet1", "Sheet2")) ---> Lưu 2 sheet thành file
Set wks = ThisWorkbook.Worksheets("Sheet1") ---> Lưu 1 sheet duy nhất
- Đường dẫn file sẽ lưu (FileName2Save): Thư mục chứa đường dẫn đến file có thể đã tồn tại hoặc chưa. Nếu thư mục lưu file chưa tồn tại thì code sẽ tự động tạo ra nó
- kiểu định dạng file (FileFormat):
FileFormat = xlExcel8 <===> Đuôi file = "xls"​
FileFormat = xlOpenXMLWorkbook <===> Đuôi file = "xlsx"​
FileFormat = xlExcel12 <===> Đuôi file = "xlsb"​
FileFormat = xlOpenXMLWorkbookMacroEnabled <===> File Đuôi file = "xlsm"​
- Cho lưu đè (OverWrite): OverWrite = TRUE sẽ cho lưu đè và ngược lại
-------------------
Vậy bạn chỉ cần quan tâm 3 dòng code màu đỏ và khai báo cho đúng là đủ
Thầy ơi cho em hỏi tý ạ
Hiện tại đường dẫn lưu file đang cố định (vd: D:\ABC\Test.xls)
Thay vì vậy thì chọn bảng hiện đường dẫn lưu file thì mình chỉnh thế nào vậy ạ
em cảm ơn thầy
 
Upvote 0
Tình huống Save sheet hiện hành thành một file thì tên file là chưa tồn tại, vậy liệu có dùng GetOpenFileName được không bạn? Tôi không nghĩ là được
Bài đã được tự động gộp:

Thầy ơi cho em hỏi tý ạ
Hiện tại đường dẫn lưu file đang cố định (vd: D:\ABC\Test.xls)
Thay vì vậy thì chọn bảng hiện đường dẫn lưu file thì mình chỉnh thế nào vậy ạ
em cảm ơn thầy
Bài số 18 là đầy đủ theo ý bạn rồi đó
 
Upvote 0
Tình huống Save sheet hiện hành thành một file thì tên file là chưa tồn tại, vậy liệu có dùng GetOpenFileName được không bạn? Tôi không nghĩ là được
Bài đã được tự động gộp:


Bài số 18 là đầy đủ theo ý bạn rồi đó
dạ thầy cho em hỏi sau khi xuất bị lỗi sai định dạng file thì sao khắc phục ạ
em cảm ơn thầy
 

File đính kèm

  • 233.PNG
    233.PNG
    8.5 KB · Đọc: 13
Upvote 0
à nếu file bảo vệ bằng lockxls khi save as sheet hiện hành thì bị lỗi định dạng thầy ạ
còn nếu để file ko bảo vệ thì không bị lỗi này
@ndu96081631 :Nhưng nếu dùng lockxls mà bảo vệ thì làm sao khắc phục thầy nhỉ
em cảm ơn thầy
 
Upvote 0
à nếu file bảo vệ bằng lockxls khi save as sheet hiện hành thì bị lỗi định dạng thầy ạ
còn nếu để file ko bảo vệ thì không bị lỗi này
@ndu96081631 :Nhưng nếu dùng lockxls mà bảo vệ thì làm sao khắc phục thầy nhỉ
em cảm ơn thầy
Bảo vệ bằng lockxls rồi save as chi nữa bạn
 
Upvote 0
Bảo vệ bằng lockxls rồi save as chi nữa bạn
dạ bảng tính nhiều sheet thì nặng. mà gửi cho người khác thì cũng chỉ cần bảng kết quả
nên em chỉ muốn save as bảng kết quả anh à
nhưng vẫn chưa tìm ra cách để bảo vệ xls mà vẫn đúng định dạng file ạ
 
Upvote 0
Web KT
Back
Top Bottom