Excelのマクロを修正してみた。

忙しい時ほど改善とは良く言ったものだ。勿論共有しないけどね。自分勝手って言われても、自分以外使い方教えても分からないだろうし。万人受けするプログラムまで仕上げてたら、カイゼン!的には正しいと思うけど時間ばかりかかる。お金がおりてきたらもうちょっと頑張ってやっても良いけどね。

我が職場「縮専」を windows 7 でインストールする方法を書いたマニュアルを有難がってみんな使ってるんだぜ。今じゃそのマニュアル書いた小生は PowerToys の ImageResizer を便利に使ってる。XnConvert にくらべて目立たないしね。

あとPowerRenamer も良いぞ。regexも使えるし。やっと FrexRena の代わりが出た感じた。デスクトップ表示させると応答が無くなるからね。

Excel でクリップボードの操作が難しくなっている

Excel のVBA のクリップボードにセットしたり読み出したりする辺りが、なんかおかしい。一度実行しても取得できないが、二回実行すると取得できるとか。

CreateObject(“Forms.TextBox.1”) を使う方法と DataObject を使う方法があると思うが、どっちもどっち。ただ、使えないときに DataObject を使う方法はデバッグモードに強制移行する深刻なので、テキストボックスを使う方法にした。

VBAのツール 参照でMicrosoft Forms の FM20.dll を強制的に導入したら、まあまあ。使えるようになった。安定しないけど。

データを整理するメソッドを追加

前にちろっちょろっとやってみたけど、うまく動かずに放り投げてたやつ。今回は一時間位と決めて完成させた。

何が難しいかと言えば、VBA における型で悩んでしまうから。一応定義しまくるけど、個人的には Python 文法が時間がたった時に分かりやすい。

あとRangeの指定方法。もうちょっと柔軟にならないのかね。

Excel って いつまでVBA なんだろう。Basic 文法って時間がたって見直すと思い出すのに時間がかかるんだよね。AutoCAD は VBA でもやってみたけど、結局 AutoLISP に戻っていった。AutoCADのバージョンアップ度に手入れが必要だったんだよ。

VBScript も MS 廃止予定だし。Excel からVBAの代わりになるのは何だろうな。

データソートも key に加えて key2 とか Excel 2016 から追加されているらしいし。

結局 Excel の 内部UTF に悩ませる

ちょいと新たに分かったことがあったので色々修正。

繰り返し作業させるために機械向けにプログラムを作りたかったが、途中で寝るほど退屈な作業の繰り返し。

そのため、プログラムでささっと変更するプログラムを作ろうと思った。

コンピューターは人間を楽にするためにあるのだから。

最初Python で作ろうと思ったが、Excelで編集しながら出力したくなってきたので、 Excel VBA で作り始めてしまった。

単純にファイルハンドルもひとつずつ、手順的に処理させるのには VBA は確かに最適。

ただし問題があった。Excel VBA は内部的には 一文字ずつUTF で動いているらしく、ぼんやりと快適に動く。

ところが、機械側は今風の BOM付きUTF-16LE によるテキストファイルだった。

FFFE 45 00 55 00 0D 00 0a 00 みたいな。

まず現状の機械のプログラムを読ませると頭に FFFE がついてくる。こいつは実力で取り除いた。

     Dim buf As String
            Open 読み込むフルパス For Input As #1
                 Do Until EOF(1)
                    Line Input #1, buf

  If StrToHex(Mid(buf, 1, 2)) = "FFFE" Then
        buf = Mid(buf, 3)
        
        
     End If

その後読まれた buf を Debug.Console してみると、「VERSION」のように中身が一文字ずつ入っている。String 型と思って文字単位に変換してくれたらしい。

            'ファイルをカレント+日付で書き出し
    Dim strNow As String
    strNow = Format(Now, "yyyy-mm-dd hh.nn.ss")
    Open 読み込むフォルダ名 & Application.PathSeparator _
    & strNow & ".PRD" For Output As #1
    '開いたファイルに書き込む
    Print #1, OutputPRD
    '開いたファイルを閉じる
    Close #1
 

次に Open write で bufを一気に print で書き出してみると、45550d0a みたいなsjis ファイルになった。このことから Excel VBA は内部的にsjis かと思ったが、内部的にはUTFで書き込むときに sjis CP932か?になっているらしい。

まあ読んでくれるだろうと、機械に読ませてみると、読まない。ちゃんと UTF-16LE でないと読まないのだった。

仕方なし、実力でFFFE を頭に付け加え、StrConv( xxx, vbUnicode) で変換したものを Print 。

            OutputPRD = StrConv(OutputPRD, vbUnicode)

スコンブが vbUnicode に変換しているが、メモリ上では UTFのUTF変換となり、すさまじい文字か刻まれている。ほんとはデータ型を Byte に変換しないとヤバい。これで結果としてUTF-16LEで書き込まれた。

なんとか機械様に読んでもらった。最後の CRLFが 0d 0a になってしまったが。(0d 00 0a 00)

Print #1, OutputPRD;

最後に JS の様にセミコロンをつけると改行コードの出ない Print となるらしい。なにその独特ルール。

めんど。Mac のExcelとか文字コード何で動いてるんだろう。

Excel VBA とかこの辺が嫌なんだよな。内部は sjis でもいいけど、UTF の読み書きぐらいさっとできてほしいものだ。参照設定で、「Microsoft ActiveX Data Objects 2.8 Library」を import して Set adoSt = CreateObject(ADODB.Stream) とか Java っぽい事が正義。

