Membuat 1 spreadsheet per baris dengan MS Project


1

Saya ingin membuat skrip yang membuat satu set spreadsheet, 1 untuk setiap baris yang dipilih dalam jadwal proyek MS. Ini lebih kompleks dari apa yang saya lihat "fungsi ekspor" lakukan, karena fungsi ekspor memperlakukan file MS-Project Anda seperti tabel dan melakukan konversi tabel ke tabel.

Inilah yang saya inginkan dari fungsi:

  • untuk dapat memilih satu set tugas di MS-Project dan memicu fungsinya
  • Agar fungsi mengambil 3-5 item yang dipilih dari tugas dan menempatkannya di lokasi tertentu dalam lembar kerja Excel.
  • Idealnya, saya akan memberikannya spreadsheet template, dengan string yang mewakili tempat saya ingin data pergi.
  • Spreadsheet akan memiliki banyak tab, dan saya ingin mengatur data dalam banyak tab.
  • Setiap tugas mendapatkan spreadsheet baru di file sendiri.

Saya senang menulis fungsi untuk melakukan ini, tapi saya tidak terbiasa dengan bahasa pemrograman MS atau trik. Saya dapat dengan mudah memvisualisasikan kodesemu yang saya inginkan, saya hanya tidak tahu apakah ada API di luar sana yang akan melakukan apa yang saya inginkan.

Adakah yang memikirkan apakah yang saya inginkan itu mungkin, dan jika ya, cara terbaik untuk mendekatinya. Harap sertakan referensi ke sumber belajar, jika memungkinkan.

Jawaban:


1

Ya, ini mungkin, tapi mungkin banyak bagi seseorang yang baru mengenal pemrograman makro. Kompleksitasnya sedikit meningkat karena Anda mencoba untuk bekerja dengan excel dan proyek pada saat yang sama - tetapi semuanya benar-benar dapat dilakukan.

Tidak ada API yang sudah melakukan penyusutan ini untuk Anda, tetapi MS Office memiliki model Object Document yang sangat kaya . Salah satu sumber daya terbaik yang Anda miliki adalah kunci 'F1' Anda. Coba rekam apa yang ingin Anda lakukan dalam langkah-langkah yang sangat kecil dan modifikasi kode untuk membuatnya generik dengan tepat. Perekam dapat membantu Anda menemukan objek, metode, dan properti yang harus Anda kenal.

Objek pekerja keras utama dalam Proyek adalah objek Tugas . Di Excel itu adalah objek Range . Anda harus terbiasa dengan keduanya untuk melakukan apa yang Anda inginkan. Garis besar kasar:

  1. Mulailah dengan tugas yang Anda pilih dalam proyek
  2. Untuk setiap tugas dalam pilihan Anda:
    a. Buat buku kerja baru
    b. Dapatkan nilai yang Anda inginkan dari proyek
    c. tulis mereka ke kisaran yang sesuai di excel

Saya agak bingung pada bagian templat dari pertanyaan Anda, jadi jangan khawatir tentang hal itu dalam contoh di bawah ini, tetapi Anda dapat mendefinisikan sesuatu yang disebut Kisaran Bernama di excel. Jadi nama-nama ini dapat hidup dalam templat Anda, Anda bahkan dapat menggunakan kembali nama yang sama pada beberapa lembar (tab) jika Anda mau dan menggunakan nama-nama ini untuk menentukan di mana harus menulis data taks Anda. Misalnya, saya menulis id tugas Range("A2"), tetapi bisa jugaRange("Project_ID")

Juga, saya akan merekomendasikan memecah ini menjadi beberapa fungsi, satu untuk setiap langkah dalam garis besar Anda. Ini adalah titik awal yang sangat mendasar. Untuk menggunakan contoh ini, Anda harus membuat referensi ke definisi objek Excel dari Project. Buka IDE VBA proyek dan pilih Alat -> Referensi . Temukan entri Perpustakaan Objek Microsoft Excel XX.0 dan beri tanda centang di kotak centang. 'XX' adalah versi excel Anda. Punyaku 10, milikmu mungkin berbeda. Siapa pun yang menggunakan ini harus membuat pilihan yang sama.

Option Explicit

Sub CopyTasksToExcel()
    Dim xlApp As Excel.Application
    Dim t As Task
    Dim wb As Excel.Workbook

    Set xlApp = New Excel.Application

    For Each t In ActiveSelection.Tasks
        Set wb = CreateWorkbook(xlApp, t.Name, t.ID)
        WriteSheetHeadingOn wb
        WriteTaskOn t, wb
        wb.Close SaveChanges:=True
    Next t

    xlApp.Quit
    Set xlApp = Nothing
End Sub

Function CreateWorkbook(ByVal xlApp As Excel.Application, _
                        ByVal TaskName As String, _
                        ByVal TaskID As Long) As Excel.Workbook
    Dim wb As Excel.Workbook
    Dim fName As String


    Set wb = xlApp.Workbooks.Add            'You could specify a template here
    fName = ActiveProject.Path & "\" _
                               & TaskID & "-" _
                               & TaskName & ".xls"
    wb.SaveAs FileName:=fName

    Set CreateWorkbook = wb
    Set wb = Nothing
End Function

'Writes date from a Project Task to the provided workbook.
Sub WriteTaskOn(ByVal prjTask As Task, _
                ByVal xlWb As Excel.Workbook)
    With xlWb.Sheets(1)
        .Range("A2").Value = prjTask.ID
        .Range("B2").Value = prjTask.Name
        .Range("C2").Value = prjTask.Duration
    End With
End Sub


Sub WriteSheetHeadingOn(ByVal xlWb As Excel.Workbook)
    With xlWb.Sheets(1)
        .Range("A1").Value = "ID"
        .Range("B1").Value = "Name"
        .Range("C1").Value = "Duration"
    End With
End Sub
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.