まりふのひと

Excel2010/名前の定義を削除する&インポートするVBA

 家計簿77 のマクロ改修版のテスト中に、「移動またはコピーしようとしている数式またはシートには、移動またはコピー先のワークシートに既にある名前‘費目リスト’が含まれています。この名前を使用しますか?」というメッセージが出た。


 家計簿77 では、

  1. 例えば 2015年用の家計簿ファイルを作る時、2014年用の家計簿から、[カード]シート、[費目]シートと [2014-12」シート(収支明細)を新しいブックにコピーしている。
  2. シートをコピーすると、名前の定義もコピーされる。
     名前が定義してあるシートをコピーすると、その定義もコピーされると思っていたが、どうもそうではないらしい。
    「シートをコピーすると、そのブックにある全ての名前の定義がコピーされる」ようだ。

と言うことは、

  • 3シートをコピーしているので、名前の定義も 3回コピーされることになる。
  • しかし、上図のメッセージを見るのは初めて。
     “Application.ScreenUpdating = False” を入れてあるので、自動的に[はい]になっていたのかなぁ〜

し、しかし、繰り返し試行したらメッセージが出なくなった。どういうこと? 

 改めて新しいブックの名前の定義を見たら‥‥

  • 元のブックには無い「定義」があった。(右図の2番目)
  • この定義の参照範囲は、元のブックとなっていたぁ〜



 ますます混乱したが、シートコピー 2回目後に、名前の定義を全て削除。その後に 3回目のシートコピーをすればよいのではないか‥‥ と思ったが、名前の定義の伏兵(非表示になっている)があり、苦労した。
結局、「[Excel] シートで非表示になっている名前の定義を消す方法」(Developers.IO)を参考に、下記モジュールで削除した。

  1. Public Sub DeleteNames()
  2. Dim objName As Object
  3. Dim deleteCtr As Long
  4.  
  5. deleteCtr = 0
  6. For Each objName In Names
  7. MsgBox objName.Name & vbCrLf & objName.Visible
  8. If objName.Visible Then
  9. ActiveWorkbook.Names(objName.Name).Delete
  10. deleteCtr = deleteCtr + 1
  11. End If
  12. Next
  13. MsgBox deleteCtr & "個の名前定義を削除しました。", vbInformation
  14.  
  15. End Sub
  • .Visible が False の名前の定義を削除した時の影響がわからないので、True のみ削除した。
  • .Visible が False の名前の定義を削除するには、一度、True に変えてから削除する。



 それでも解決できなかった。(上図の1番目と2番目のみになる)
そこで、名前の定義を全て削除し、「エクセルの名前の定義を他のファイルにエクスポートする方法?」(教えて! goo)を参考に、一括、インポートすることで解決したかなぁ〜〜〜〜〜

  1. '名前の定義をインポートする。
  2. For Each objName In Workbooks(arg元ファイル).Names
  3. If objName.Visible Then
  4. ActiveWorkbook.Names.Add Name:=objName.Name, RefersTo:=objName
  5. End If
  6. Next


但し、ヘルプを見ても、引数の解釈ができない...

Names.Add メソッド
セル範囲の新しい名前を定義します。
構文
式.Add(Name, RefersTo, Visible, MacroType, ShortcutKey, Category, NameLocal, RefersToLocal, CategoryLocal, RefersToR1C1, RefersToR1C1Local)
式 Names オブジェクトを表す変数。
パラメーター

  • Name
     NameLocal パラメーターが指定されていない場合は、名前として使用する文字列を英語で指定します。名前には、スペースを含めることはできません。また、セル参照として書式を設定することもできません。
  • RefersTo
     RefersToLocal、RefersToR1C1、および RefersToR1C1Local パラメーターが指定されていない場合は、A1 形式の表記法を使用して英語で名前の参照先を指定します。