【问题标题】:Changing Dates in VBA在 VBA 中更改日期
【发布时间】:2018-10-16 15:02:24
【问题描述】:

我正在尝试自动替换工作表。目前我有多个标题为“JAN 18”、“FEB 18”、“MAR 18”等的工作表。我有一个在宏运行之前启动的用户表单。我可以输入新的一年(即:2019),但是代码继续显示我的表格年份“18”。就像进入用户表单的条目不起作用。我正在使用的脚本利用 case 语句来选择具有上一年的所需文件并将其替换为当前年份。

Sub NewFiscalYear()

Dim ws As Worksheet
Dim PrevYear As Integer
Dim FormYear As Integer

FormYear = Format(Date, "yy")
PrevYear = FormYear - 1

'Disabling Display Alerts
Application.DisplayAlerts = False
Application.ScreenUpdating = False

    'Changing FY Date on Forms
     If FormMonth = "AUG" Then

        For Each ws In Worksheets
            Select Case ws.Name
                Case "JAN " & PrevYear, "FEB " & PrevYear, "MAR " & PrevYear, "APR " & PrevYear, _
                "MAY " & PrevYear, "JUN " & PrevYear, "JUL " & PrevYear, "AUG " & PrevYear, _
                "SEP " & PrevYear, "OCT " & PrevYear, "NOV " & PrevYear, "DEC " & PrevYear
                    ws.Name = "ws.name " & FormYear
            End Select
        Next
    End If

我正在编写一份大型报告,该报告从多个其他工作簿中收集信息。我的用户表单包括一个输入日期(FormYear)和一个通过组合框(FormMonth)选择的月份。一旦选择了这些,就会运行宏。我的报告工作得很好,但是在新的财政年度遇到了麻烦。

***** 我的目标是让用户在新财政年度的第一个月运行报告,希望他们不会注意到任何变化(除了看起来像一个全新的工作表)。选项卡指示在运行宏之前选择的当前月份以及在用户窗体中选择的会计年度。一旦标签被识别为新年,我将使用空白数据检查并重置所有表格。我希望这能让事情更清楚一点!*****

任何提示或技巧将不胜感激!

【问题讨论】:

  • 在您的案例陈述中,您正在寻找工作表名称上的 JAN,但您的工作表名称是 JAN 18,因此您从未真正遇到任何案例陈述。使用 left 函数提取 3 个字符。
  • 什么是FormMonth
  • 大概,FormMonth 是 Userform 上的一个字段?
  • @Comintern 感谢您的帮助!我现在正在调整事情。 FormMonth 是一个组合框选项,在启动工作簿时出现在用户窗体上。我有这本工作簿来自各种来源,FormMonth(JAN、FEB、MAR 等)主要用作字符串来引用文本以打开和引用其他工作簿。我每月运行一次报告,这只是引用了我将处理的月份。

标签: excel vba


【解决方案1】:

你的重命名行全错了:

ws.Name = "ws.name " & FormYear

这会尝试将“JAN 18”更改为“ws.name 19”,因为您已将对象括在引号中。

即使你的引号是对的:

    ws.Name = ws.name & " " & FormYear

它将“JAN 18”更改为“JAN 18 19”


试试:

ws.Name = Replace(ws.Name, PrevYear, FormYear)

编辑

另外,我认为您的 PrevYear/FormYear 可能不正确。

我会选择:

PrevYear = Format(Date, "yy") ' so this is the current year value
FormYear = PrevYear + 1       ' this becomes next year value

【讨论】:

  • 这是有道理的。一段时间后事情往往会一起运行!
【解决方案2】:

FormYear = Format(Date, "yy") 将返回 18,直到 2019 年 1 月 1 日时钟滚动。

如果您需要获得19现在,您需要:

FormYear = CInt(Format(Date, "yy")) + 1

FormYear = CInt(Format(DateAdd("yyyy", 1, Date),"yy"))


经过进一步澄清,这应该可以满足您的需求:

Sub NewFiscalYear()

  Dim ws As Worksheet
  Dim PrevYear As Integer
  Dim FormYear As String

  FormYear = CInt(Format(Date, "yy"))
  PrevYear = CStr(FormYear - 1)

注意从字符串到整数的显式转换。 VBA 会为您执行此操作,但这样您(和其他所有人)都知道这是故意的

'remove these lines until everything works fine
  'Disabling Display Alerts
'  Application.DisplayAlerts = False
'  Application.ScreenUpdating = False

在这里声明一个常数,这样你就知道为什么会有这个“神奇的值”了。 知道那是财政年度的开始,但 5 年后,当这种情况发生变化时,其他人可能不知道为什么这不再起作用,也没有意识到财政年度的开始发生了变化。 p>

  Const FISCAL_YEAR_START_MONTH as String = "AUG"
  'Changing FY Date on Forms
  If FormMonth = FISCAL_YEAR_START_MONTH Then

    For Each ws In Worksheets
      Select Case ws.Name
        Case "JAN " & PrevYear, "FEB " & PrevYear, "MAR " & PrevYear, "APR " & PrevYear, _
             "MAY " & PrevYear, "JUN " & PrevYear, "JUL " & PrevYear, "AUG " & PrevYear, _
             "SEP " & PrevYear, "OCT " & PrevYear, "NOV " & PrevYear, "DEC " & PrevYear

找到命名模式与您要查找的内容匹配的工作表后,提取前 3 个字符(月份名称)并将新年附加到其末尾。

          ws.Name = Left(ws.Name, 3) & " " & CStr(FormYear)
      End Select
    Next
  End If

'disabled them earlier, make sure we reenable them now
'doesn't hurt to enable them if they weren't disabled earlier
  Application.DisplayAlerts = True
  Application.ScreenUpdating = True
End Sub

【讨论】:

  • 感谢您的提示!这是否意味着到 2019 年 1 月 1 日,我需要修改代码以保留在 2019 年,以免拖到 2020 年?
  • 我认为它会将第一张表重命名为ws.name 19 并为下一张(同名)抛出错误
  • 这取决于您运行此程序的频率...基于If FormMonth = "AUG" Then,您似乎只想在 8 月运行时重命名工作表 - 您需要逻辑来防止其他月份执行。您还可以检查工作表名称是否与“今年”日期匹配 - 如果是,请不要理会它们,如果不更改它们。
  • @CLR - 它工作很好,一旦找到匹配的工作表名称它就不会任何事情。
  • @DerekHarden - 如果您 edited 您的 OP 更详细地描述您对这项工作的设想,也许会对每个人都有帮助。
猜你喜欢
  • 2021-06-05
  • 1970-01-01
  • 1970-01-01
  • 2015-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-15
  • 2019-07-26
相关资源
最近更新 更多