[英]Moving or saving as .xlsm file breaks macros
我有一個.xlsm 文件,它使用一個變量,該變量使用它們的索引給出其他電子表格的名稱(它使用 GET.WORKBOOK(1))。 為了使它工作,我必須將文件保存為 a.xslm 文件。 這個文件保存在一個驅動器上並且可以工作,但是當在其他地方保存一個副本時,宏完全被破壞了,我在使用它的單元格中得到#NAMES錯誤。 我用一個較小的文件對其進行了測試,我得到了完全相同的行為。
這是保存在名稱管理器中的宏。
=REPLACE(GET.WORKBOOK(1),1,FIND("]",GET.WORKBOOK(1)),"")
我在一個小例子中對其進行了測試:一個 excel.xslm 文件和一張紙,在一個調用變量的單元格中應該給我“Sheet1”。 一旦我移動這個文件並嘗試再次調用這個宏,我就會得到#NAMES
您可以編寫一個簡短的用戶定義 function (在一個模塊中)
Option Explicit
Public Function GetWorkbookNameByIndex(Index As Long) As Variant
Application.Volatile
If Index <= ThisWorkbook.Sheets.Count Then
GetWorkbookNameByIndex = ThisWorkbook.Sheets(Index).Name
Else
GetWorkbookNameByIndex = CVErr(xlErrNA)
End If
End Function
因此,您可以將其用作公式,例如:
=GetWorkbookNameByIndex(A1)
它將返回以下內容:
圖 1:function 的結果:如果索引超出范圍,則返回
#N/A
(= 上圖中的#NV
,因為德國屏幕截圖)。
請注意,function 必須是易失的,否則如果工作表名稱發生更改,公式將不會更新。 可變函數在工作表中的每個計算上都會重新計算,因此計算負擔會更大。 不應該廣泛使用易失性函數,否則計算會顯着減慢。
如果工作表名稱被更改或工作表被刪除或移動,它是易失的這一事實將觸發更新,但如果添加新工作表則實際上不會。 因此,您需要通過按F9手動重新計算或使用NewSheet
事件:
Private Sub Workbook_NewSheet(ByVal Sh As Object)
Application.Calculate
End Sub
如果這與您相關,則與NewChart
事件相同。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.