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 +-+-+-+ +-+-+-+
 
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 +-+-+-+ +-+-+-+

Hỏi lại bạn: Nếu làm bằng tay thì bạn làm thế nào?
Nếu như bằng tay bạn làm được thì cứ record macro những thao tác vừa làm ---> Tự nhiên có code, khỏi cần hỏi
 
Upvote 0
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 +-+-+-+ +-+-+-+

Không biết bạn đã tự làm được chưa? Code thế nào? Có thể post lên cho tôi tham khảo được không?
Tôi hỏi thế vì sau khi trả lời ở bài 2, tôi đã suy nghĩ đến việc sẽ viết 1 code ở MỨC TỔNG QUÁT NHẤT
Nếu bạn vẫn còn quan tâm vấn đề này, tôi sẽ nghiên cứu tiếp tục (để bạn hoặc ai đó xài thoải mái nhất)
Sao?
 
Upvote 0
Không biết bạn đã tự làm được chưa? Code thế nào? Có thể post lên cho tôi tham khảo được không?
Tôi hỏi thế vì sau khi trả lời ở bài 2, tôi đã suy nghĩ đến việc sẽ viết 1 code ở MỨC TỔNG QUÁT NHẤT
Nếu bạn vẫn còn quan tâm vấn đề này, tôi sẽ nghiên cứu tiếp tục (để bạn hoặc ai đó xài thoải mái nhất)
Sao?
Em rất cảm ơn thầy.Hôm qua e đi làm lên chưa Replay lại được. Em có thử record bàng Macro nhưng làm thủ công khi savas thì vẫn không được đi.Hic. Mong thầy giup đỡ tiép
 
Upvote 0
Em rất cảm ơn thầy.Hôm qua e đi làm lên chưa Replay lại được. Em có thử record bàng Macro nhưng làm thủ công khi savas thì vẫn không được đi.Hic. Mong thầy giup đỡ tiép

OK! Nếu bạn có nhu cầu tôi sẽ nghiên cứu
(Tối nay hoặc ngày mai sẽ có kết quả)
 
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
  Set wks = ThisWorkbook.Sheets(Array("Sheet1", "Sheet2")) '>> wks bao gom nhieu sheet
  'Set wks = ThisWorkbook.Worksheets("Sheet1")             '>> wks là 1 sheet duy nhat
  FileName = "D:\ABC\Test.xls"
  FileFormat = xlExcel8
  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à đủ
 

File đính kèm

  • SaveSheet2File.xlsm
    22.6 KB · Đọc: 347
