如何选择子项目中任务的行(在主项目内)

2024-01-15

我有一个主项目,其中有几个子项目。

我想根据字段的值格式化行的颜色Text5.

目前的问题: 如何使用VBA代码引用第二个子项目中的行。 当我运行代码并修改Text5任务 ID 5(在子项目 2 中)中的值,它修改任务 ID 5 的颜色,但修改子项目 1 的颜色。

我怎样才能使用SelectRow并添加对所需子项目的引用?

My Code(相关部分)

Sub FormatChangedTasks()

Dim SubPrj      As Subproject
Dim Tsk         As Task
Dim i           As Long

For Each SubPrj In ActiveProject.Subprojects
    ' compare the name of Sub-Project with the one saved in the "Stack" srray
    If SubPrj.SourceProject.Name = ModifiedPrjName Then
        For Each Tsk In SubPrj.SourceProject.Tasks
            If Not Tsk Is Nothing Then
                i = Tsk.ID

                ' check if Tsk.Text5 value has changed from value in "StatusStackArr" array
                If StatusStackArr(i - 1).StatusOldVal <> Tsk.Text5 Then
                    ' **** at the line below it selects the Row from the top
                    ' (not the desired Sub-Project) ******
                    SelectRow Row:=i, RowRelative:=False

                    ' --format entire row --
                    Select Case Tsk.Text5 ' Get the Field's used field, not name
                        Case "R", "Y", "G"
                            FontEx CellColor:=7, Color:=0
                            FontEx Italic:=False '  Font regular

                        Case "Complete"
                            FontEx Italic:=True '  Font Italic
                            FontEx CellColor:=15, Color:=14 ' Background Silver ; font Gray

                    End Select

               ' rest of code (un-relevant)

挑战 - 设置主项目中的行格式

要格式化表格中的文本,请使用FontEx https://msdn.microsoft.com/VBA/Project-VBA/articles/application-fontex-method-project方法。此方法格式化活动(选定)单元格。要选择一行进行格式化,请使用选择行 https://msdn.microsoft.com/en-us/vba/project-vba/articles/application-selectrow-method-project方法。要使用此方法,您需要了解:

  1. 它相对于活动选择的位置,或
  2. 其在内部的绝对位置可见任务, or
  3. 根据唯一标识符查找任务

对于选项 1 和 2,通过过滤器或折叠摘要隐藏的任务意味着SelectRow方法必须相应调整。很难知道哪些任务可能被隐藏。使用此方法的最佳方法是首先确保所有任务都是可见的(参见代码)。

此外,在处理子项目时,计算绝对行位置是一个挑战,因为首先您需要获得计划中较高位置的子项目的任务计数以及主项目本身中的任何本机任务(尽管这是非典型的)。

所有这些导致使用Find方法,选项 3,作为在主项目中选择任务的最佳方式。要准确选择正确的任务,Find 方法必须与唯一字段一起使用。唯一 ID 字段是唯一保证唯一的字段。

主项目中的唯一 ID

将任务添加到项目时,会分配一个增量唯一 ID,从 1 开始。当项目在主项目中组合时,通过添加种子值来更改唯一 ID,以便主项目中不存在重复项。

种子值基于内部子项目“索引”。第一个子项目任务的种子值为 4194304,第二个子项目任务的种子值为 8388608 (4194304 * 2),依此类推。

如果从主项目中删除子项目,则不会重新使用它的“索引”。同样,如果在主项目中重新排列子项目,“索引”值也不会更改。因此,您不能使用Index子项目对象的属性来获取用于创建种子的内部“索引”值,因为该属性仅指示子项目的顺序。 (注意,有一种方法可以获得这个内部值,但这超出了这个问题的范围。仅供参考,它还需要选择所有任务。)

Solution

要在用户界面中选择任务,您需要知道它在主计划中的唯一 ID。如果您通过以下方式访问任务SourceProject.Tasks您将访问其本机子项目中的任务的方法,并且唯一 ID 将不包含种子值。例如,唯一 ID 将为 2,这在主项目中不是唯一的,因此不足以使用 Find 方法选择任务。

