Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/17.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
Excel VBA使用短语、单元格引用和单元格中的日期命名新工作簿_Excel_Vba - Fatal编程技术网

Excel VBA使用短语、单元格引用和单元格中的日期命名新工作簿

Excel VBA使用短语、单元格引用和单元格中的日期命名新工作簿,excel,vba,Excel,Vba,我有以下生成新工作表的代码。我试图使用短语、单元格1中的内容和单元格2中的日期来命名新工作表。 单元格1将包含一些通过数据验证插入的数据(共4个选项),单元格2将有一个日期 例如: 工作表输入范围为C3。单元格1值=贸易活动、采购、销售…等 工作表输入范围C2。单元2值=2.11.2020 新工作簿的名称为“客户名称交易活动-2.11.2020” 单元格1和单元格2都将在输入工作表中 Private Sub CommandButton1_Click() Dim targetWorkbook As

我有以下生成新工作表的代码。我试图使用短语、单元格1中的内容和单元格2中的日期来命名新工作表。 单元格1将包含一些通过数据验证插入的数据(共4个选项),单元格2将有一个日期

例如: 工作表输入范围为C3。单元格1值=贸易活动、采购、销售…等

工作表输入范围C2。单元2值=2.11.2020

新工作簿的名称为“客户名称交易活动-2.11.2020”

单元格1和单元格2都将在输入工作表中

Private Sub CommandButton1_Click()
Dim targetWorkbook As Workbook
Dim sourceSheet As Worksheet
Dim formatDate As String
Dim fileName As String

Set sourceSheet = ThisWorkbook.Worksheets("Sheet1")
If sourceSheet.AutoFilterMode Then sourceSheet.AutoFilterMode = False
If ThisWorkbook.Worksheets("INPUTS").Range("C3").Value <> vbNullString Then
    formatDate = Format(Sheets("INPUTS").Range("C3"), "YYYY.MM.DD")
End If
fileName = "Name - " & ActivityName & formatDate
sourceSheet.Outline.ShowLevels ColumnLevels:=1 
sourceSheet.Range("A:M").AutoFilter Field:=12, Criteria1:="<>0"
Set targetWorkbook = Workbooks.Add
sourceSheet.UsedRange.SpecialCells(xlCellTypeVisible).Copy targetWorkbook.Worksheets(targetWorkbook.Sheets.Count).Range("A1")
targetWorkbook.Sheets("sheet1").Columns("A:AC").EntireColumn.AutoFit
targetWorkbook.SaveAs ThisWorkbook.Path & "\" & fileName & ".xlsx", FileFormat:=51
End Sub
Private子命令按钮1\u单击()
将targetWorkbook设置为工作簿
将源表设置为工作表
将格式化日期设置为字符串
将文件名设置为字符串
设置sourceSheet=ThisWorkbook.Worksheets(“Sheet1”)
如果sourceSheet.AutoFilterMode,则sourceSheet.AutoFilterMode=False
如果此工作簿.Worksheets(“INPUTS”).Range(“C3”).值为vbNullString,则
formatDate=格式(表格(“输入”).范围(“C3”),“YYYY.MM.DD”)
如果结束
fileName=“Name-”&ActivityName&formatDate
sourceSheet.Outline.ShowLevels ColumnLevels:=1
sourceSheet.Range(“A:M”)。自动筛选字段:=12,标准1:=0
设置targetWorkbook=工作簿。添加
sourceSheet.UsedRange.SpecialCells(xlCellTypeVisible)。复制targetWorkbook.Worksheets(targetWorkbook.Sheets.Count)。范围(“A1”)
targetWorkbook.Sheets(“sheet1”)。Columns(“A:AC”)。EntireClumn.AutoFit
targetWorkbook.SaveAs ThisWorkbook.Path&“\”文件名&“.xlsx”,文件格式:=51
端接头

