【问题标题】:Excel VBA - create column names using MS Project headersExcel VBA - 使用 MS Project 标题创建列名
【发布时间】:2017-10-26 05:08:22
【问题描述】:

我正在编写一个脚本,该脚本使用 MS Project 文件中的数据填充 Excel 电子表格。我希望脚本能够识别 MS Project 列的标题名称,因为我有许多具有不同名称的自定义列(自定义数字字段填充有不同的名称)

下面的代码是我的尝试,但是在将任务列标题的值写入工作表时出现错误,我在这里做错了吗?

Sub PopulateSheet()
Dim Proj             As MSProject.Application
Dim NewProj          As MSProject.Project
Dim t                As MSProject.Task        

Dim xl as workbook
Dim s as worksheet
Dim Newsheet as worksheet

Set Xl = ThisWorkbook
BookNam = Xl.Name
Set Newsheet = Xl.Worksheets.Add

'Code to find and open project files
Set Proj = New MSProject.Application
MsgBox ("Please Select MS Project File for Quality Checking")

'Select Project File
FileOpenType = Application.GetOpenFilename( _
               FileFilter:="MS Project Files (*.mpp), *.mpp", _
               Title:="Select MS Project file", _
               MultiSelect:=False)

'Detect if File is selected, if not then stop code
If FileOpenType = False Then
    MsgBox ("You Havent Selected a File")
    Exit Sub
End If

'Write the FileOpenType variant to two separate strings
NewProjFilePath = Left$(FileOpenType, InStrRev(FileOpenType, "\"))
NewProjFileName = Mid$(FileOpenType, InStrRev(FileOpenType, "\") + 1)       

Newsheet.Name = NewProjFileName
Set s = Newsheet

'Populate spreadsheet header row with column titles from MS Project
s.Range("A1").Value = t.Number1  ***<-- Error '91' - Object variable or With block variable not set***

End Sub

【问题讨论】:

  • 您在代码中的哪个位置设置了 t ?比如你可以使用Set t = ActiveCell.Task,然后读取t.Number1的值
  • 我按照你的建议做了,它用任务的内容而不是列标题填充了单元格。也许我使用了不正确的对象?
  • 你读过我的答案和代码deblow吗?它是否按您的预期工作?
  • 我试过了,它没有返回 MS Project 中列标题的名称,而是返回列行中的值,所以它不是我要找的。​​span>
  • 你试过我下面的代码了吗?整个?将其复制到新模块中,看看它是否按预期工作

标签: excel vba ms-project


【解决方案1】:

这里是循环遍历活动任务表中的字段并打印出表中显示的字段标题的通用代码。

Sub GetTaskTableHeaders()

    Dim t As Table
    Set t = ActiveProject.TaskTables(ActiveProject.CurrentTable)
    Dim f As TableField
    For Each f In t.TableFields
        If f.Field > 0 Then
            Dim header As String
            Dim custom As String
            custom = Application.CustomFieldGetName(f.Field)
            If Len(f.Title) > 0 Then
                header = f.Title
            ElseIf Len(custom) > 0 Then
                header = custom
            Else
                header = Application.FieldConstantToFieldName(f.Field)
            End If
            Debug.Print "Field " & f.Index, header
        End If
    Next f

End Sub

请注意,可以在项目级别自定义字段以赋予不同的标题,也可以在表格级别自定义字段。此代码查找这两个自定义项,如果都没有找到,则使用字段名称。

【讨论】:

    【解决方案2】:

    试试下面的代码,代码的 cmets 里面有解释:

    Option Explicit
    
    Sub PopulateSheet()
    
    Dim Proj                As MSProject.Application
    Dim NewProj             As MSProject.Project
    Dim PjTableField        As MSProject.TableField   ' New Object
    Dim PjTaskTable         As MSProject.Table  ' New Object
    Dim t                   As MSProject.task
    
    Dim xl As Workbook
    Dim s As Worksheet
    Dim Newsheet As Worksheet
    Dim BookName As String
    Dim FileOpenType
    Dim NewProjFilePath As String, NewProjFileName As String
    
    Set xl = ThisWorkbook
    BookName = xl.Name
    Set Newsheet = xl.Worksheets.Add
    
    'Code to find and open project files
    Set Proj = New MSProject.Application
    MsgBox ("Please Select MS Project File for Quality Checking")
    
    'Select Project File
    FileOpenType = Application.GetOpenFilename( _
                   FileFilter:="MS Project Files (*.mpp), *.mpp", _
                   Title:="Select MS Project file", _
                   MultiSelect:=False)
    
    'Detect if File is selected, if not then stop code
    If FileOpenType = False Then
        MsgBox ("You Havent Selected a File")
        Exit Sub
    End If
    
    'Write the FileOpenType variant to two separate strings
    NewProjFilePath = Left$(FileOpenType, InStrRev(FileOpenType, "\"))
    NewProjFileName = Mid$(FileOpenType, InStrRev(FileOpenType, "\") + 1)
    
    Newsheet.Name = NewProjFileName
    Set s = Newsheet
    
    ' Open MS-Project File
    Proj.FileOpen NewProjFilePath & NewProjFileName
    Set NewProj = Proj.ActiveProject
    
    
    ' ===== New code Section =====
    
    ' set the Table object
    Set PjTaskTable = NewProj.TaskTables(NewProj.CurrentTable)
    
    ' loop through all tablefields in table
    For Each PjTableField In PjTaskTable.TableFields
        If PjTableField.Field = pjTaskNumber1 Then ' check if currect field numeric value equals the numeric value of "Number1"
            'Populate spreadsheet header row with column titles from MS Project
            s.Range("A1").Value = PjTableField.Title ' populate "A1" with the field's title and
        End If
    Next PjTableField
    
    End Sub
    

    【讨论】:

      猜你喜欢
      • 2017-10-26
      • 1970-01-01
      • 2017-11-21
      • 2022-07-17
      • 2016-10-01
      • 2021-07-23
      • 2016-09-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多