家計簿77 のマクロ改修版のテスト中に、「移動またはコピーしようとしている数式またはシートには、移動またはコピー先のワークシートに既にある名前‘費目リスト’が含まれています。この名前を使用しますか?」というメッセージが出た。
家計簿77 では、
- 例えば 2015年用の家計簿ファイルを作る時、2014年用の家計簿から、[カード]シート、[費目]シートと [2014-12」シート(収支明細)を新しいブックにコピーしている。
- シートをコピーすると、名前の定義もコピーされる。
名前が定義してあるシートをコピーすると、その定義もコピーされると思っていたが、どうもそうではないらしい。
「シートをコピーすると、そのブックにある全ての名前の定義がコピーされる」ようだ。
と言うことは、
- 3シートをコピーしているので、名前の定義も 3回コピーされることになる。
- しかし、上図のメッセージを見るのは初めて。
“Application.ScreenUpdating = False” を入れてあるので、自動的に[はい]になっていたのかなぁ〜
し、しかし、繰り返し試行したらメッセージが出なくなった。どういうこと?
改めて新しいブックの名前の定義を見たら‥‥
- 元のブックには無い「定義」があった。(右図の2番目)
- この定義の参照範囲は、元のブックとなっていたぁ〜
ますます混乱したが、シートコピー 2回目後に、名前の定義を全て削除。その後に 3回目のシートコピーをすればよいのではないか‥‥ と思ったが、名前の定義の伏兵(非表示になっている)があり、苦労した。
結局、「[Excel] シートで非表示になっている名前の定義を消す方法」(Developers.IO)を参考に、下記モジュールで削除した。
- Public Sub DeleteNames()
- Dim objName As Object
- Dim deleteCtr As Long
- deleteCtr = 0
- For Each objName In Names
- MsgBox objName.Name & vbCrLf & objName.Visible
- If objName.Visible Then
- ActiveWorkbook.Names(objName.Name).Delete
- deleteCtr = deleteCtr + 1
- End If
- Next
- MsgBox deleteCtr & "個の名前定義を削除しました。", vbInformation
- End Sub
- .Visible が False の名前の定義を削除した時の影響がわからないので、True のみ削除した。
- .Visible が False の名前の定義を削除するには、一度、True に変えてから削除する。
それでも解決できなかった。(上図の1番目と2番目のみになる)
そこで、名前の定義を全て削除し、「エクセルの名前の定義を他のファイルにエクスポートする方法?」(教えて! goo)を参考に、一括、インポートすることで解決したかなぁ〜〜〜〜〜
- '名前の定義をインポートする。
- For Each objName In Workbooks(arg元ファイル).Names
- If objName.Visible Then
- ActiveWorkbook.Names.Add Name:=objName.Name, RefersTo:=objName
- End If
- Next
但し、ヘルプを見ても、引数の解釈ができない...
Names.Add メソッド
セル範囲の新しい名前を定義します。
構文
式.Add(Name, RefersTo, Visible, MacroType, ShortcutKey, Category, NameLocal, RefersToLocal, CategoryLocal, RefersToR1C1, RefersToR1C1Local)
式 Names オブジェクトを表す変数。
パラメーター
- Name
NameLocal パラメーターが指定されていない場合は、名前として使用する文字列を英語で指定します。名前には、スペースを含めることはできません。また、セル参照として書式を設定することもできません。- RefersTo
RefersToLocal、RefersToR1C1、および RefersToR1C1Local パラメーターが指定されていない場合は、A1 形式の表記法を使用して英語で名前の参照先を指定します。