2016-02-29 190 views
3

我試圖通過完成一個項目來教自己的VBA,但不幸的是我已經達到了我能想出的極限。Excel VBA - 重命名命名範圍會導致無法讀取的內容錯誤?

該項目涉及一個工作簿,其中的工作表打算用作其他工作表的模板。該工作表具有多個由命名範圍引用的表格;表格和命名範圍包含單詞'模板'。

將模板工作表複製到新工作簿中七次。在複製後立即將複製的工作表重命名爲一週中的某一天。

我也需要重命名錶和命名範圍,但是當我發現如何通過用適當的星期幾取代'template'來循環和重命名錶時,我無法弄清楚如何執行相同的命名範圍。

命名的範圍開始爲:

AHSO_Tasks_Template 指表 _01_AHSO_Tasks_Monday [AHSO任務] 範圍是週一

這反映了一週的其餘六天,並反覆多次用不同的詞彙集合取代AHSO_Tasks。在上面的例子中的名稱管理器將顯示一個名爲 -

Sub Namedrangesloop() 

Dim Nm As Name 

'Loop through each named range in workbook 
For Each Nm In ActiveWorkbook.Names 

Dim oldrng As String 
oldrng = Nm.Name 

Dim rfto As String 
rfto = Nm.RefersTo 

Dim day As String 
day = Mid(rfto, InStrRev(rfto, "_") + 1, InStr(rfto, "[") - InStrRev(rfto, "_") - 1) 

Dim nwrng As String 
nwrng = Replace(oldrng, "Template", day) 

Nm.Name = nwrng 

Next Nm 

End Sub 

這不工作:

我根據包含在該表的名稱平日他們是指運行此代碼重新命名的命名範圍作爲星期一的範圍!AHSO_Tasks_Monday(所以我只想要現在改變範圍名稱具有唯一的名稱,而不是AHSO_Tasks_Template七倍)。

但是當我保存並重新打開新的工作簿,我得到的消息:

Excel中發現filename.xlsx不可讀的內容。你想恢復這個工作簿的內容嗎? (等等)。

如果我點擊是,然後我找到當我打開名稱管理器,所有命名的範圍已被刪除!我能做些什麼來改變這一點?

我確實想到了另一種方法,但我也一直在這樣做!

+0

聽起來像你的工作簿有一個問題,這與VBA無關。我沒有看到你顯示的任何代碼如何創建損壞的文件。 –

+0

如果點擊「否」會發生什麼? – findwindow

+0

好吧,這更糟糕:/我認爲約翰的權利,其他東西是腐敗的,但有趣的是它似乎隻影響命名的範圍。 – findwindow

回答

1

你在你的情況下,兩個選項...

選項1:本地工作表本地命名範圍。

在這種情況下,您命名的表格使用相同的名稱,但通過圖紙名稱進行區分。

Sunday!AHSO_TasksMonday!AHSO_Tasks

顯然,重命名,不再需要使用此選項。

選項2:重命名每個表作爲複製

您指定的表保持全球性的,但是當你爲了避免混淆複製每張紙上都被重命名。如果您的命名範圍不會應用到Tables以及

Option Explicit 

Sub CreateWeekdaySheets() 
    Dim srcWb As Workbook 
    Dim dstWb As Workbook 
    Dim tmplSh As Worksheet 
    Dim daySh As Worksheet 
    Dim weekDays() As String 
    Dim day As Variant 
    Dim tbl As ListObject 
    Dim newName As String 

    weekDays = Split("Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday", ",", , vbTextCompare) 

    Set srcWb = ThisWorkbook 
    Set dstWb = Workbooks.Add 
    Set tmplSh = srcWb.Sheets("Template") 

    For Each day In weekDays 
     tmplSh.Copy After:=dstWb.Sheets(dstWb.Sheets.Count) 
     Set daySh = ActiveSheet 
     daySh.Name = CStr(day) 
     For Each tbl In daySh.ListObjects 
      newName = Replace(tbl.Name, "Template", day, , , vbTextCompare) 
      tbl.Name = newName 
     Next tbl 
    Next day 

End Sub 

這兩個選項也應該工作。

+0

輝煌,謝謝彼得!榮譽花時間跟隨我冗長的解釋,並明白我正在嘗試做什麼。 我已經解決了這個問題,每天重複一次(但不是循環)一個尷尬和不必要的冗長的代碼,但是您的解決方案更加優雅,並且教會了我更多關於VBA的知識。 此外,通過非常輕微地調整您的代碼,我完成了我想要的事情(唯一命名範圍匹配表和Global範圍)。爲了完整起見,我會添加它作爲答案。 – TheBaffledKing

0

我拿了PeterT的解決方案,增加了一個額外的For Each/Next循環,並得到了我想要的項目部分。但他值得信任!

Sub CreateWeekdaySheets() 

Dim srcWb As Workbook 
Dim dstWb As Workbook 
Dim tmplSh As Worksheet 
Dim daySh As Worksheet 
Dim weekDays() As String 
Dim day As Variant 
Dim tbl As ListObject 
Dim newName As String 

Dim nm As Name 'Added by me 

weekDays = Split("Monday-Tuesday-Wednesday-Thursday-Friday-Saturday-Sunday", "-", , vbTextCompare) 

Set srcWb = ThisWorkbook 
Set dstWb = Workbooks.Add 
Set tmplSh = srcWb.Sheets("DSP Template") 

For Each day In weekDays 
    tmplSh.Copy After:=dstWb.Sheets(dstWb.Sheets.Count) 
    Set daySh = ActiveSheet 
    daySh.Name = CStr(day) 
    For Each tbl In daySh.ListObjects 
     newName = Replace(tbl.Name, "Template", day, , , vbTextCompare) 
     tbl.Name = newName 
    Next tbl 
    For Each nm In dstWb.Names 'Added by me 
     nm.Name = Replace(nm.Name, "Template", day) 'Added by me 
    Next nm 'Added by me 
Next day 

ActiveWindow.TabRatio = 0.7 

End Sub