表格

时间:2018-05-22 14:46:38

标签: vba forms textbox concatenation

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

表格应该在代码后显示:

Form as it should be displayed after code

从上面的表格中可以看出,我想将黄色,红色和绿色的框中的值写入(粘贴)到下面的列表中 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

我认为它是某种连接功能,但我坚持如何将月份转换为数字如何确保年份对应于会计年度的月份< / strong>,根据示例,2017年7月,但2018年1月,尽管财政年度框仅显示会计年度结束的年份。

有人可以帮忙吗?

非常感谢你。

1 个答案:

答案 0 :(得分:0)

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

创建一个专门用于此的函数:您获取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财政年度的第3期;给它2018-02-01又称“2018年2月”,函​​数返回"1017",因为这是2017财年的第10个周期。