【问题标题】:Data Validation for creating folders创建文件夹的数据验证
【发布时间】:2020-01-20 16:52:19
【问题描述】:

公司向客户发送发票。我创建了一个宏,它将客户的发票放入他们的文件夹中,存储在该发票的创建年份之下。

鉴于现在是 2020 年 1 月,发票将存储在 2020 文件夹下,然后按客户名称存储。

一旦 2020 年结束并且尚未创建 2021 年文件夹,我当前的代码是否会妥善处理这个问题?

代码确定客户端文件夹是否已存在,以及是否没有在当前年份下创建以该客户端名称作为文件夹的文件夹。

我假设在接下来的几年中会出现某种类型的错误,因为这些文件夹尚未创建。
我希望它不会出错,而是转到ErrorHandlerCreateNewYearFolder,以创建文件夹路径、当年的新文件夹和客户的新文件夹。

If fdObj.FolderExists("C:\Users\" & strInvoiceYear & "\ " & GroupID) Then 'if the Clients folder already exists....
    Call EmailClient((EmailValue), (GroupID)) '...then the necessary data required is already availiable, so it calls to the EmailClient sub function
Else
        
    On Error GoTo ErrorHandlerCreateNewYearFolder ' In the occation of a potential error, the code below will skip the run time error and try its best to handle this
    fdObj.CreateFolder ("C:\Users\" & strInvoiceYear & "\ " & GroupID)
    Exit Sub
    ' INSIGHT: THE LINE OF CODE BELOW CREATES A FOLDER THAT CONTAINS THE GROUPID OF A CLIENT WITHIN THAT YEAR. SO GIVEN THAT THE CURRENT YEAR IS 2020, IT WILL STORE ALL INVOICES WITHIN THAT FOLDER
    ' HOWEVER, THERE IS NO CURRENT 2021,2020, ETC FOLDERS, SO THIS LINE OF CODE WILL BE UNABLE TO DETERMINE THE CORRECT PATH OF strInvoiceYear BECAUSE THIS VARIABLE'S (THAT CURRENT YEAR) FOLDER HAS
    ' YET TO HAVE BEEN CREATED. SO THERE MAY BE A RUN TIME ERROR. HOWEVER, THIS CODE BELOW SHOULD HELP OVERCOME THIS POTENTIAL ISSUE
        
ErrorHandlerCreateNewYearFolder: 'THIS IS AN ERROR HANDLER, SO IF THE NEW YEAR STARTS, LIKE 2021, AND NO 2021 FOLDER HAS BEEN CREATED, THE PROGRAM WILL GO HERE
    fdObj.CreateFolder ("C:\Users\" & strInvoiceYear)  ' IN WHICH THE PROGRAM WILL THEN CREATE THE NEW YEAR FOLDER
    fdObj.CreateFolder ("C:\Users\" & strInvoiceYear & "\ " & GroupID) ' AND THEN CREATE THE NEW CLIENT FOLDER OF THAT YEAR
    Resume Next
        
    MsgBox ("Folder created successfully."), vbInformation ' notifies user that a new folder has been created for the client
    Call EmailClient((EmailValue), (GroupID)) ' This then calls to the EmailClient sub function where the data from that client will then be emailed to them
End If

【问题讨论】:

  • 你的程序有太多的责任。将代码移动到较小的过程范围(根据需要传递参数),这样您就可以限制它失败的原因。负责创建新年文件夹的东西不应该同时负责发送电子邮件或弹出任何消息框。

标签: excel vba error-handling


【解决方案1】:

我认为这里不需要错误处理程序。这很简单。

我把Call 拉出来了。无论如何,我们都会调用EmailClient,因此您不必将其嵌套在条件中。相反,运行您的检查,必要时创建文件夹,然后使用您所拥有的调用EmailClient

您的第一个条件检查文件夹是否存在。如果是这样,那就太好了,不再需要条件。如果没有,它的父母会吗?如果答案是否定的,那就去做吧。如果答案是肯定的,那就做孩子。然后发送。

If fdObj.FolderExists("C:\Users\" & strInvoiceYear & "\ " & GroupID) = True Then

'Check if the parent folder exists (returns true if it doesn't)
ElseIf fdObj.FolderExists("C:\Users\" & strInvoiceYear) = False Then
    'Create parent
    fdObj.CreateFolder ("C:\Users\" & strInvoiceYear)
    'Create group folder
    fdObj.CreateFolder ("C:\Users\" & strInvoiceYear & "\ " & GroupID)
Else
    fdObj.CreateFolder ("C:\Users\" & strInvoiceYear & "\ " & GroupID)
End If

Call EmailClient((EmailValue), (GroupID))

End Sub

如果你真的想添加一个错误处理程序,我会把它放在对EmailClient 的调用之前或EmailClient 的内部。使用正确的条件格式,您在这里所做的事情应该非常简单。

另外,请注意,您的 cmets 太长了。如果它是一个简短的评论,请继续并将其粘贴在代码之后。如果是长注释,请将其放在前面,然后将更长的注释分成多行。没有人喜欢横向滚动。

理想情况下,您应该使用If Not 完全跳过第一个子句,但鉴于您提供的代码已被注释掉的数量,我想让它保持可读性。

【讨论】:

  • 感谢您的帮助。对 cme​​ts 感到抱歉,我对此还是很陌生,并感谢任何可以帮助其他帮助我的人的建议。无论出于何种原因,我从来没有真正考虑过使用决策结构来解决这个问题。鉴于我不断地对此进行测试并且偶尔会遇到运行时错误,我认为这是最好的做法。再次感谢。
  • 执行 I/O 工作足以证明在过程中进行错误处理:代码不知道当前用户有权在该位置创建该文件夹。也许用户会,也许不会。我认为向客户发送电子邮件应该是完全独立的事情。另外,神圣的括号,蝙蝠侠! Call EmailClient((EmailValue), (GroupID)) 应该只是 EmailClient EmailValue, GroupID
  • @MathieuGuindon 括号显然是我复制和粘贴他的代码的结果。如果您认为合适,请随时编辑我的帖子。此外,我对错误处理程序的评论直接响应了它最初的编写方式,它本质上是一个分支条件。我期待您的回答,看看应该如何正确编写。
  • @MathieuGuindon 我试图保持括号向下,但无论出于何种原因,我都会收到编译器错误,期望语句结束。所以我认为这是最好的选择。感谢您的帮助!
  • @GraysonG 如果省略 Call,可以省略括号
猜你喜欢
  • 2018-03-13
  • 1970-01-01
  • 1970-01-01
  • 2021-07-13
  • 2014-07-27
  • 2023-03-28
  • 2021-09-27
  • 1970-01-01
相关资源
最近更新 更多