使用VBA在Excel中创建一个项目更新跟踪器

用VBA在Excel中创建项目更新跟踪器

三个简单步骤来跟踪项目更新并记录在Excel中

通常情况下,我们在工作中参与多个项目。每个项目都包含其中的几个任务或子任务。跟踪这些任务和项目的状态是项目管理的良好实践。这些项目任务或更新可以用于我们的知识,也可以在项目会议期间共享信息。市场上有不同的免费或商业项目管理工具,它们有类似的目的。然而,我想使用Visual Basic Applications(VBA)创建一个简单的基于Excel的工具来使用。

VBA的功能非常广泛。它可以用于自动化数据处理、数据分析和数据可视化。这使得在Excel中处理和处理大型数据集非常方便。关于VBA的一个事实是,与Python中的不同包类似,VBA代码库不会定期更新。它可以在不同的环境中被视为优点或缺点。然而,其中一个优点是,一旦你学会了VBA,你可以在将来使用相同的知识。你不需要随时更新VBA的新版本或新功能,因为除非Microsoft决定引入新功能,否则没有(除非Microsoft决定引入新功能)。

在我的之前的一篇文章中,我使用了VBA进行时间序列重采样。

通过Excel VBA运行Python ——时间序列重采样案例

使用VBA、使用Python和使用Python通过……对太阳辐照度的时间序列重采样进行全面评估

towardsdatascience.com

在这篇文章中,我将分享我如何使用Visual Basic Applications(VBA)在Excel中创建一个简单的项目更新跟踪工具,只需三个简单的步骤即可。让我们开始吧。

Image by Brands&People on Unsplash.

目标

我的目标是创建一个用于跟踪项目更新和记录它们的应用程序。我希望有一个工作表,在其中为项目中的每个新更新输入信息。我还希望跟踪我记录此信息的时间。只需点击一个按钮,我希望将每个新的更新及其记录时间移动到一个单独的工作表中以记录这些信息。

为此,我创建了一个包含两个不同工作表的Excel文件。第一个工作表名为ProjectTasksTracker,第二个工作表名为Logbook。这两个工作表都包含相同的标题行,包含六列:日期时间、项目、任务、负责人、状态和更新。

我在Excel的日期时间列中使用了=NOW()函数来获取实时时间。在状态列的下拉菜单中,我允许选择三个选项:开始、进行中和完成。我还创建了一个名为Update Logbook的按钮,以在Logbook工作表中自动记录所有信息,避免重复。ProjectTasksTracker工作表如下所示:

Structure of ProjectTasksTracker sheet. Illustration by Author.

编码步骤

我首先创建了一个VBA模块中的子程序。

  1. 第一步是为文件定义工作簿对象wb,以及两个工作表对象ws1ws2,分别用于ProjectTasksTracker工作表和Logbook工作表。代码如下所示:
'Define workbook and two worksheets.Dim wb As WorkbookDim ws1 As Worksheet 'Project tracker worksheetDim ws2 As Worksheet 'Logbook worksheetSet wb = ThisWorkbookSet ws1 = ThisWorkbook.Sheets("ProjectTasksTracker")Set ws2 = ThisWorkbook.Sheets("Logbook")

2. 第二步是编写代码来计算两个工作表中的行数和列数。这也可以手动完成。然而,由于输入项目更新时行数可能会改变,因此需要更新此过程。列数保持不变(为6)以保持两个工作表的结构一致。但是,为了演示目的,也进行了编码。

在下面的代码片段中,lr1 根据列 A 在工作表 ws1 中计算行数。 lc1 根据第一行计算同一工作表中的列数。

'Count the number of rows and columns in ProjectTasksTracker sheetDim lr1, lc1 As Integerlr1 = ws1.Cells(Rows.Count, “A”).End(xlUp).Row lc1 = ws1.Cells(1, Columns.Count).End(xlToLeft).Column 

注意:在使用宏时,可以使用特定单元格的引用。这在使用可能发生更改的数据集时非常有用。例如,我创建了一个名为Updates的命名区域,用于引用 ProjectTasksTracker 工作表中的 F1 单元格。如果在它之前添加了一列,则 Updates 将引用 G1 单元格。

