Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在不打开的情况下,用vba编码保存excel文件?_Vba_Excel_Excel 2010 - Fatal编程技术网

如何在不打开的情况下,用vba编码保存excel文件?

如何在不打开的情况下,用vba编码保存excel文件?,vba,excel,excel-2010,Vba,Excel,Excel 2010,我在excel工作表中添加了一个按钮,并在该按钮的vba窗口中添加了以下代码。现在,当我单击此按钮时,即当我运行代码时,它会以pdf格式保存excel工作表,其名称取自第H8单元格,并保存在M:\formats。此外,它还以.xlsx格式将相同的excel工作表保存在M:\formats\excels。但这里的问题是,当我运行代码时,它会关闭我在其中添加代码的excel表,并打开由代码保存的文件。例如,我制作了abc.xlsm excel工作表,并在vb窗口中添加了代码,现在xyz被写入abc.

我在excel工作表中添加了一个按钮,并在该按钮的vba窗口中添加了以下代码。现在,当我单击此按钮时,即当我运行代码时,它会以pdf格式保存excel工作表,其名称取自第H8单元格,并保存在M:\formats。此外,它还以.xlsx格式将相同的excel工作表保存在M:\formats\excels。但这里的问题是,当我运行代码时,它会关闭我在其中添加代码的excel表,并打开由代码保存的文件。例如,我制作了abc.xlsm excel工作表,并在vb窗口中添加了代码,现在xyz被写入abc.xlsm excel工作表的h8单元格中,现在当我运行代码时,它将关闭abc.xlsm,所有代码都显示在xyz.xlsx excel工作表中。我想它应该只保存在xlsx格式的文件,它需要的位置。它不应该关闭基本文件(在上面的示例中是abc.xlsx),也不应该打开保存的文件(在上面的示例中是xyz.xlsx)。此外,我希望保存的文件(上例中的xyz.xlsx)不包含任何vba编码。换句话说,它应该与基本文件(在上面的示例中是abc.xlsx)的备份副本一样。请帮助我在修改这些代码为他们,因为我想。我将非常感谢你。谢谢

Sub ExportAPDF_and_SaveAsXLSX()

Dim wsThisWorkSheet As Worksheet
Dim objFileSystemObject As New Scripting.FileSystemObject

Dim strFileName As String
Dim strBasePath As String

strBasePath = "M:\formats\"
strFileName = Range("H8")

On Error GoTo errHandler

Set wsThisWorkSheet = ActiveSheet

wsThisWorkSheet.ExportAsFixedFormat _
    Type:=xlTypePDF, _
    Filename:=strBasePath & strFileName, _
    Quality:=xlQualityStandard, _
    IncludeDocProperties:=True, _
    IgnorePrintAreas:=False, _
    OpenAfterPublish:=False

MsgBox "PDF file has been created."
strBasePath = "M:\formats\excels\"
strFileName = Range("H8")

Application.DisplayAlerts = False

strFileName = objFileSystemObject.GetBaseName(strFileName) & ".xlsx"

wsThisWorkSheet.SaveAs Filename:=strBasePath & strFileName, 

FileFormat:=xlOpenXMLWorkbook

Application.DisplayAlerts = False

MsgBox "Workbook now saved in XLSX format."


    exitHandler:
    Exit Sub
    errHandler:
    MsgBox "Could not create PDF file"
    Resume exitHandler

    End Sub

下面是代码,只做了两个小改动。两组新行前面都有注释“new”

还只是稍微整理了一下错误处理例程

