因此,我有一大套代碼創建員工使用的工作表中的數據存檔。使這種功能的一部分被命名爲每個可用數據頁上的範圍。爲了保持數據完整性,我需要將命名的範圍對象從歸檔表複製到它的副本。命名範圍以編程方式構建,並按照預期在頁面上運行。我遇到的問題是當我歸檔工作表時。下面是我使用來處理命名的範圍對象的代碼:Excel VBA命名爲空間不足的Excel VBA指向
For Each n In OldSht.Names
NamedRangeRefersTo = n.RefersTo
NamedRange = n.Name
TrimmedName = Right(n.Name, Len(n.Name) - InStr(1, n.Name, "!", vbTextCompare))
OldSht.Names(n.Name).Delete
OldSht.Names.Add Name:=ArchiveNamedRange, RefersTo:=NamedRangeRefersTo
Next n
是從n個獲取數據的字符串用來同名對象添加到新的工作表。
我遇到的問題是,當命中範圍引用太大的範圍時,它擊中行Oldsht.Names.Add,它返回錯誤1004.我想通過它的引用範圍的大小弄亂它。我沒有找到確切的觸發原因,但是當我在大多數命名範圍中使用它時,此代碼仍然按原樣工作。在具有連接數據類型的大數據集中,這會導致一個非常大的命名範圍(解釋範圍是如何在文本中生成需要很長時間的,這是一組包含2000多行代碼的8個子函數),導致1004錯誤。
我很困惑的是爲什麼我可以構建命名範圍,使用命名範圍,並複製命名範圍沒有問題(如果我註釋掉違規行,它執行完美,但我失去了數據完整性)。但是,當我將引用的範圍轉換爲代碼值時,請刪除舊的名稱引用,然後添加一個新名稱(使用不同的名稱)併爲其指定與舊名稱相同的引文值,則可能會出現此問題。我不明白這樣做會有什麼不同,而不僅僅是複製/重命名名稱對象。不幸的是,我還沒有找到解決方法,除了在測試場景中刪除數據或使用較小數據集時,我沒有發現導致此錯誤的明確原因,我從來沒有遇到過這個問題。有沒有人有我能做什麼的想法?有沒有人有任何想法如何命名範圍可以引用一個足夠小的範圍,它可以創建,但使用其引用值來創建一個新的命名範圍可能會導致錯誤,只有當它引用一個大範圍?
我希望我可以提供一些更具體的例子,但不幸的是,擦洗足夠的敏感信息以提供完整的代碼是非常困難的,這些代碼將重現我的確切場景。任何想法將不勝感激。
其中ArchiveNamedRange被設置爲這裏要求是:
If Len(OldSht.Name) > 21 Then
ArchiveShtName = Left(OldSht.Name, 21) & DatePart("m", Date) & DatePart("d", Date) & DatePart("yyyy", Date)
Else
ArchiveShtName = OldSht.Name & DatePart("m", Date) & DatePart("d", Date) & DatePart("yyyy", Date)
End If
ArchiveNamedRange = ArchiveShtName & NameObjectName & "Test"
NameObjectName是對象的類型的只是名字,並從另一個函數傳入。我沒有與fyi這個名字有關的問題。在最極端的例子中,調試運行時的ArchiveNamedRange值是=「OutageSystemProcedureMMDDYYYYSecurityRedactionTest」,所以名稱可能會達到50,如果事情變得更瘋狂,它可能會運行60個字符,但它不會超過255或255字符限制。最終,我還沒有看到ArchiveNamedRange具有無效值。這只是一個字符串,它總是有價值的。
編輯 - 通過我的疑難解答我已經找到了我的代碼工作時NamedRangeRefersTo具有2075的長度,但是當它具有2091的長度所以2075個字符和2091個字符之間的某處是一個突破點不起作用用於將字符串分配給指定的範圍中的RefersTo:。
因此,讓我們假設2080年(或者2075年到2091年之間的任何實際情況)有一個字符限制。當我最初查找並創建這些命名範圍時,它們將被賦予一個範圍對象。當我複製作爲字符串複製的範圍。不知何故,當我將一個遠程對象傳遞給RefersTo時:它接受2080以後的字符,但是當我傳入一個字符串時它不會。鑑於這是我大量代碼中唯一的突破點,我寧願爲此尋找解決方法,而不得不重新考慮我的歸檔系統的整個概念。如果我使用範圍對象來複制命名範圍,則它們的引用將遵循舊的工作表。這意味着,當我複製名稱時,它可以是「CriticalSystemsTest1」並參考:「CriticalSystemsTest1!$ A $ 2,...」,但是一旦我將其複製並重命名歸檔工作表(現在稱爲CriticalSystems562015),則引用將調整爲「 CriticalSystems562015Test1!$ A $ 2,...「
所以我不得不復製爲一個字符串來避免這個問題(它破壞了新工作表上的數據)。我真正需要的是創造性地克服字符串上的字符限制問題。在新工作表上從頭開始重新命名的範圍也不起作用。所以我猜如果任何人有關於如何解決這個字符串大小問題的想法或者在維護命名範圍的功能的同時修剪字符串的方法,那將是驚人的。
這些名稱中的每一個都有一個工作表級別的作用域,所以也許如果在RefersTo中只使用單元格地址($ A $ 2)的方法:所以它不包含工作表引用(SheetName!),將是一個潛在的解決方案,但我還沒有想出如果這甚至是可能的。
在您發佈的代碼中是否有錯誤?你在循環中設置了'NamedRange',然後使用'ArchiveNamedRange',你可以在代碼中看到你沒有賦值的地方。如果不是錯誤,我們能否看到您設置「ArchiveNamedRange」的值? – aucuparia
編輯了包含該問題的問題。爲了清楚起見,相同的代碼在referto中使用較小的範圍。但是我使用的範圍沒有超出命名範圍的限制,這是通過我從已經存在和正在工作的範圍中拉取它的事實來舉例說明的。爲了使舊頁面命名範圍存在,這意味着它是在代碼中構建的,爲了使其工作,它不能引用比命名範圍可處理的範圍更大的範圍。所以我不確定它爲什麼失敗。 – shagans
'RefersTo'也限制爲255個字符,但如果它完全符合工作表名稱,則可以返回比該字符串更長的字符串。我會在循環中拋出一個'Debug.Print Len(n.RefersTo)'並測試。 – Comintern