excel - 如何在 Excel 工作簿选项卡中创建宏以打开 MS Project 并复制参考单元格
问题描述
情况:我们公司有一个未解决的问题列表,我们在试用/启动程序期间用于各个部分。该程序有自己的 Excel 文档,每个部分在该文档中都有自己的选项卡,用于显示该特定部分的运行列表。最近有人提议我们使用 MS Project 跟踪问题打开的时间。我可以从我们的 Excel 选项卡中获取信息并手动将其复制到 Project 中以显示我们想要的内容,如果它是 1:1 Excel 表到项目表,我可以让 Project 自动更新链接的源,但我们只需要 1 个项目表有时,他们需要根据工作簿的打开选项卡进行更新,因此参考会根据我们正在查看的部分而更改。
目标:我正在寻找可以基于单击运行的 Excel 和 Project 中的一个/两个的宏代码,它将 Excel 中的参考单元格复制到 Project。
因此,用户将打开 Excel 并转到他们想要在 Project 中绘制图表的部分的选项卡。然后,他们将能够单击该选项卡中的一个按钮,该按钮 1) 打开格式化的项目文件 2) 选择该 Excel 选项卡上的特定单元格以复制到项目 [例如,在 Excel 行中,BE60:BI60 将复制到第 1 行项目,BE67:BI67 到第 2 行,依此类推]。我可以很容易地从 Excel 中获取宏来打开 Project,但是我正在努力从哪里开始复制基于当前选项卡的链接源。
我已经解决的代码如下:
Sub UpdateProject()
Dim projApp As MSProject.Application
On Error Resume Next
Set projApp = GetObject(, "MSProject.Application")
If projApp Is Nothing Then
Set projApp = New MSProject.Application
End If
projApp.Visible = True
On Error GoTo 0
projApp.FileOpenEx "C:\[File Location]\[File Name].mpp"
Dim wst As Worksheet
Set wst = ActiveSheet
Dim rng As Range
Set rng = wst.Range("D60")
Dim lRow As Long
lRow = rng.Row
Do While lRow >= 60 And rng.Column = 4 And IsDate(wst.Cells(lRow, 7).Value)
Dim taskName As String
taskName = wst.Cells(lRow, 57) ' column BE
If Len(taskName) > 0 Then
' find task in project schedule
projApp.Find Field:="Name", Test:="equals", Value:=taskName
Dim t As MSProject.Task
If projApp.ActiveCell = taskName Then
Set t = projApp.ActiveCell.Task
Else ' did not find the task, so add it
Set t = projApp.ActiveProject.Tasks.Add(taskName)
End If
t.Start = wst.Cells(lRow, 59).Value ' column BG
t.Finish = wst.Cells(lRow, 60).Value ' column BH
t.ResourceNames = wst.Cells(lRow, 61).Value ' column BI
End If
' find next trial
Set rng = wst.UsedRange.Find(What:="Trial Date", After:=rng, SearchOrder:=xlByRows, SearchDirection:=xlNext)
lRow = rng.Row
Loop
End Sub
解决方案
这是从 Excel 打开 MS Project 文件并从 Excel 文件中的活动选项卡更新计划的代码。
诀窍是使用 Project Application 对象的Find方法来查找任务,然后设置Task对象变量以简化字段更新。不要费心更新Duration字段,因为它将根据 Start 和 Finish 计算。
Sub UpdateProject()
Dim projApp As MSProject.Application
On Error Resume Next
Set projApp = GetObject(, "MSProject.Application")
If projApp Is Nothing Then
Set projApp = New MSProject.Application
End If
projApp.Visible = True
On Error GoTo 0
projApp.FileOpenEx "C:\[File Location]\[File Name].mpp"
Dim wst As Worksheet
Set wst = ActiveSheet
Dim rng As Range
Set rng = wst.Range("D60")
Dim lRow As Long
lRow = rng.Row
Do While lRow >= 60 And rng.Column = 4 And IsDate(wst.Cells(lRow, 7).Value)
Dim taskName As String
taskName = wst.Cells(lRow, 57) ' column BE
If Len(taskName) > 0 Then
' find task in project schedule
projApp.Find Field:="Name", Test:="equals", Value:=taskName
Dim t As MSProject.Task
If projApp.ActiveCell = taskName Then
Set t = projApp.ActiveCell.Task
Else ' did not find the task, so add it
Set t = projApp.ActiveProject.Tasks.Add(taskName)
End If
t.Start = wst.Cells(lRow, 59).Value ' column BG
t.Finish = wst.Cells(lRow, 60).Value ' column BH
t.ResourceNames = wst.Cells(lRow, 61).Value ' column BI
End If
' find next trial
Set rng = wst.UsedRange.Find(What:="Trial Date", After:=rng, SearchOrder:=xlByRows, SearchDirection:=xlNext)
lRow = rng.Row
Loop
End Sub
推荐阅读
- javascript - 在 xslt 中将日期值转换为字符串日期格式
- angular - 为什么我在这个 HttpHeader 上出现 Angular 错误?
- html - about:blank#blocked on Link (Markdown Page)
- javascript - 单击图像图标时,请参阅 REACT.js 中的输入类型文件功能
- python-3.x - Pandas:智能创建新列
- android - 为什么我使用 SmallWidth 不适用于支持 1080x2244 像素的设备?
- javascript - 存储为 .env 变量与系统变量时字符串值的差异
- angular - Angular 7 + 路由 + 差异
- android-studio - 我在 Android Studio 3.3.2 中找不到主题编辑器
- apache - 未测量 CouchDB 响应时间统计信息