Microsoft Project - 从 Excel 电子表格导入资源费率

Posted

技术标签:

【中文标题】Microsoft Project - 从 Excel 电子表格导入资源费率【英文标题】:Microsoft Project - importing resource rates from an excel spreadsheet 【发布时间】:2021-12-22 03:52:36 【问题描述】:

我收到了一份电子表格,其中列出了未来十年每个财政年度的一些资源和资源费率。每年从 5 月 1 日开始。

每个月这些费率都有可能发生变化,例如,可能有人升职,他们的费率也会发生变化。

我正在尝试找出一种方法,可以将资源费率从 Excel 电子表格导入 Microsoft Project 中的资源表,并更新资源费率表 A 以反映每个财政年度的新费率(例如未来十年)。

我知道我需要一个宏来执行此操作,但我不确定从哪里开始。导入映射似乎不起作用。

我的出发点是使用这段代码

Sub SetRateAfromEntField()

    'Declare Variables
    Dim Res As Resource

    'Loop All Resources
    For Each Res In ActiveProject.Resources
    
        'Check for Real Resource
        If Not (Res Is Nothing) Then
               
            'Set Rate Table A from Std. Rate A
            Res.CostRateTables(1).PayRates(Res.CostRateTables(1).PayRates.Count).StandardRate = Res.GetField(FieldNameToFieldConstant("Std. Rate A", pjResource))
            
        End If
           
    Next Res
    
End Sub

并假设存在已包含费率的资源自定义字段,因此我需要十个自定义字段。

但是,在我的情况下,数据位于 Excel 工作表中。每个资源都有一个唯一的参考代码 (resCode),它存在于 Excel 工作表和每个资源的资源池中。

我正在尝试找出一种方法来直接从电子表格中读取费率并定期更新资源费率。

我看到这段代码看起来很接近,但不包括对存储在 Excel 电子表格中的数据的引用,需要从中读取费率。 https://pm.stackexchange.com/questions/25019/ms-project-multi-year-inflation

总结:

未来 10 年每年的资源费率存储在电子表格中。

资源在 Excel 工作表和项目中都唯一地映射到资源代码 (resCode)。

每月需要通过运行宏导入费率来更新费率。

我们将不胜感激地收到有关如何最好地实现这一目标的任何帮助。

【问题讨论】:

一个资源是否有多个 CostRateTables,或者您是否有一个包含多个工资率和适用日期的表? 您打算在 Excel 或 MS Project 中编写 vba 代码吗? 【参考方案1】:

我相信您希望能够从这样的电子表格中导入费率:

在本例中,资源名称列在 A 列,费率生效日期列在第 1 行,费率值是资源名称和生效日期的交集。

我正在假设具有这些完全相同名称的资源存在于我要将费率导入到的 MS 项目文件的资源表中。

这是用 Excel VBA 编写的代码:

Sub ImportRatesToAProject()

    'Using late binding on MS Project objects since code is being written in Excel VBA
    Dim res As Object 'Resource
    Dim prjApp As Object

    Set prjApp = GetObject(Class:="MSProject.Application") 'late binding
    
    'Turn MS Project calculations and screen updating off to make code run faster.
    prjApp.Calculation = 0 'pjManual
    prjApp.ScreenUpdating = False
    
    For r = 2 To ActiveSheet.UsedRange.Rows.Count
        For Each res In prjApp.ActiveProject.Resources
            'Check if the resource in the project resource sheet is the same as the one in our spreadsheet.
            If Trim(ws.Cells(r, 1)) = Trim(res.Name) Then 
                'Call method to delete current rates with the same effective dates as we are going to add
                DeleteExistingRates res
                'Call method to add new rates
                AddNewRates res
                'Color the cell so we know the import occured
                ws.Cells(r, 1).Interior.Color = vbYellow
            End If
        Next res
    Next r
    
    'Turn MS Project calculations and screen updating back on
    prjApp.Calculation = -1 'pjAutomatic
    prjApp.ScreenUpdating = True

End Sub

Private Sub DeleteExistingRates(res As Object)

    If Not res Is Nothing Then
        Dim rRate As Object
        Dim pRate As Object
        Dim c As Integer
        
        Set rRate = res.CostRateTables(1)
        
        'Loop through all the payrate objects and remove the rates with the same effective dates as our new rates
        For Each pRate In rRate.PayRates
            For c = 2 To ws.UsedRange.Columns.Count
                If IsDate(ws.Cells(1, c)) Then
                    'check if effective dates are the same date
                    If Format(pRate.EffectiveDate, "mm/dd/yyyy") = Format(ws.Cells(1, c), "mm/dd/yyyy") Then
                        pRate.Delete
                    End If
                End If
            Next c
        Next pRate
    End If

End Sub

Private Sub AddNewRates(res As Object)
    
    If Not res Is Nothing Then
        Dim rRate As Object
        Dim pRate As Object
        Dim c As Integer
        
        Set rRate = res.CostRateTables(1)
        
        'Add all the new rates we want from our spreadsheet using this loop
        For c = 2 To ws.UsedRange.Columns.Count
            Set pRate = rRate.PayRates.Add(CDate(ws.Cells(1, c)), CDbl(ws.Cells(r, c))) 'parameters are the effective date and the rate
            
            'color rate cell so we know the rate was imported
            ws.Cells(r, c).Interior.Color = vbYellow
        Next c
    End If

End Sub

请注意,由于我在 Excel VBA 中编写代码,因此我使用 Late Binding(other helpful article) 来访问 MS Project 对象。

【讨论】:

以上是关于Microsoft Project - 从 Excel 电子表格导入资源费率的主要内容,如果未能解决你的问题,请参考以下文章

Microsoft Project教程_编程入门自学教程_菜鸟教程-免费教程分享

Microsoft Office Project 相关教程 收集

有用软件| Microsoft project

Microsoft Office Project是做啥的软件?

Microsoft Project Honolulu上手体验

Microsoft Project Honolulu上手体验