このコンピュータに設定されている制約のため、この操作は中止されました。システム管理者に問い合わせてください。

はい。私がシステム管理者です。でもそんなこと知りませんが。

Excelで見出しのついたシートを作ろうとして発覚。

マイクロソフトにそのQAがあった。

https://docs.microsoft.com/ja-JP/outlook/troubleshoot/message-body/hyperlinks-not-working-in-outlook

Outlook でハイパーリンクが機能しない

2021/04/09

Microsoft Internet Explorer を起動します。
ツール メニューのインターネット オプション

詳細設定 のタブ
InternetExplorer の設定をリセット


個人設定を削除 を☑


再起動

だめ。

Microsoft Internet Explorer を起動します。
ツール メニューのインターネット オプション
プログラム のタブ
InternetExplorer を既定のブラウザにします。

だめ。

手順 3: html キーの String (Default) 値が . htmlfile HKEY_CLASSES_ROOT確認する

[スタート] > [ファイル名を指定して実行] の順に選択します。

[開く ] ボックス に 「regedit」と入力し、[OK] を選択します。

レジストリ サブキーを見つけて選択します 。.html HKEY_CLASSES_ROOT \ 選択します。

String (Default) の値が "htmlfile" である必要があります。 htmlfile ではない場合は、右クリック (既定値) し、[変更] を選択し、[値のデータ] ボックスに htmlfile を入力し 、[OK] を選択します。
レジストリ エディターを終了します。

ダメだったけど、

再起動

リンクするようになった!!!

具体的なレジストリーキーは

コンピューター\HKEY_CLASSES_ROOT\.html

ここで名前 (規定) を

htmlfile

に変える。ここがなぜか「FirefoxHTML–」となっていた。このPCにはPortableApps経由で Firefox 使ってるけど大分前に入れた名残かな。

Excel 今頃サポート関数 抽出して並べ替えて新たな表にする

2019年12月にOffice365だけでアップデートされた。関数が使いたい。

一つの材料表があって呼び方が旧から新に変わる。その移行期間なので旧表と新表をメンテナンスしなくてはならないが、データを一つでまとめたい。

最初はvlookup関数使うのかと思ったが。

sort関数というのがあるらしい

仕様
Ae10x10x20
Cd15x35x10
Eb9x20x21
Bc15x20x11
Da21x15x9
新順で並べ替え旧順で並べ替え
仕様仕様
Ae10x10x20Da21x15x9
Bc15x20x11Eb9x20x21
Cd15x35x10Bc15x20x11
Da21x15x9Cd15x35x10
Eb9x20x21Ae10x10x20

ところがこれが2019年12月に追加されたとの事。こんな機能今までなかったなんて。

sort関数以外で抽出して並べ替えて新たな表にする

そこでsort以外で実現できないかと検索すると small ・large と index を使う方法があった。

ところが数値以外は取り扱いできず、上のような文字順で並べることが出来ない。small large 関数とも数値を相手にした得点順などは出来るものの、文字順に並べることは出来ないのだ。

ボタンを使って並べ借ることは出来ても、その機能が実装されていないなんて。

それでも何とか文字列を並べ変えて新たな表として出力したい。何しろダイナミックに変化していく表なので。

どうやらセルの中の文字を数値化すると出来そうです。VBAで並べ替えリスト作るほうが楽かも。それならWebで作るか…

なんだよこのプログラミング的手法。

続きを読む “Excel 今頃サポート関数 抽出して並べ替えて新たな表にする”

「脱VBA」の道筋がついに見えた、ExcelデータをPythonで抽出・加工する方法 | 日経クロステック(xTECH)

今からプログラミングを学んで業務を自動化したいなら、筆者はPythonをお薦めします。Pythonはシンプルで勉強しやすく、ライブラリーが豊富で用途が広いという利点があります。Pythonを使えば、Excelを起動せずともExcelファイルからデータを取り出したり、加工したりできるのです。
— 読み進める xtech.nikkei.com/atcl/nxt/column/18/01174/011700001/

EXCEL計算 平均律における音階と周波数

現代における平均律をExcelを使ったn乗根で計算させるときの数式です。

歴史的にはピタゴラス音律、純正律と進んできましたが、現代は数式で表されています。

以前DTMにハマった時パソコンで作り出した音が以外にも下手に聞こえたことから音楽は数式ではなく感性だと思っていますが、そこを表そうとするのに努力が必要だと思っていますので。

音名 基準 数式 周波数 オクターブ
A -12 =440*2^([基準セル]/12) 220.00 A3 3
A#/Bb -11  =440*2^(B3/12) 233.08 A#3
B -10 246.94 B3
C -9 261.63 C4 4
C#/Db -8 277.18 C#4
D -7 293.66 D4
D#/Eb -6 311.13 D#4
E -5 329.63 E4
F -4 349.23 F4
F#/Gb -3 369.99 F#4
G -2 392.00 G4
G#/Ab -1 415.30 G#4
A 0 440.00 A4
A#/Bb 1 466.16 A#4
B 2 493.88 B4
C 3 523.25 C5 5
C#/Db 4 554.37 C#5
D 5 587.33 D5
D#/Eb 6 622.25 D#5
E 7 659.26 E5
F 8 698.46 F5
F#/Gb 9 739.99 F#5
G 10 783.99 G5
G#/Ab 11 830.61 G#5
A 12 880.00 A5

以上より音程は黒鍵も白鍵も関係なく対数的に12等分された周波数で表すことができる。

ピアノ調律でA3=440Hzと基準とする場合もある。