一些需要记住的事情:

  • 尽可能地定义和重用变量
  • 试着在代码中添加注释,解释你所做的事情的目的(你未来的自我或谁将处理你的文件,都会感谢你)
  • 在代码的主要部分之间留有空格,这样更易于阅读
  • 编辑:添加了错误处理程序,用于当用户请求覆盖现有文件时单击“否”时

    代码:

    Private Sub CommandButton1_Click()
    
        Dim targetWorkbook As Workbook
        Dim sourceSheet As Worksheet
    
        Dim formatDate As String
        Dim fileName As String
    
        On Error GoTo CleanFail
    
        Set sourceSheet = ThisWorkbook.Worksheets("Sheet1")
    
        ' Remove filter
        If sourceSheet.AutoFilterMode Then sourceSheet.AutoFilterMode = False
    
        If sourceSheet.Range("F1").Value <> vbNullString Then
            formatDate = Format(sourceSheet.Range("F1").Value, "YYYY.MM.DD")
        End If
    
        ' Set the new workbook file name
        fileName = "NAME - " & formatDate
    
        ' Filter the fileNames
        sourceSheet.Range("A:C").AutoFilter Field:=2, Criteria1:="<>"
    
        ' Add new workbook and set reference
        Set targetWorkbook = Workbooks.Add
    
        ' Copy the visible fileNames in a new workbook
        sourceSheet.UsedRange.SpecialCells(xlCellTypeVisible).Copy targetWorkbook.Worksheets(targetWorkbook.Sheets.Count).Range("A1")
    
        ' Save the new workbook
        targetWorkbook.SaveAs ThisWorkbook.Path & "\" & fileName & ".csv", FileFormat:=xlCSV
    
    CleanExit:
        Exit Sub
    
    CleanFail:
        Select Case Err.Number
    
        Case 1004
            MsgBox "You cancel the process"
            Resume Next
        Case Else
            ' Do something else? handle it properly...
            MsgBox "Something went wrong..."
            Resume CleanExit
        End Select
    
    End Sub
    
    Private子命令按钮1\u单击()
    将targetWorkbook设置为工作簿
    将源表设置为工作表
    将格式化日期设置为字符串
    将文件名设置为字符串
    出错时转到CleanFail
    设置sourceSheet=ThisWorkbook.Worksheets(“Sheet1”)
    '卸下过滤器
    如果sourceSheet.AutoFilterMode,则sourceSheet.AutoFilterMode=False
    如果sourceSheet.Range(“F1”).Value为vbNullString,则
    formatDate=格式(sourceSheet.Range(“F1”).Value,“YYYY.MM.DD”)
    如果结束
    '设置新工作簿文件名
    fileName=“NAME-”格式日期(&F)
    '筛选文件名
    sourceSheet.Range(“A:C”)。自动筛选字段:=2,标准1:=“”
    '添加新工作簿并设置引用
    设置targetWorkbook=工作簿。添加
    '复制新工作簿中的可见文件名
    sourceSheet.UsedRange.SpecialCells(xlCellTypeVisible)。复制targetWorkbook.Worksheets(targetWorkbook.Sheets.Count)。范围(“A1”)
    '保存新工作簿
    targetWorkbook.SaveAs ThisWorkbook.Path&“\”文件名&“.csv”,文件格式:=xlCSV
    清洁出口:
    出口接头
    清除失败:
    选择案例错误编号
    案例1004
    MsgBox“您取消了流程”
    下一步继续
    其他情况
    “做点别的吗?妥善处理。。。
    MsgBox“出了点问题…”
    恢复清除出口
    结束选择
    端接头
    

    让我知道它是否有效

    谢谢里卡多!工作完美。我想我在尝试中丢失了.value。嗨,Ricardo,我意识到在保存报告并再次运行工具后,我收到一条消息来替换现有文件。当我点击“否”时,我得到了错误1004,应用程序定义的或对象定义的错误。此外,如果我在整个新报告窗口打开时运行该工具,则会出现错误9,主题超出范围。对这两个错误的思考?理想情况下,我想放一个消息框,说明关闭错误9打开的窗口。并找到错误1004的解决方案。嗨,我添加了错误1004的处理程序。另一个,我不知道怎么复制谢谢!似乎退出子系统正在阻止出现该错误!它可以工作。将
    thiswoolk.Name
    替换为
    Left(thiswoolk.Name,(InStrRev(thiswoolk.Name,“.”,-1,vbTextCompare)-1))