Upvote 0
Em xin cảm ơn thầy đã giúp. Còn 1 vấn đề em muốn hỏi mong thầy giúp
1. E muốn saveas sheet hiện hành thui. Nếu như code của thầy thì muốn save sheet nào lại phải sủa main_Sub. trong khi đó các sheet saveas mỗi ngày lại khác nhau. => Vấn đề này e đã sửa laaij code tạm thời OK
2. Sau khi saveas thì toàn bộ code của file bị mất. Cái này e chưa sửa được mong thầy chỉ thêm
Đây là code sau khi e sửa lại
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
  'Set wks = ThisWorkbook.ActiveSheet(Range("e19").VALUE) '>> wks bao gom nhieu sheet
  Set wks = ThisWorkbook.Worksheets(Range("E19").Value)             '>> wks là 1 sheet duy nhat
 ' FileName = "D:\Test.xls"
  FileName = ActiveSheet.Range("A1").Value & "\" & ActiveSheet.Range("A2").Value
  FileFormat = xlExcel8
  szSaved = SaveSheet(wks, FileName, FileFormat, True)
 
  If Len(szSaved) Then MsgBox "File """ & szSaved & """ have been successfully saved!"
  Application.ScreenUpdating = True
End Sub
 
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
Em xin cảm ơn thầy đã giúp. Còn 1 vấn đề em muốn hỏi mong thầy giúp
1. E muốn saveas sheet hiện hành thui. Nếu như code của thầy thì muốn save sheet nào lại phải sủa main_Sub. trong khi đó các sheet saveas mỗi ngày lại khác nhau. => Vấn đề này e đã sửa laaij code tạm thời OK
Bạn muốn save sheet hiện hành thì: Set wks = ActiveSheet thôi là được rồi chứ gì
2. Sau khi saveas thì toàn bộ code của file bị mất. Cái này e chưa sửa được mong thầy chỉ thêm

Chổ này tôi không hiểu! Mất là mất thế nào chứ?
 
Upvote 0
Bạn muốn save sheet hiện hành thì: Set wks = ActiveSheet thôi là được rồi chứ gì


Chổ này tôi không hiểu! Mất là mất thế nào chứ?
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
 
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

Nếu là macro trong sheet (chẳng hạn Private Sub Worksheet_Change) thì sau khi lưu, cái macro ấy cũng được mang theo
Nếu là macro trong Module thì... bạn nghĩ sao? Có cái gì chứng minh rằng Module A, B, C nào đó là đang thuộc về ActiveSheet
Logic vấn đề nó vậy thôi ---> Bạn tự suy luận đi
--------------------
Mà nghĩ cũng lạ: Thường người ta muốn Save As và xóa hết mọi code. Bạn lại muốn làm được ngược lại?
???
 
Upvote 0
Nếu là macro trong sheet (chẳng hạn Private Sub Worksheet_Change) thì sau khi lưu, cái macro ấy cũng được mang theo
Nếu là macro trong Module thì... bạn nghĩ sao? Có cái gì chứng minh rằng Module A, B, C nào đó là đang thuộc về ActiveSheet
Logic vấn đề nó vậy thôi ---> Bạn tự suy luận đi
--------------------
Mà nghĩ cũng lạ: Thường người ta muốn Save As và xóa hết mọi code. Bạn lại muốn làm được ngược lại?
???
Vâng cảm ơn thầy, cái này e cũng biết nhưng muốn hỏi xem có cách nào giữ lại không thôi. E giữ lại macro ví file saveas này, sau đó sẽ được kiểm tra lại và chạy 1 thủ tục save PDF nữa ah
 
Upvote 0
Vâng cảm ơn thầy, cái này e cũng biết nhưng muốn hỏi xem có cách nào giữ lại không thôi. E giữ lại macro ví file saveas này, sau đó sẽ được kiểm tra lại và chạy 1 thủ tục save PDF nữa ah

Một code mà save ra tùm lum các file? Chắc là bạn muốn xài nhiều lần trên nhiều file? Vậy sao không Save code thành 1 AddIn luôn cho tiện
Nếu muốn, tôi có thể nghiên cứu thêm vấn đề này để bạn dùng thuận tiện hơn
 
Upvote 0
Một code mà save ra tùm lum các file? Chắc là bạn muốn xài nhiều lần trên nhiều file? Vậy sao không Save code thành 1 AddIn luôn cho tiện
Nếu muốn, tôi có thể nghiên cứu thêm vấn đề này để bạn dùng thuận tiện hơn
Vâng mong thầy chỉ thêm về vấn đề này ah
 
Upvote 0
Vâng mong thầy chỉ thêm về vấn đề này ah

Phần code chính để chạy thật sự không có khó khăn gì, nhưng để Save thành 1 AddIn và mang tính tiện dụng cho bạn thì phần xây dựng giao diện quả thật khó khăn đối với tôi
Sau mấy ngày nghiên cứu, tôi tạm xây dụng giao diện thế này

Untitled_1.jpg








Lần đầu tiên sử dụng thì chắc chắn cửa sổ Help sẽ hiện ra. Đọc kỹ hướng dẫn trong đó là được rồi:

Untitled_2.jpg




































Cảm ơn sự tư vấn của các bạn tại topic này: Nhờ tư vấn thiết kế CỬA SỔ HELP


----------------
Code chính: vẫn là code lần trước
Code tạo menu:
Mã:
Private Sub Auto_Open()
  Dim lCount As Long
  BuildBar
  lCount = GetSetting("Sheets2Files", "Settings", "lCount", 0)
  If lCount = 0 Then
    lCount = lCount + 1
    SaveSetting "Sheets2Files", "Settings", "lCount", lCount
    ShowHelp
  End If
End Sub
Mã:
Private Sub Auto_Close()
  DelBar
End Sub
Mã:
Private Sub ShowHelp()
  Dim dlg As DialogSheet
  Set dlg = ThisWorkbook.DialogSheets("Help")
  dlg.Show
End Sub
Mã:
Private Sub BuildBar()
  DelBar
  With Application.CommandBars.Add("Save Sheets")
   .Visible = True
    With .Controls.Add(msoControlEdit)
      .Caption = "Save to"
      .TooltipText = "Enter the path to save files..."
      .Style = msoComboLabel
      .OnAction = "SavePath_Setting"
      .Text = GetSetting("Sheets2Files", "Settings", "Path", "")
    End With
    With .Controls.Add(msoControlButton)
      .Caption = "Browse"
      .Style = msoButtonCaption
      .OnAction = "BrowseForFolder"
    End With
    .Controls.Add (msoControlButton)
    With .Controls.Add(msoControlEdit)
      .Caption = "File Name"
      .TooltipText = "Enter the File Name to save"
      .Style = msoComboLabel
      .OnAction = "FileName_Setting"
      .Text = GetSetting("Sheets2Files", "Settings", "FileName", "")
    End With
    .Controls.Add (msoControlButton)
    With .Controls.Add(msoControlDropdown)
      .Caption = "File Type"
      .TooltipText = "Select a file type"
      .Style = msoComboLabel
      .AddItem "Excel Workbook (*.xlsx)"
      .AddItem "Excel Macro-Enabled Workbook (*.xlsm)"
      .AddItem "Excel Binary Workbook (*.xlsb)"
      .AddItem "Excel 97-2003 Workbook (*.xls)"
      .OnAction = "FileType_Setting"
      Dim index As Long
      index = GetSetting("Sheets2Files", "Settings", "FileType", 0)
      If index > 0 Then .ListIndex = index
    End With
    .Controls.Add (msoControlButton)
    With .Controls.Add(msoControlButton)
      .Caption = "Save Selected Sheets"
      .Style = msoButtonIconAndCaption
      .FaceId = 3
      .OnAction = "SaveSheet2File"
    End With
    .Controls.Add (msoControlButton)
    With .Controls.Add(msoControlButton)
      .Caption = "Help"
      .Style = msoButtonIconAndCaption
      .OnAction = "ShowHelp"
      .FaceId = 984
    End With
  End With
End Sub
Mã:
Private Sub DelBar()
  On Error Resume Next
  Application.CommandBars("Save Sheets").Delete
End Sub
Mã:
Private Sub SavePath_Setting()
  Dim strPath As String
  On Error Resume Next
  strPath = Application.CommandBars("Save Sheets").Controls("Save to").Text
  SaveSetting "Sheets2Files", "Settings", "Path", strPath
End Sub
Mã:
Private Sub BrowseForFolder()
  Dim sPath As String
  On Error Resume Next
  With CreateObject("Shell.Application")
    sPath = .BrowseForFolder(0, "", 1).Self.Path
  End With
  Application.CommandBars("Save Sheets").Controls("Save to").Text = sPath
  SavePath_Setting
End Sub
Mã:
Private Sub FileName_Setting()
  Dim strName As String
  On Error Resume Next
  strName = Application.CommandBars("Save Sheets").Controls("File Name").Text
  SaveSetting "Sheets2Files", "Settings", "FileName", strName
End Sub
Mã:
Private Sub FileType_Setting()
  Dim index As Long
  On Error Resume Next
  index = Application.CommandBars("Save Sheets").Controls("File Type").ListIndex
  SaveSetting "Sheets2Files", "Settings", "FileType", index
End Sub
Mã:
Private Sub SaveSheet2File()
' XlFileFormat = xlExcel8                      <===> File Extension = "xls"  : Value = 56
' XlFileFormat = xlOpenXMLWorkbook             <===> File Extension = "xlsx" : Value = 51
' XlFileFormat = xlExcel12                     <===> File Extension = "xlsb" : Value = 50
' XlFileFormat = xlOpenXMLWorkbookMacroEnabled <===> File Extension = "xlsm" : Value = 52
  Dim wks As Object, FileFormat As Long, index As Long
  Dim FileName As String, szSaved As String, strPath As String, strName As String
  On Error Resume Next
  Application.ScreenUpdating = False
  Set wks = ActiveWindow.SelectedSheets
  index = GetSetting("Sheets2Files", "Settings", "FileType", 0)
  strPath = GetSetting("Sheets2Files", "Settings", "Path", "")
  strName = GetSetting("Sheets2Files", "Settings", "FileName", "")
  Select Case index
    Case Is = 1: FileFormat = 51
    Case Is = 2: FileFormat = 52
    Case Is = 3: FileFormat = 50
    Case Is = 4: FileFormat = 56
  End Select
  If Len(strPath) * Len(strName) Then
    If Right(strPath, 1) <> "\" Then strPath = strPath & "\"
    If FileFormat > 0 Then
      FileName = strPath & strName
      szSaved = modSaveSheets.SaveSheets(wks, FileName, FileFormat, True)
      If Len(szSaved) Then MsgBox "File """ & szSaved & """ have been successfully saved!"
    Else
      MsgBox "Please select a file type", , "WARNING!"
    End If
  Else
    MsgBox "Please setup the path and file name:" & vbLf & _
           "- Press 'Browse' button or type the path in 'Save to' Edit Box" & vbLf & _
           "- Type the file name in 'File Name' Edit Box", , "WARNING!"
  End If
  Application.ScreenUpdating = True
End Sub
-----------------
Vui lòng download file đính kèm và test giúp tôi xem còn chổ nào phải cải tiến thêm nữa không?
 

File đính kèm

  • SaveSheet2File.xlsm
    44.8 KB · Đọc: 246
  • SaveSheet2File.xlam
    44.8 KB · Đọc: 164
Lần chỉnh sửa cuối:
Upvote 0
Xin cảm ơn thầy đã giúp, E muốn hỏi là phần File Name có thể viêt code để nó lấy tên theo tên có sẵn trong cell của sheet hiện hành không ah. ( ở đây là cell AF6),và phần File type có thể thêm lưu PDF vào không
 
Upvote 0
Xin cảm ơn thầy đã giúp, E muốn hỏi là phần File Name có thể viêt code để nó lấy tên theo tên có sẵn trong cell của sheet hiện hành không ah. ( ở đây là cell AF6),và phần File type có thể thêm lưu PDF vào không

Phần File Type hoàn toàn không có vấn đề
Riêng phần file name thì tôi đang suy nghĩ xem thiết kế thế nào cho tổng quát nhất... Đáp ứng yêu cầu của bạn chẳng khó khăn gì, nhưng tôi lại không thích viết 1 ứng dụng chỉ 1 người xài. Ý tôi là nó phải ở mức tổng quát để ai xài cũng được
Để tính lại xem
 
Upvote 0
Xin cảm ơn thầy đã giúp, E muốn hỏi là phần File Name có thể viêt code để nó lấy tên theo tên có sẵn trong cell của sheet hiện hành không ah. ( ở đây là cell AF6),và phần File type có thể thêm lưu PDF vào không

Chúng ta thống nhất quy định này nhé:
- Nếu bạn gõ vào hộp File Name 1 tên nào đó (abc.xls chẳng hạn) thì đương nhiên đó sẽ tên của file lưu
- Nếu bạn muốn lấy giá trị của 1 cell nào đó làm tên file (là cell A6 chẳng hạn) thì bạn sẽ ghi vào hộp File Name thế này: |A6| ---> Có 2 dấu | ở đầu và cuối để code phân biệt
- Trường hợp cell mà bạn muốn đặt làm tên file nằm ở 1 sheet khác (là cell A6Sheet3 chẳng hạn), bạn sẽ ghi vào hộp File Name thế này: |Sheet3!A6|
Đồng ý chứ?
Tôi sẽ chỉnh lại code theo hướng trên, đồng thời cho thêm kiểu file PDF vào hộp File Type như ý của bạn. Cách dùng vẫn như trước
 

File đính kèm

  • SaveSheet2File.xlsm
    46.3 KB · Đọc: 259
Upvote 0
Xin cảm ơn thầy.Dung với ý e rồi đấy ah.hi
 
Upvote 0
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.
PHP:
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
    
    ActiveWorkbook.SaveAs Filename:=y, FileFormat:= _
    xlExcel8, CreateBackup:=False 'save as type *xls
    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.
 

File đính kèm

  • Test Code Save As ActiveSheet.xlsm
    18.8 KB · Đọc: 86
Lần chỉnh sửa cuối:
Upvote 0
Web KT
Back
Top Bottom