misc.log

日常茶飯事とお仕事と

Excelでシートコピー時に謎の名称が重複するという警告が多発する場合

いろんな人が作ったExcel資料をテンプレートとして使いまわそうとして、シートをコピーした際に「名前が重複しています。」的なメッセージが連発で何度も出ることありますよね。あれ、今までずっと「なんだかわかんないけどしょうがないなぁ」と処理していたのですが、対処方法がわかりました。

下記のサイトで説明されていました。ありがとうございます助かります。

dev.classmethod.jp


どうやら、セル範囲などに定義された名称の中に非表示になっているものがあるらしく、それを表示状態にしてやれば「数式」→「名前の管理」から一覧表示し、消すことができます。

Public Function ShowNames()
    Dim name As Object
    For Each name In Names
        If name.Visible = False Then
            name.Visible = True
        End If
    Next
    MsgBox "DONE."
End Function

こんな感じのコードをVBA開発画面から標準モジュールを追加して記述。シートの方からマクロ実行で呼び出すと完了です。やっていることは、Excelの「Names」オブジェクトコレクションの中身をそうざらいして、VisibleがFalseのものをTrueにするというだけです。お試しあれ。

しかしなんなんでしょうね?Excelのバージョンが変わった時に仕様が変わって非表示のままGUIからは解除できなくなったのでしょうか……

Excel VBA逆引き辞典パーフェクト 第3版

Excel VBA逆引き辞典パーフェクト 第3版

2年目若手向けにEBCDICとBCD記法について説明したときの資料

古いやりとりを掘り返していて見つけたメッセージを残しておきます(発掘日:2021/10/5)。

相手は新卒で入って2年目。専門教育なし。2年目でこんなことをやる羽目になるとか可哀想すぎる。客先で動いていたもののリプレースに関するもので、一部、その場の状況が判らないと理解できない話が混じってますが、記録として残しておきます。

BCD記法

数字の計算誤差をなくすために1ケタ1文字で数値を保持する記録方法。データベースのNumeric型とかDecimal型がこれです。「12」を二進表記すると「1100」ですが、BCDでは「1」「2」それぞれを二進数で表し、「0001 0010」となります。

※整数は良いのですが小数を二進数表記すると誤差が出るので、この形式で、演算処理も 人間が筆算するかのように桁単位で行えば誤差が出ない、という考え方です。

ゾーンBCD記法

今のコンピューターはデータを8ビット単位で処理した方が楽なので、上記のBCDの上位4ビットにダミー値を入れて無理やり1ケタ8ビットで表すようにしたもの。EBCDICコードの場合、上位に「1111(16進でF)」を足す。「12」の場合「11110001 11110010」→「F1 F2」となる。

ゾーンBCDと符号

ゾーンBCDでマイナス値を表すために、苦肉の策として「末尾1ケタの上位4ビットに符号を埋める」ということにしたようです。そのルールが、EBCDICコードの場合

  • プラスの場合は「1100」(16進でC)
  • マイナスの場合は「1101」(16進でD)

結果、

  • 「+12」の場合「11110001 11000010」→「F1 C2」となる。
  • 「-12」の場合「11110001 11010010」→「F1 D2」となる。


※ただし、AnyTranと実データを見るに、どうやら「F1 F2」の場合も「+12」のようですね…

実数表記

誤差をなくすためのBCDなので、小数表記もできないといけません。その方法として、BCD表記の「何桁目までが小数」というルールを設けて小数化する「仮想実数」方式があるようです。たとえば下2桁が小数と決まっている場合、「5000」は「50.00」となります。

※今回、どうも下2桁が小数というルールのようです。日食協フォーマットの委細をしらべれば わかるかもしれません……

AnyTranの謎ロジックの意味

上記の内容は「EBCDICコードのゾーンBCD表記された数字」という、データ型が決まっている場合の話ですが、これを「EBCDICコードの数字文字」として読んでしまうと、たとえば12は「F1 C2」→「1 B」となってしまいます。この状態から数字に戻そうと思うと、謎ロジックの出番になります。末尾が「B」だったら「2」に置き換えて文字列結合。
それを数値変換して、プラスの値として扱えば「+12」というわけですね。

おそらくですが、AnyTranでEBCDICの数値型(仮想実数)指定すれば自動的に数値として読んでくれることを知らなかった人が文字として定義してしまい、苦肉の策で自力数値化を行った残骸ロジックと推測されます。

よって、マイナス値を実際に読ませてみてきちんと読めれば、謎ロジックは不要かと。

PowerCenter、ファイル出力時のダブルクォート囲みをやめる方法

Informatica PowerCenterで出力対象をフラットファイルにした場合、初期状態では文字列などがダブルクォーテーションで囲われてしまうようです。これをやめる方法、例によってInformaticaのフォーラムでQAがあったのでメモ。

network.informatica.com

設定はワークフローデザイナーでのワークフロー設定画面から、マッピングタブを選択し、左のツリー表示で「ターゲット」を選択。右側に表示される情報の下部に下図のような部分があるので、この「ファイルプロパティ」をクリックするとダイアログが表示されます。

f:id:frontline:20170221101909p:plain

そこから「詳細設定」を選択すると囲み文字の有無と選択ができるようになるので、そこで選べばよいようです。


BIシステム構築実践入門 (DB Magazine Selection)

BIシステム構築実践入門 (DB Magazine Selection)