« Microlonて効くのか?? その後1 | トップページ | 七変化(シチヘンゲ) »

2011年5月29日 (日)

TIPS : Excelの「名前」(定義済みの名前)をきれいに削除する方法

どこからか持ってきたExcelを使って作業をしていると、シートコピーとかするときに

「移動またはコピーしようとしている数式またはシートには、移動またはコピー先のワークシートに既にある名前'AAA'が含まれています。この名前を使用しますか?」

Photo

とか表示され、ひたすら「はい」をクリックする必要がある場合があります。

これは、不要な「名前」の定義が残っているためです。

回避するには、「名前」を削除すればいい・・・

Office2003_01

のですが、たまに文字化けしてしまい、消すに消せないものがあります。

下記が例。「削除」をクリックしても削除されません。。。なんなんだ?「┼┴」って。。。

Office2003_02

あるいは、定義された数が膨大すぎで、手で削除するのが疲れるとか。

そんなときには、マクロで一気に削除が吉。

1.「マクロ」を選んで、

Office2003_03

2.適当に名前をつけ(例は「hogehoge」)、「作成」をクリック。

Office2003_04

3.作成されたばかりのマクロを全選択して、

Office2003_05

4.以下のコードで上書きします。

Public Declare Function SetTimer Lib "user32.dll" _
    (ByVal hwnd As Long, ByVal nIDEvent As Long, ByVal uElapse As Long, _
    ByVal lpTimerFunc As Long) As Long
Public Declare Function KillTimer Lib "user32.dll" _
    (ByVal hwnd As Long, ByVal nIDEvent As Long) As Long
Public Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" _
    (ByVal lpClassName As String, ByVal lpWindowName As String) As Long

Sub DeleteDefinedNames()

    Dim beforeReferenceStyle As Variant
    beforeReferenceStyle = Application.ReferenceStyle

    Dim timerID As Long
    timerID = SetTimer(0, 0, 100, AddressOf TimerProc)

    If beforeReferenceStyle = xlR1C1 Then
        Application.ReferenceStyle = xlA1
    Else
        Application.ReferenceStyle = xlR1C1
    End If

    Dim n As Name
    For Each n In ActiveWorkbook.Names
        If Not n.Name Like "*!Print_Area" And _
            Not n.Name Like "*!Print_Titles" Then
            n.Delete
        End If
    Next

    Application.ReferenceStyle = beforeReferenceStyle

    KillTimer 0, timerID
 
End Sub

Private Sub TimerProc()

    Dim hwnd As Long
    hwnd = FindWindow("bosa_sdm_XL9", "名前の重複")

    If hwnd > 0 Then
        SendKeys getRandomString(3, 20), 10
        SendKeys "{ENTER}"
    End If

End Sub
 
Private Function getRandomString(min As Long, max As Long) As String
 
    Dim s As String
    Dim i As Long
 
    max = Int(max * Rnd)
 
    For i = 0 To min + max
        Randomize
        s = s & Chr(65 + Int(26 * Rnd))
    Next
 
    getRandomString = s
 
End Function

このソースは、http://trash-area.com/archives/677から引用させていただきました。

ありがとうございます。

5.で、カーソルを「Sub DeleteDefinedNames()」に持ってきて、

Office2003_06

6.マクロを実行。

Office2003_07

すると、あら不思議。名前の定義がきれいになっています。

ちなみに、「Print_Area」と「Print_Title」は、印刷の際のページ設定で使われている名前です。

不要なら、もちろん手動で削除してかまいません。(印刷設定すると、また復活します)

Office2003_08

上記マクロは、Office2010でも動作します。

「名前の管理」の場所

Office2010_01

「マクロ」の場所

Office2010_02

ただ、Office2010だと、以下の点でOffice2003とは挙動が異なっていました。

・Office2003では消せなかった名前が、「名前の管理」->「削除」で普通に消せた。

複数選択して削除もできるし、上記マクロは不要かも。

・シートコピーする際に、「この名前を使用しますか?」というダイアログが出なかった。

ダイアログが出ないということは、不要な「名前」が大量に残ってても気付かないってケースがありそう。

|

« Microlonて効くのか?? その後1 | トップページ | 七変化(シチヘンゲ) »

パソコン・インターネット」カテゴリの記事

コメント

コメントを書く



(ウェブ上には掲載しません)


コメントは記事投稿者が公開するまで表示されません。



トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/538346/51804526

この記事へのトラックバック一覧です: TIPS : Excelの「名前」(定義済みの名前)をきれいに削除する方法:

» Excel名前定義削除(マクロ) [三流ITエンジニアの備忘録]
文字化けして名前定義を削除できないときが多々ある。 それごと削除できるマクロを見つけたのでメモメモ。 [続きを読む]

受信: 2012年2月21日 (火) 16:31

« Microlonて効くのか?? その後1 | トップページ | 七変化(シチヘンゲ) »