由于您已经循环遍历计划中的所有任务,因此确定主唯一 ID 的最简单方法是循环遍历主项目中的本机任务。为此,请选择所有任务并循环选择。

Sub FormatChangedTasks()

' show all tasks
FilterClear
SelectAll
SummaryTasksShow (0)
OutlineShowAllTasks

Dim AllTasks As Tasks
Set AllTasks = ActiveSelection.Tasks

Dim Tsk As Task

For Each Tsk In AllTasks
    If Not Tsk Is Nothing Then
        ' compare the name of Sub-Project with the one saved in the "Stack" srray
        If Tsk.Project = ModifiedPrjName Then

            ' check if Tsk.Text5 value has changed from prior value
            ' NOTE: use a dictionary here instead of an array
            If StatusStackArr(i - 1).StatusOldVal <> Tsk.Text5 Then

                Find "Unique ID", "equals", Tsk.UniqueID
                SelectRow

                ' --format entire row --
                Select Case Tsk.Text5 ' Get the Field's used field, not name
                    Case "R", "Y", "G"
                        FontEx CellColor:=7, Color:=0
                        FontEx Italic:=False '  Font regular

                    Case "Complete"
                        FontEx Italic:=True '  Font Italic
                        FontEx CellColor:=15, Color:=14 ' Background Silver ; font Gray

                End Select

            ' rest of code (un-relevant)
        End If
    End If
Next Tsk
End Sub

