我正在 MS Project 中處理 VBA 腳本,其中涉及創建作業簿。但是我在定義一個范圍時做錯了,它似乎作業方式不同,因為我不在 Excel 中。
這是我當前的代碼,歸結為有問題的部分:
Dim myExcel As Object
Dim myWb As Object
Dim myRange as Object 'Not sure if I should declare this one as an object or a range
Dim myRangeString as String
Set myExcel = CreateObject("Excel.Application")
Set myWb = myExcel.Workbooks.Add
myRangeString = "$D$20, $C$23" 'For simplicity. Obviously this is not hard coded.
Set myRange = Range(myRangeString)
此代碼在 Excel 中運行良好。但在專案中,它停止并回傳“運行時錯誤'1004':物件'_Global'的方法'Range'失敗。”。也許那是因為在這種情況下“全域”是 Project 而不是 Excel。因此,我嘗試了 MyExcel.Range(myRangeString) 的不同變體,但隨后出現“應用程式定義或物件定義錯誤”。反而。
任何人都可以幫忙嗎?
uj5u.com熱心網友回復:
您的代碼使用后期系結,這意味著物件在運行時之前是未知的,并且沒有IntelliSense。使用后期系結的優點是代碼對于使用舊版 Office 的用戶可以正常運行。否則,最好是用戶早期系結。(請參閱早期和晚期裝訂。)
通過設定對 Excel 物件庫的參考來使用早期系結(在 VB 編輯器中,工具:參考,向下滾動并選中 Microsoft Excel 物件庫的框)
這是使用后期系結的代碼的作業 MS Project 示例:
Sub ExportToExcelLateBindingCellByCell()
Dim myExcel As Object
Dim myWb As Object
Set myExcel = CreateObject("Excel.Application")
myExcel.Visible = True
Set myWb = myExcel.Workbooks.Add
myWb.Worksheets(1).Range("$D$20") = ActiveCell.Task.Name
myWb.Worksheets(1).Range("$C$23") = ActiveCell.Task.ID
End Sub
使用陣列以塊的形式寫入 Excel 是一個好主意——也許這就是“$D$20, $C$23”的意圖。但是,正確的范圍語法是使用冒號,但 D20:C23 很尷尬,請改用 C20:D23。
這是一個早期系結示例,它以塊的形式寫入資料,這對于大量資料來說明顯更快。
Sub ExportToExcelEarlyBindingArray()
Dim myExcel As Excel.Application
Dim myWb As Excel.Workbook
Set myExcel = CreateObject("Excel.Application")
myExcel.Visible = True
Set myWb = myExcel.Workbooks.Add
Dim TaskInfo(4, 2) As Variant
Dim i As Integer
For i = 1 To 4
TaskInfo(i - 1, 0) = ActiveProject.Tasks(i).ID
TaskInfo(i - 1, 1) = ActiveProject.Tasks(i).Name
Next i
myWb.Worksheets(1).Range("$D$20:$C$23") = TaskInfo
End Sub
uj5u.com熱心網友回復:
在您發布答案@orange_guy 和@Rachel 時,我似乎或多或少地解決了這個問題。解決方案是使用分號(不是冒號,也不是逗號)。還是非常感謝!
uj5u.com熱心網友回復:
就像@BigBen 和@Darren 一樣,我也沒有MS Project,但我在Excel 和Outlook 中有一個類似的跨應用程式VBA 腳本,并且將“應用程式”放在之前對我來說效果很好。這是片段:
Public Sub XPTO()
Dim xExcelFile As String
Dim xExcelApp As Excel.Application
Dim xWb As Excel.Workbook
Dim xWs As Excel.Worksheet
Dim xExcelRange As Excel.Range
'Get the dimension table
xExcelFile = "C:\path\toMyFile\File.xlsm"
Set xExcelApp = CreateObject("Excel.Application")
Set xWb = xExcelApp.Workbooks.Open(xExcelFile)
Set WKB = xExcelApp.ActiveWorkbook
Set xExcelRange = xWb.Sheets("Sheet1").Range("myTable").ListObject
所以基本上我在任何變數之前都會提到應用程式。此外,可能有用的一件事是將您提到的變數(“myRangeString”)設定為物件。我不知道確切原因,但它恰好對我有用。所以而不是:
myRangeString = "$D$20, $C$23"
你會放一些類似的東西:
set myRangeString = myWb.Sheet(1).Range("$D$20, $C$23")
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/472666.html
