【问题标题】:Excel VBA Open workbook, perform actions, save as, closeExcel VBA 打开工作簿,执行操作,另存为,关闭
【发布时间】:2012-10-08 18:02:12
【问题描述】:

由于 cmet 冗长,并根据建议的答案进行了更新,此问题已被编辑。

这里要求的是模块 13;

Sub SaveInFormat()
Application.DisplayAlerts = False
Workbooks.Application.ActiveWorkbook.SaveAs Filename:="C:\Documents and Settings\jammil\Desktop\AutoFinance\ProjectControl\Data\" & Format(Date, "yyyymm") & "DB" & ".xlsx",   leFormat:=51
Application.DisplayAlerts = True
End Sub

错误处理也存在问题,我知道我做错了,但我更感兴趣的是在我开始之前修复关闭功能。这是需要一些工作的错误处理代码

Sub test()

Dim wk As String, yr As String, fname As String, fpath As String
Dim owb As Workbook

wk = ComboBox1.Value
yr = ComboBox2.Value
fname = yr & "W" & wk
fpath = "C:\Documents and Settings\jammil\Desktop\AutoFinance\ProjectControl\Data"
owb = Application.Workbooks.Open(fpath & "\" & fname)
On Error GoTo ErrorHandler:
ErrorHandler:
If MsgBox("This File Does Not Exist!", vbRetryCancel) = vbCancel Then Exit Sub Else Call Clear

'Do Some Stuff

Call Module13.SaveInFormat

owb.Close

这是您的测试代码加上我更改的文件路径和名称

【问题讨论】:

  • 好吧,我只将此视为您的问题:“总的来说,我希望我的用户表单中的按钮功能可以打开某些工作簿并执行一些操作,以某种格式保存,然后关闭或打开工作簿和显示信息。” - 这些都是单独的任务,很容易在 excel-help 或网络中获得解决方案 - 你的问题有点像“拜托,做我的工作” - 将其分解为更多与代码相关的问题.

标签: vba excel automation userform


【解决方案1】:

讨论后发布更新答案:

Option Explicit
Sub test()

    Dim wk As String, yr As String
    Dim fname As String, fpath As String
    Dim owb As Workbook

    With Application
        .DisplayAlerts = False
        .ScreenUpdating = False
        .EnableEvents = False
    End With

    wk = ComboBox1.Value
    yr = ComboBox2.Value
    fname = yr & "W" & wk
    fpath = "C:\Documents and Settings\jammil\Desktop\AutoFinance\ProjectControl\Data"

    On Error GoTo ErrorHandler
    Set owb = Application.Workbooks.Open(fpath & "\" & fname)

    'Do Some Stuff

    With owb
        .SaveAs fpath & Format(Date, "yyyymm") & "DB" & ".xlsx", 51
        .Close
    End With

    With Application
        .DisplayAlerts = True
        .ScreenUpdating = True
        .EnableEvents = True
    End With

Exit Sub
ErrorHandler: If MsgBox("This File Does Not Exist!", vbRetryCancel) = vbCancel Then

Else: Call Clear

End Sub

错误处理:

您可以尝试这样的方法来捕获特定错误:

    On Error Resume Next
    Set owb = Application.Workbooks.Open(fpath & "\" & fname)
    If Err.Number = 1004 Then
    GoTo FileNotFound
    Else
    End If

    ...
    Exit Sub
    FileNotFound: If MsgBox("This File Does Not Exist!", vbRetryCancel) = vbCancel Then

    Else: Call Clear

【讨论】:

  • 如果owb.close 已不再打开,请将其删除。如果要在保存后将其关闭,请添加另一行以引用新工作簿的名称。
  • 是的,可以应用相同的方法,例如:.SaveAs mypath & "\" & yr & mnth
  • 如果我们稍微回溯一下,您是否将oWB 声明为工作簿并将其设置为基于从组合框派生的值打开的工作簿?如果我理解您,然后对打开的此工作簿执行更多操作并将其另存为不同的文件名 (YYYYMMDB.xlsx)?如果是这样,那么您应该仍然可以使用 oWB 变量来关闭工作簿。
  • 不幸的是,这奏效了,但您仍然获得了本周英雄的地位。这没有用,但从现在到下周五,你将成为我本周的英雄,它正在 Facebook 上进行。我会开始制作奖杯什么的
  • @AlistairWeir 我没有深入查看您的代码,但我相信您希望在错误处理程序之前拥有Exit Sub。请参阅我的答案的最底部以供参考。
【解决方案2】:

我会尝试回答几个不同的问题,但我的贡献可能无法涵盖您的所有问题。也许我们中的几个人可以从中提取不同的部分。但是,此信息应该对您有所帮助。来了..

打开一个单独的文件:

ChDir "[Path here]"                          'get into the right folder here
Workbooks.Open Filename:= "[Path here]"      'include the filename in this path

'copy data into current workbook or whatever you want here

ActiveWindow.Close                          'closes out the file

打开具有指定日期的文件(如果存在):

我不确定如何搜索您的目录以查看文件是否存在,但在我的情况下,我不会费心搜索它,我只是尝试打开它并进行一些错误检查,以便如果它不存在,则显示此消息或执行 xyz。

一些常见的错误检查语句:

On Error Resume Next   'if error occurs continues on to the next line (ignores it)

ChDir "[Path here]"                         
Workbooks.Open Filename:= "[Path here]"      'try to open file here

或者(更好的选择):

如果不存在,则显示消息框或对话框 框说“文件不存在,你想创建一个新的 一个?

您很可能希望使用下面显示的GoTo ErrorHandler 来实现此目的

On Error GoTo ErrorHandler:

ChDir "[Path here]"                         
Workbooks.Open Filename:= "[Path here]"      'try to open file here

ErrorHandler:
'Display error message or any code you want to run on error here

更多关于错误处理的信息在这里:http://www.cpearson.com/excel/errorhandling.htm


另外,如果您想了解更多或需要更一般地了解 VBA,我会推荐 Siddharth Rout 的网站,他在这里有很多教程和示例代码: http://www.siddharthrout.com/vb-dot-net-and-excel/

希望这会有所帮助!


如何确保错误代码不会每次都运行的示例:

如果您在错误处理程序之前通过没有Exit Sub 的代码进行调试,您很快就会意识到错误处理程序每​​次都会运行,无论是否有错误。代码示例下方的链接显示了此问题的先前答案。

  Sub Macro

    On Error GoTo ErrorHandler:

    ChDir "[Path here]"                         
    Workbooks.Open Filename:= "[Path here]"      'try to open file here

    Exit Sub      'Code will exit BEFORE ErrorHandler if everything goes smoothly
                  'Otherwise, on error, ErrorHandler will be run

    ErrorHandler:
    'Display error message or any code you want to run on error here

  End Sub

另外,看看这个其他问题,你需要更多关于它是如何工作的参考: goto block not working VBA


【讨论】:

  • 谢谢你,很遗憾我现在要下班了,但我明天会看看这个
  • 如果尝试打开文件失败,我已使用您的错误处理来显示一条消息。不幸的是,当文件打开工作时,我仍然收到消息
  • 我赞成,因为您的错误处理为我提供了一个可以使用的平台,但由于他的深度回答和持续的帮助,我接受了@alistair weir 的回答
  • @JamesDev 您需要将 Exit [Sub,If (whatever code in)] 放在错误处理部分之前。这样代码将不会自然地运行代码,除非由于错误而被明确告知这样做。我将在上面的答案中发布示例。
  • @JamesDev 我回答了您关于每次运行的错误代码的问题。它列在我的答案的底部。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-24
  • 1970-01-01
相关资源
最近更新 更多