其工作方式如下:

  • 将当前工作簿的文件名存储在变量“strMasterWorkbookFilename”中

  • PDF文件是通过“导出”工作表创建的

  • 然后将Excel工作表另存为XLSX。这实际上“关闭”了原始工作簿

  • 3.1从新的XLSX工作表中删除按钮(“按钮8”),并再次保存工作簿

  • 然后,代码重新打开原始工作簿(“strMasterWorkbookFilename”)并关闭当前工作簿
  • 注意-保存为XLSX将从保存的文件中删除宏代码。宏将保留在主“主”文件中

    Sub ExportAPDF_and_SaveAsXLSX()
    
        Dim wsThisWorkSheet As Worksheet
        Dim objFileSystemObject As New Scripting.FileSystemObject
    
        Dim strFileName As String
        Dim strBasePath As String
    
        ' NEW
        Dim strMasterWorkbookFilename As String
        strMasterWorkbookFilename = ThisWorkbook.FullName
    
        strBasePath = "M:\formats\"
        strFileName = Range("H8")
    
        On Error GoTo errHandler
    
        Set wsThisWorkSheet = ActiveSheet
    
        wsThisWorkSheet.ExportAsFixedFormat _
            Type:=xlTypePDF, _
            Filename:=strBasePath & strFileName, _
            Quality:=xlQualityStandard, _
            IncludeDocProperties:=True, _
            IgnorePrintAreas:=False, _
            OpenAfterPublish:=False
    
            MsgBox "PDF file has been created."
    
            Application.DisplayAlerts = False
            strFileName = objFileSystemObject.GetBaseName(strFileName) & ".xlsx"
            wsThisWorkSheet.SaveAs Filename:=strBasePath & strFileName, FileFormat:=xlOpenXMLWorkbook
            wsThisWorkSheet.Shapes("Button 8").Delete
            ActiveWorkbook.Save
    
            Application.DisplayAlerts = False
    
            MsgBox "Workbook now saved in XLSX format."
    
            ' NEW
            Workbooks.Open strMasterWorkbookFilename
            Workbooks(strFileName).Close SaveChanges:=False
    
    
        exitHandler:
                Exit Sub
        errHandler:
                MsgBox "Error Saving file.  The error is " & vbCrLf & Chr(34) & Err.Description & Chr(34)
    
                Resume exitHandler
    
    End Sub
    

    感谢您将此作为新问题发布。如果我继续修改第一个问题中的原始代码,其他人阅读您的原始帖子时将不会有用。

    @SiddharthRout-虽然SaveCopyAs在某些情况下是一个简洁的解决方案,但它不符合OPs要求。他正在运行VBA,但希望该文件保存为XLSX文件。您可以使用SaveCopyAs执行此操作,但打开该文件时会出错。这就是为什么我建议(更长/更复杂的)开放原始和封闭当前方法。你好,IanThanks,非常感谢亲爱的EyePeaSea。你在vba方面真的很棒。我希望我能像你在vba一样熟练。亲爱的EyePeaSea我希望在excel工作表中再添加一个按钮,以便在按下时清除某些特定单元格的内容。例如,我在excel工作表中添加了“清除”按钮,我希望当我按下它时,它应该清除单元格编号I1、H8、F10、F13、F14、H16的内容。它应该只清除这些单元格的值,而不是格式、公式或条件格式(如果有)。请帮帮我…谢谢…嗨,拉姆吉。很高兴我能再次帮上忙。首先,如果你对我的答案感到满意,请将其标记为已接受(我回复中的勾号图标)。至于你的新问题,我很乐意回答,但同样,请将此作为一个问题发布。Stackoverflow的工作原理是帮助每个人找到问题/解决方案,当不同的问题分别发布时,这会更容易。你好,亲爱的EyePeaSea谢谢你的回复。我已经把你的回答标为接受。记住你的建议,我要问一个新问题。我希望你能再次帮助我。非常感谢,先生……亲爱的EyePeaSea,它不会让我问更多的问题,也不会说我已经达到了问题的极限。请帮忙……现在再试一次。如果它不起作用,那么请阅读本文:-您可能需要等待,然后才能发布问题。您需要的VBA行的一个示例是工作表(ActiveSheet.Name).Range(“h8”).ClearContents-ClearContents就是这样做的。清除将清除内容和格式。如果你能很快再次发布一个“问题”,那么我将发布一段适当的代码。然而,我不能在这些评论中继续回答,因为它们非常有限。