« 2011年4月 | トップページ | 2011年6月 »

2011年5月

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では消せなかった名前が、「名前の管理」->「削除」で普通に消せた。

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

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

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

| | コメント (0) | トラックバック (1)

2011年5月16日 (月)

Microlonて効くのか?? その後1

本日、マイクロロン処理をしたバイクの、エンジンオイル・オイルフィルターの交換が完了した。

とりあえず、交換したオイルについては、スラッジが多いとか、妙に汚れているとかは

ないとのことでした。まあ走行距離に見合った汚れ方だったらしいけど。

マイクロロン処理前から今回のオイル交換までで、1890km走りました。

説明書きによると、処理は一応完了しているはず。

さて、これからのエンジンの状態・燃費がどうなるか楽しみ。

1890km走る中で感じたことは、燃費は若干良くなった感じもした。。。

が、連続して長距離を淡々と走ると、燃費が良くなるのは当然。

なのでイマイチ客観性に欠けるデータですね。プラセボ効果かも。

とりあえず、エンジンが壊れなくてよかった。

| | コメント (0) | トラックバック (0)

2011年5月 8日 (日)

TIPS : Oracleのimpdpで、remap_schemaとtablesオプションを併用したい場合の対処方法

Oracleを使用していると、データをエクスポート/インポートする機会は結構頻繁にあります。
従来はexp/impコマンドでしたが、現在推奨されているのは、expdp/impdpコマンドです。
使い方や、オプション指定の方法は、
http://download.oracle.com/docs/cd/E16338_01/server.112/b56303/part_dp.htm
あたりを参照いただくとして、オプションの組み合わせではまった(というか気付いた)のでメモ。

「remap_schema」オプションと「tables」オプションが同時に使用できない場合がある

それは以下の条件を満たす場合に起こりました。
・異なるDB_NAME間、かつ、異なるスキーマ間で、expdp/impdpを行う。
・expdpコマンドを「schemas」オプションをつけて使用する。
・impdpコマンドを「remap_schema」オプションと「tables」オプションをつけて使用する。
・expdpを行うデータベース側にあるスキーマが、impdpを行うテータベース側にない。
・impdpを行うデータベース側にあるスキーマに、対象のtablesが存在しない。

実際にやってみると、
【expdp側】
DB_NAME「A」に接続するためのネットサービス名「SERVICE_A」
こちらのデータベースに「USER_A」というユーザが存在する。
以下のコマンドで「USER_A.dmp」を生成する。
このユーザの「TABLE_A」テーブルを持って行きたい。
イメージとしては、スキーマ単位でのバックアップから、
特定のテーブルを調査目的で他のデータベース・ユーザにリストアする感じ。

$ expdp USER_A/PASSWORD_A@SERVICE_A \
> dumpfile=DATA_PUMP_DIR:USER_A.dmp \
> logfile=DATA_PUMP_DIR:expdp_USER_A.log \
> schemas=USER_A

【impdp側】
DB_NAME「B」に接続するためのネットサービス名「SERVICE_B」
こちらのデータベースに「USER_B」というユーザが存在する。
「USER_B」は、「TABLE_A」というテーブルを持たない。
こちらのデータベースに「USER_A」というユーザは存在しない。

$ impdp USER_B/PASSWORD_B@SERVICE_B \
> dumpfile=DATA_PUMP_DIR:USER_A.dmp \
> logfile=DATA_PUMP_DIR:impdp_USER_A.log \
> remap_schema=USER_A:USER_B \
> tables=TABLE_A

Import: Release 11.2.0.1.0 - Production

Copyright (c) 1982, 2009, Oracle and/or its affiliates.  All rights reserved.

接続先: Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
ORA-39002: 操作が無効です
ORA-39166: オブジェクトSCHEMA_B.TABLE_Aが見つかりません。

確かに、「オブジェクトSCHEMA_B.TABLE_Aが見つかりません。」は当たり前。
だから、remap_schema指定でimpdpしたのに・・・
一応念のため、これも試してみよう。

$ impdp USER_A/PASSWORD_A@SERVICE_B \
> dumpfile=DATA_PUMP_DIR:USER_A.dmp \
> logfile=DATA_PUMP_DIR:impdp_USER_A.log \
> remap_schema=USER_A:USER_B \
> tables=TABLE_A

Import: Release 11.2.0.1.0 - Production

Copyright (c) 1982, 2009, Oracle and/or its affiliates.  All rights reserved.

UDI-01017: 操作でOracleエラー1017が発生しました
ORA-01017: ユーザー名/パスワードが無効です。ログオンは拒否されました。

そりゃそうだ。「SERVICE_B」側には、「USER_A」は存在しない・・・
ということで、苦肉の策。「SERVICE_B」側で、ユーザを作成。

create user USER_A identified by PASSWORD_X;

んでもって、もう一度。
あ、適切に権限は与えてくださいね。
それか、impdpをsystemユーザで行うというのもありかも。

$ impdp USER_A/PASSWORD_X@SERVICE_B \
> dumpfile=DATA_PUMP_DIR:USER_A.dmp \
> logfile=DATA_PUMP_DIR:impdp_USER_A.log \
> remap_schema=USER_A:USER_B \
> tables=TABLE_A

Import: Release 11.2.0.1.0 - Production

Copyright (c) 1982, 2009, Oracle and/or its affiliates.  All rights reserved.

接続先: Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
【~省略~】
ジョブ"USER_A"."SYS_IMPORT_TABLE_01"が正常に完了しました

うまくいきました。
当然「USER_A」の所有するテーブルは空のままで、「USER_B」側にきちんと復元されました。
「USER_A」は、名前解決?の為に必要とされただけのようです。
パスワードは異なっていてもいいようです。
でも、こんなことしなくても、なんとかならんもんかな。。。

なお、「USER_B」が「TABLE_A」をもっていたらどうなるか、は実験しませんでした。。。

| | コメント (0) | トラックバック (0)

2011年5月 4日 (水)

道路情報 国道4号線

震災の影響確認と、福島の応援(=現地での消費活動!)をかねて、国道4号線を北上しました。

結果、寸断されているとか迂回が必要な区間はなかったです。

気付いたポイントとして、

・新利根川橋から宇都宮までの区間は、快適、問題なし。バイパスであるため、平均速度が稼げます。

 地方には高速道路よりもこんな国道があれば、それだけでいいんだけどな。

・岩沼市の6号線と4号線が合流する部分は、かなり渋滞気味。

 これは震災のためだけなのか普段からなのかは不明です。

 海側の道路=6号線は、復興優先として、一般人は利用を控えましょう。

・岩手県内に入ると、道路の痛み・うねり・凹凸が結構あり、「段差注意」の看板が目立ちます。

 その手前で減速する車が多いためか、岩手県内区間は平均速度を稼げません。

 また修復工事のため、若干片側交互通行部分がありました。

消費活動としては、福島のお酒「名倉山」を購入。

Photo

金賞受賞というラベルに心惹かれます。1合で1050円也。

岩手のお酒は買い忘れました・・・

| | コメント (0) | トラックバック (0)

« 2011年4月 | トップページ | 2011年6月 »