在下面的代码中,Updates 命名区域使用 update_cell 引用,它所属的列号使用 update_column 引用,并且根据字母表中的顺序给出列号使用 update_col

Dim update_cell As RangeSet update_cell = ws1.Range(“Updates”)Dim update_column As Integerupdate_column = update_cell.ColumnDim update_col As Stringupdate_col = Chr(update_column + 64)MsgBox "Update column belongs to: Column " & update_col
MsgBox to display location reference of Updates based on the code above. Illustration by Author.

在下一步的代码中,我们将直接使用列号为6的 Updates 列以方便操作。

3. 第三步是这个过程中最重要的一步。在这一步中,我循环遍历了 ProjectTasksTracker 工作表中的每一行(不包括标题行和 Datetime 列),并执行了以下操作,分为三个子步骤:

a. 对于 ProjectTasksTracker 工作表中的每一行,我检查了每个任务的 Updates 列是否为空。如果 ProjectTasksTracker 中的特定行有更新,则我计算了 Logbook 工作表中的行数,并将该计数分配给名为 lr2 的整数。此外,我声明了一个名为 valuesMatch 的布尔数据类型,并将其默认值设置为 False。

b. 接下来,我创建了一个嵌套循环,循环遍历 Logbook 工作表中的每一行,并检查 ProjectTasksTracker 工作表中每一列的内容(定义为范围 rg1)是否与 Logbook 工作表中的任何一行的每一列的内容(定义为范围 rg2)匹配。如果 rg1rg2 之间没有匹配,那么意味着 ProjectTasksTracker 工作表中的特定行的更新尚未记录在 Logbook 工作表中。此时,valuesMatch 保持为 False。如果 ProjectTasksTracker 工作表中的某一行的内容与 Logbook 工作表中的任何一行匹配,则表示该行已经记录过。在这种情况下,valuesMatch 的值将更改为 True。

c. 如果两个 for 循环结束时 valuesMatch 为 True,则不会进行进一步处理。如果两个 for 循环结束时 valuesMatch 为 False,则会将 ProjectTasksTracker 工作表中的行(包括 Datetime 列)复制并粘贴到 Logbook 工作表中。

步骤3a、b和c已在下面的代码片段中编码:

演示

下图显示了截至2023年8月20日23:32的ProjectTasksTracker表中的更新。

截至2023年8月29日的ProjectTasksTracker表的初始视图。作者插图。

这些更新已在同一天2023年8月20日记录在Logbook表中,如下所示。

截至2023年8月20日的Logbook表中的更新。作者插图。

接下来,在2023年8月29日23:38,我在ProjectTasksTracker表中进行了一些更改,这些更改以红色高亮显示(对前两行进行了更改并添加了最后一行)。然后,我点击了“更新Logbook”按钮,该按钮与上面“编码步骤”部分中描述的宏相关联。

截至2023年8月29日的ProjectTasksTracker表中的更改。作者插图。

这些新更改然后被记录在Logbook表中。底部以红色高亮显示的行是2023年8月29日的更改。之前记录的其他更新保持不变。

新的更新被记录在Logbook表中。之前的更新保持不变。

结论

在本文中,我描述了一些编码步骤,以在Excel中创建一个简单的跟踪器,用于输入项目任务更新并记录它们。如果在ProjectTasksTracker表中进行了某些更改或添加,并运行宏,这将将这些更新复制并粘贴到Logbook表中。然而,如果在ProjectTasksTracker中没有更改,点击按钮后两个表中的更新将保持不变。

还可以创建其他功能,例如按特定顺序对Logbook表中的行进行排序。还可以创建一个新文件来记录项目更新,而不是将它们记录在同一Excel文件的单独表中。在这种情况下,需要在代码中重新定义工作簿和工作表的目标。为了保持简单,这些步骤未包含在本文中。本文中使用的代码和启用宏的Excel文件可在GitHub存储库中获得。谢谢阅读!