【发布时间】:2019-04-27 08:39:01
【问题描述】:
我正在尝试自动化将来自不同文件的季度数据编译到单个 Excel 工作簿中的过程(这需要在每个季度完成)。现在我已经到了一个地步,我想知道是否应该将所有代码保留在主子程序中,或者是否应该使用函数。我真的很想听听那些使用 VBA 超过几个月的人的意见,并了解如何编写高效且可读的代码。
我的代码需要做的第一件事是获取三个与日期/日期相关的变量:
- 当前年份,如果是第四季度数据,则为前一年
- 根据季度,一个如下所示的变量:12.31.2018 表示 2018 年第四季度;对于 2019 年第一季度,它将是 03.31.2019。它是保存相关文件的子文件夹名称。
- 季度,即 Q1、Q2、Q3 或 Q4。
请参阅下面的代码,如果有什么引起您的注意,请改进它。具体来说,我想知道如何命名我的变量(如果你有一个存储年份的变量,你会怎么称呼它?)。另外,Case Else 不是必需的,对吧?我的意思是month(Date) 只能是 12 个月之一。
Sub DetermineDate()
Dim qVar As String
Dim yVar As Integer
Dim fullDate As String
yVar = Year(Date) 'set value here or each time in case statement?
Select Case month(Date)
Case 1, 2, 3
qVar = "Q4"
yVar = Year(Date) - 1
fullDate = "12.31." & yVar
Case 4, 5, 6
qVar = "Q1"
fullDate = "03.31." & yVar
Case 7, 8, 9
qVar = "Q2"
fullDate = "06.30." & yVar
Case 10, 11, 12
qVar = "Q3"
fullDate = "09.30." & yVar
Case Else
MsgBox "Error"
Exit Sub
End Select
End Sub
但是,我的问题是:有什么理由不把它放在主子目录中吗?我有一个想法,那就是在主子代码中关注代码的核心(复制粘贴所有数据)会很好。所以我觉得将代码确定日期放在单独的函数中是有意义的。但是,我发现返回多个值并不简单,也不是函数的意图。另外,我只会调用这个函数一次,所以经过一番思考,我得出了结论,把它放在其他地方可能没有意义。基本上我问的是使用函数和多个潜艇时什么是好的做法。
【问题讨论】:
-
代码可重用性是其中的重要组成部分。如果你发现自己编写了相同的代码部分,基本上做同样的事情,请将其参数化并将其放入一个函数中,以便再次使用它。这是一般的编程最佳实践。它还有很多其他功能,但它是一个主要组成部分。
-
在 VBA 中返回多个值很简单。您可以使用数组、集合/字典、用户定义的类型或对象。
-
@Freeflow 我将如何决定在这里使用哪一个?
-
简单。为什么我不使用对象?
标签: excel vba readability code-readability