首页 > 解决方案 > 根据表格上已有的详细信息填写 VBA 表格

问题描述

在一些应该更容易做的事情上,我再次需要你的帮助。然而,它也可能比看起来更复杂。

代码后应显示的表单:

代码后应显示的表单

从上面的表格中可以看出,我想将黄色、红色和绿色框中的值写入(粘贴)到 3 个命令框下方的列表中。

我还没有为此目的编写任何完整的代码,并且彩色图片是作为没有代码的示例完成的。

到目前为止,这是我想出的:

Private Sub CommandButton6_Click()

sMo = lstmonth
vDte = sMo & "1, " & cboyear
vMo = Month(vDte)

'set fiscal month ACTUAL year
If vMo > 4 Then vDte = DateAdd("yyyy", -1, vDte)

TextBox2 = TextBox1.Value & Format(vDte, "mmyy")
TextBox3 = "Sales Rebate Due - " & UCase(Format(vDte, "mmm yyyy"))

End Sub

我认为它是某种连接函数,但我坚持如何将月份转换为数字以及如何确保年份对应于财政年度的月份,例如,2017 年 7 月但 2018 年 1 月,尽管财政年度框仅显示财政年度结束的年份。

有人可以帮忙吗?

真的非常感谢你。

标签: vbaformstextboxconcatenation

解决方案


您不希望该逻辑隐藏在某些按钮单击逻辑中。

制作一个专用于该功能的函数:您获取一个Date参数,并返回一个代表您格式化的财政日历日期的字符串 - 您不能使用标准VBA.DateTime函数,因为这些函数在与您的不一致的“公民日历”上运行财政期间。

一种方法是使用 12 位数组来保存每个周期使用的偏移量:

Public Function GetFiscalCalendarPeriod(ByVal value As Date) As String

    Dim monthPeriods As Variant
    monthPeriods = Array(9, 10, 11, 12, 1, 2, 3, 4, 5, 6, 7, 8)

    Dim yearOffsets As Variant
    yearOffsets = Array(-1, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0)

    Dim index As Long
    index = Month(value) - 1 'implicitly sized array is 0-based

    Dim periodMonth As Long
    periodMonth = monthPeriods(index)

    Dim periodYear As Long
    periodYear = Year(value) + yearOffsets(index)

    GetFiscalCalendarPeriod = Format$(periodMonth, "00") & Right$(Format$(periodYear, "0000"), 2)

End Function

这样,您可以在任何需要该逻辑的任何日期轻松获得“会计期间”。

对于您的对话,您将采用例如2018-07-01“2018 年 7 月”,并且该函数将返回一个字符串,例如"0318",因为 2018 年 7 月是 2018 财年的第三个时期;给它2018-02-01又名“2018 年 2 月”,函数返回"1017",因为这是 2017 财年的第 10 个期间。


推荐阅读