在 **Foxtable** 中,可以通过以下代码实现合同期内每年包含的月数计算。Foxtable 支持 VB.NET 语法,因此我们可以利用日期函数和循环来实现。
---
### 代码实现
```vbnet
' 定义合同起止日期
Dim startDate As Date = New Date(2021, 3, 1)
Dim endDate As Date = New Date(2025, 8, 31)
' 创建一个字典来存储年份和对应的月数
Dim yearMonths As New Dictionary(Of Integer, Integer)()
' 从开始日期逐月遍历到结束日期
Dim currentDate As Date = startDate
While currentDate <= endDate
' 提取年份
Dim year As Integer = currentDate.Year
' 如果年份不在字典中,初始化为0
If Not yearMonths.ContainsKey(year) Then
yearMonths(year) = 0
End If
' 增加该年份的月数
yearMonths(year) += 1
' 跳转到下个月的第一天(确保跨年正确处理)
currentDate = currentDate.AddMonths(1)
End While
' 输出结果到表格或弹窗
Dim tbl As Table = Tables.Add("合同年度月数统计")
tbl.Cols.Add("年度", GetType(Integer))
tbl.Cols.Add("月数", GetType(Integer))
For Each kvp As KeyValuePair(Of Integer, Integer) In yearMonths
Dim row As Row = tbl.AddRow()
row("年度") = kvp.Key
row("月数") = kvp.Value
Next
' 显示结果表
tbl.Show()
```
---
### 代码说明
1. **日期处理**:
- `startDate` 和 `endDate` 定义合同起止日期。
- 使用 `currentDate.AddMonths(1)` 逐月递增,确保正确跨年。
2. **字典存储**:
- `yearMonths` 字典存储每年的月数。
- 如果某一年尚未记录,初始化该年的月数为0,然后逐月累加。
3. **结果输出**:
- 创建一个新表 `合同年度月数统计`,存储年份和对应月数。
- 遍历字典,将结果写入表格并显示。
---
### 运行结果
生成的表格如下:
| 年度 | 月数 |
|------|------|
| 2021 | 10 |
| 2022 | 12 |
| 2023 | 12 |
| 2024 | 12 |
| 2025 | 8 |
---
### 扩展说明
1. **如何运行代码**:
- 在 Foxtable 中新建一个项目,打开“代码窗口”(快捷键 `F12`)。
- 将代码粘贴到代码窗口中,点击运行(或按 `F5`)。
2. **日期格式调整**:
- 如果需要动态输入日期,可以改用以下代码:
```vbnet
Dim startDate As Date = DateInput("请输入合同开始日期(格式:yyyy-MM-dd)")
Dim endDate As Date = DateInput("请输入合同结束日期(格式:yyyy-MM-dd)")
```
3. **弹窗提示结果**:
- 如果不需要表格,可以直接弹窗显示:
```vbnet
Dim result As String = ""
For Each kvp In yearMonths
result &= kvp.Key & "年:" & kvp.Value & "个月" & vbCrLf
Next
MessageBox.Show(result, "合同年度月数统计")
```
---
### 适用场景
此方法适用于需要快速统计合同、租赁、服务期等时间段内每年包含的月数场景,尤其适合 Foxtable 用户进行轻量级数据管理。