Notes:

  • 选择所有任务是一项要求,除非您可以保证计划已完全展开并且您选择选项 1 或 2。对于 10-15 个子项目,选择所有任务将花费一点时间,但其余代码将在关闭时运行以相同的速度。
  • 如果任务已分组或未按任务 ID 排序,则选项 1 或 2 的所有选项均无效。
  • 将先前的值存储在按任务 ID 索引的数组中不适用于主项目。相反,应将以前的值存储在集合或字典中,并以主唯一 ID 作为键。请参阅这篇有关在 VBA 中使用字典的 SO 帖子。 https://stackoverflow.com/questions/915317/does-vba-have-dictionary-structure
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何选择子项目中任务的行(在主项目内) 的相关文章

  • 如何使用 Excel VBA 根据货币标准格式化列中的数字?

    我想格式化一列的所有单元格 数据是一个数字 我想从左边添加一个小数 之后只保留两位数 然后根据货币标准对其进行格式化 例如 Data Output 10000 100 00 112233 1 122 33 123456789 1 234 5
  • 如何修复在 Excel VBA 中使用查找函数的错误

    我尝试从另一张表中搜索值 而不是使用 FIND 函数 Private Function Search rng As Range FindString As String As Range With rng Set Search Find w
  • 将 Dir 与旧文件后缀一起使用

    最近问的一个question https stackoverflow com questions 68282702包括代码 strFilename Dir fPath xls 它 成功 用于查找以xls and xlsx 我的问题是 为什么
  • 如何从 500 个 .xls Excel 文件中的单元格中获取数据?

    我想问你如何从许多Excel中的几个确定的 并且总是相同的 单元格中获取数据 xls文件 即我有一个清单 xls文件位于一个文件夹中 每个文件内部都有相同的表 但具有不同的值 我想从以下位置获取数据A1 C2 E3从文件夹中的所有文件中提取
  • 从网站上的表格中抓取数据,而无需搜索标签

    这是这个问题的延续使用 InStr 搜索引号 空格 冒号等 https stackoverflow com questions 52673819 using instr to search for quotes spaces colons
  • 运行代码(而不是查询)时如何在状态栏上显示进度

    我已经发布了有关在 MS Access 2010 中运行查询时更新状态栏的问题 请参阅在 MS Access 中运行一系列查询时如何在状态栏上显示进度 https stackoverflow com questions 27765376 h
  • 如何在VBA编辑器中跳转到行号?

    我在 Office 2010 中使用 VBA 在顶部 有一个带有行号和列号的框 例如 Ln 1480 Col 17 有没有办法在代码编辑中 而不是在执行中 直接跳转到另一个行号 就像我使用的那样Ctrl G在记事本中 这个MSDN答案 ht
  • excel 2010刷新BackgroundQuery中运行时错误1004

    我正在尝试用 vba 编写一个脚本 用于将多个文本文件导入 Excel 一张纸 然后将它们绘制在一张图表上 我面临一个问题刷新后台查询命令并出现 1004 运行时错误 我怎样才能解决它 谢谢 埃亚勒 这是我的代码 Sub fring1 Di
  • VBA 中的多线程

    这里有人知道如何让VBA运行多线程吗 我正在使用 Excel 无法用 VBA 本地完成 VBA 构建在单线程单元中 获得多个线程的唯一方法是使用 VBA 之外的其他具有 COM 接口的东西构建 DLL 并从 VBA 调用它 信息 OLE 线
  • VBA 中 AND 函数如何工作?

    如果这是一个愚蠢的问题 我很抱歉 但是 Excel VBA AND 函数是否检查其中的每个条件然后继续 或者在第一个 FALSE 条件处停止而不检查其他条件 我想知道出于优化目的 但到目前为止在网上没有找到任何相关信息 提前致谢 示例 如果
  • VBA 中的匈牙利语好吗?

    我在 Net 中不使用匈牙利语 str int 前缀 但我仍然发现它在 VBA 中很有用 因为在 VBA 中很难看到类型 这很糟糕吗 不必要 也许我错过了一些东西 我真的很感激任何反馈 我想知道有一段时间了 谢谢大家 我想说 这种匈牙利符号
  • 输入新行并复制上面单元格中的公式

    我正在尝试创建一个 Excel 宏来执行以下操作 在文档末尾输入新行 复制上面单元格中的公式 到目前为止我有这个 Sub New Delta Go to last cell Range A4 Select Selection End xlD
  • 标志状态的 VBA 替换

    根据文档 Outlook 中的 MailItem FlagStatus 属性是已弃用 https msdn microsoft com en us library microsoft office interop outlook maili
  • 使用 FindElementbyXpath() 获取 Selenium Basic 中可填充框的行和列名称

    我正在使用 Selenium Basic 将电子表格中的文本填充到网站中 网站的html代码是这样的 div table cellspacing 0 border 1 style width 99 tr th style font weig
  • 如何在 Excel 中对“高”字符进行 HTML 编码或音译?

    在 Excel 中 如何将包含重音字符 大引号等的单元格内容转换为相同字符的 HTML 或音译纯文本版本 我们有一个 XLS 文档 其中包含一些 高 字符 数据已通过数据库连接提取 并且 Excel 似乎正确处理不同代码页中的各个单元格 或
  • 在 Excel 中自动复制和粘贴特定范围的最佳方法是什么?

    我对 VBA 非常陌生 我想自动化一项任务 但不知道从哪里开始 我有一个如下所示的数据集 样本数据 https i stack imgur com jxqFI png 我想做的是循环遍历 A 列 如果其中有内容 始终是电子邮件 请选择所有行
  • 如何从 SQL Server 存储过程返回值并在 Access VBA 中使用它们

    我已经在 SQL Server 中设置了一个运行良好的存储过程 我现在可以从 VBA 调用它 但想返回一个值以了解是否存在任何错误等 我的 SP 中的最后一个参数设置为 OUTPUT DataSetID int 0 Destination
  • 从Excel工作表中读取汉字? (总是返回“???”)

    如何从Excel单元格中读取汉字并将其写入文件 当我取值时 Worksheets ActiveCell Worksheet Name Cells 3 columnNumbers 0 value 它总是返回 Dim fileStream Fi
  • 字符串在换行符处拆分

    我在 MS Access 表单上有一个文本框 用户将从 Excel 电子表格中复制一列数字到其中 我需要获取此输入并将其用作参数来构建查询 我的代码看起来像这样 Dim data as variant Dim input as String
  • 在 Excel 中查找结果将行复制到另一张工作表

    我需要一些帮助将数据从一个 Excel 工作表复制到另一个 例如 样本数据 A B C 1 aaa bbb ddd 2 bbb ccc eee 2 bbb ccc eee 3 ccc fff rrr 4 ccc fff ttt 5 ddd

随机推荐