簡體   English   中英

移動或另存為 .xlsm 文件會破壞宏

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM