2017-02-02 174 views
1

我使用Workbooks.Open方法在Excel中打開本地html文件。此方法在新工作簿中打開文件,然後將UsedRange複製到我當前的工作簿的ActiveSheet中。一切正常,除非我第一次打開Excel時,不要修改其中的任何單元格,並按下按鈕(在我的自定義加載項(xlam)中)打開此html文件。在這種情況下,該文件在當前工作表中打開。我怎樣才能實現在其他工作簿或其他工作表中打開此外部文件?這裏是我的代碼示例:用Workbook打開html文件。在新工作簿中打開allways

Dim tempWorkbook As Workbook 
Set tempWorkbook = Workbooks.Open("file:///C:/report.html") 

這段代碼打開只有當目前的活動工作表被修改的另一個工作簿的HTML文件,但如果它沒有被用戶修改之前在當前工作簿打開。

回答

0

編輯 這現在將設置恢復到原始值。

您可以告訴Excel當前工作簿沒有保存 - 強制它在打開HTML文件時保留它。下面的示例在執行此操作之前檢查它是否被稱爲Book1:

Dim savedsetting As Boolean 
Dim tempWorkbook As Workbook 
Dim curWorkbook As Workbook 

Set curWorkbook = ActiveWorkbook 
savedsetting = curWorkbook.Saved 

If curWorkbook.Name = "Book1" Then curWorkbook.Saved = False 
Set tempWorkbook = Workbooks.Open("file:///C:/report.html") 
if curWorkbook.Saved <> savedsetting then curWorkbook.Saved = savedsetting 
+0

然後,用戶永遠是提示保存原始工作簿。 – Eugene

+0

好點@Eugene - 我已經修改了代碼,立即將它放回現在。 – CLR

0

您可以使用

Dim sFile$ 
Dim tempWorkbook As Workbook 

sFile = "file:///C:/report.html" 
Set tempWorkbook = Application.Workbooks.Add(Template:=sFile) 

然後將工作簿將作爲模板打開,但仍保留原來的名字。原始文件不會被鎖定並可以移動。 在下一步中使用新名稱進行保存會很好。

如果無法將其與HTML工作(我使用XLSX測試過),那麼你就可以做到以下幾點:

Dim sFile$ 
Dim tempWorkbook As Workbook 

sFile = "file:///C:/report.html" 
Set tempWorkbook = Application.Workbooks.Add 
tempWorkbook.Activate 'Activates new workbook 
Set tempWorkbook = Application.Workbooks.Open(sFile) 'opens a file 

設置一個單獨的變量,如果新的工作簿仍然打開HTML後的空白 - 你會想關閉它然後。

0

您是否嘗試過使用Workbooks.Add方法? 如果我將它實現到我的自定義欄中並使用不同的測試文件,它將起作用。

Sub 
    Dim tempWorkbook As Workbook 
    Set tempWorkbook = Workbooks.Add("file:///C:/report.html") 
End 
+0

我也試過。沒有爲我工作。原來的'Book1'仍然關閉。 – CLR

0

我接受了@CLR答案,但實際上這個實現有一個缺點。如果用戶打開Excel初始化程序,他/她有空名爲「Book1」的工作簿。如果他/她創建另一個空的工作簿「Book2」並嘗試打開HTML文件,則在工作簿「Book1」上打開,但不在新工作簿上。所以我修改建議這樣的代碼:

打開HTML文件之前:

For i = 1 To Workbooks.Count 
    ReDim Preserve savedSettings(i) 
    savedSettings(i - 1) = Workbooks(i).Saved 
    Workbooks(i).Saved = False 
Next 

開放,複製後封閉TEMP(HTML)工作簿後:

For i = 1 To Workbooks.Count 
    Workbooks(i).Saved = savedSettings(i - 1) 
Next 

ActiveWorkbook.Saved = False