VBA プロシージャ名の取得 ハッシュテーブルの利用

VBAで,プロシャージャ名を取得する方法をあれこれあさっていましたが,あるサイトに,VBSでプロ
シージャ名を取得するVBSがのっていました。VBSとVBAの区別がつかなかったのですが,別物という
ことに気づき,あるサイトでVBSをVBAに変換するサイトがありましたので,そこでVBAに変換してみ
ました。下記のVBSを変換すると,

Set HashTbl = CreateObject("System.Collections.Hashtable")
Set CPobj = WBobj.VBProject.VBComponents("Module1")
Set CMod = CPobj.CodeModule
For i = 1 To CMod.CountOfLines
    ProcName = CMod.ProcOfLine(i,0)  ' プロシージャ名を取得
    If ProcName <> "" And HashTbl.ContainsKey(ProcName) = False Then
        HashTbl.Add ProcName, i
        EXLapp.MacroOptions CPobj.Name & "." & ProcName,,,,True,""
    End If
Next

下記のように変換してくれました。

' This code is translated from VBScript to VBA.
Dim HashTable As Object
Dim ComponentObject As Object
Dim CodeModule As Object
Dim ProcedureName As String
Dim LineIndex As Long

Set HashTable = CreateObject("Scripting.Dictionary") ' Using Scripting.Dictionary for better compatibility in VBA
Set ComponentObject = WBobj.VBProject.VBComponents("Module1")
Set CodeModule = ComponentObject.CodeModule

For LineIndex = 1 To CodeModule.CountOfLines
    ProcedureName = CodeModule.ProcOfLine(LineIndex, 0)  ' Retrieve the procedure name
    If ProcedureName <> "" And Not HashTable.Exists(ProcedureName) Then
        HashTable.Add ProcedureName, LineIndex
        EXLapp.MacroOptions ComponentObject.Name & "." & ProcedureName, , , , True, ""
    End If
Next LineIndex

ただ,このままではだめで,一部修正が必要でした。まず,

 EXLapp.MacroOptions ComponentObject.Name &amp; "." &amp; ProcedureName, , , , True, ""

の部分は,多分,ショートカットの設定の部分?なので,削除しました。また,「WBobj」の設定がしてない
ことでエラーになるので,ここを,とりあえず「Thisworkbook」に,そして,表示の部分を加えて下記のよ
うにしました。

Dim HashTable As Object
Dim ComponentObject As Object
Dim CodeModule As Object
Dim ProcedureName As String
Dim i As Integer
Dim keys() As Variant
Dim values() As Variant

Set HashTable = CreateObject("Scripting.Dictionary") ' Using Scripting.Dictionary for better compatibility
Set ComponentObject = ThisWorkbook.VBProject.VBComponents("Module1")
Set CodeModule = ComponentObject.CodeModule

For i = 1 To CodeModule.CountOfLines
    ProcedureName = CodeModule.ProcOfLine(i, 0)  ' プロシージャ名を取得
    If ProcedureName <> "" And Not HashTable.Exists(ProcedureName) Then
        HashTable.Add ProcedureName, i '要素にプロシャージャの開始行番号を追加
    End If
Next i

keys = HashTable.keys
values = HashTable.Items

For i = 0 To UBound(keys)
    Debug.Print keys(i) & " " & values(i)
Next i

これで,自身のModule1に記載された,プロシャージャとその開始行番号が表示されるようになりました。

今回,参考にしたHPにハッシュテーブルを使った例がでていましたので,ハッシュテーブルを使ってみまし
た。ハッシュテーブル(連想配列)は,以前から知っていましたが,使ったことはありませんでした。通常の
配列と違って,設定した key によって,それに応じた item にアクセスできるところが便利な所
のようです。

VBA 他シートへ関数の書き込み

開いているBook 間では,VBA の プロシャージャの書き込みもできるようです。

下記のプロシャージャでは,新しく開いたエクセルのファイルに,macro.txt に書かれた関数を書き込みます。

Private Sub CommandButton3_Click()
    'OPENしたBOOKのSHEET1に ”macro.txt” のプロしィージャを書き込む
    Dim wb As Workbook
    
    fTyp = "Excelファイル(*.xlsm),*.xlsm,Excelファイル(*.xlsx),*.xlsx,Excelファイル(*.xls),*.xls"
    prompt = "Excelファイルを選択してください"
    fPath = Application.GetOpenFilename(fTyp, , prompt)
    
    Set wb = Workbooks.Open(fPath, UpdateLinks:=Ture, ReadOnly:=Ture)
    
    With wb.VBProject.VBComponents("Sheet1").CodeModule
        .AddFromFile "C:\Users\mabo-2021\Desktop\****\*****\*****\*****\macro.txt"
    End With
    
End Sub

macro.txtという下記の内容のファイルを同じフォルダーにおいてきます。

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
 Application.ScreenUpdating = True
End Sub

VBA 他シートへの条件付き書式の書き込み

他シートに記載してあるデータを転記する必要がありました。特定の列を転記するので,転記す
る列を強調するにはどうしようかと考えていました。
メインとなっているBookから,転記するシートを開く,転記する列を選ぶ,転記する,との一連
の動作は,一通りできるようになってますが,よりわかりやすくするのに,転記する列を強調し
たくなり,その方法をいろいろかんがえていました。転記するBookに条件付き書式を手動で設定
すれば,事足りるのですが,手動では,あまりにも芸がないので,VBAから,できないか,思案し
ていました。
VBAからVBAに書き込むようかなとあれこれあさっていましたが,条件付き書式は,ブックを開いて
さえいれば,メインのBookから,他のBookに条件付き書式の書き込みができるようなので,実際に
実行してみました。
メインのVBAに

 '読み込んだファイル名でブックを開く
    Set wb = Workbooks.Open(fPath, UpdateLinks:=Ture, ReadOnly:=Ture)
    Set Taisyou_Sheet = wb.Worksheets("受付名簿")
    
    '対象シートに条件付き書式を設定
    Taisyou_Sheet.Cells.FormatConditions.Delete
    Range(Taisyou_Sheet.Cells(4, 2), Taisyou_Sheet.Cells(101, 14)).FormatConditions.Add(Type:=xlExpression, Formula1:="=CELL(""COL"")=COLUMN()").Interior.Color = rgbPowderBlue

のように書き込むことで,条件付き書式の設定ができたようです。
ただ,これだけでは,だめで,

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
 Application.ScreenUpdating = True
End Sub

を該当シートに書き込む必要があるので,やはり,VBAからVBAを操作する必要がありますね。

MG6230 ヘッド 故障 (2)

ヤフオクでプリンターヘッドを購入。印刷枚数が1-50枚というもので,QY6-0078 という型番のもので
す。本日とどいたので,早速交換してみました。


結果,見事復活です。


ノズルパターン印刷では,7701-7750 とでます。ノズルパターン印刷での印刷ページは,本体の枚数みたい
ですね。ヘッドの印刷枚数だと思ってましたが,違いました。
購入した,ヘッドも,実際の印刷枚数は ? かもですね。

見事復活はしたものの,印刷枚数を見て。また別の心配ごとが。もしかして,そろそろ,廃インクタンクが
満杯になって E008 のエラーが出てきそうなきまします。こうなると,ちょっとやっかいで,分解,ソフト
リセットと,いろいろやらないと使えるようにはならないようです。こうなると,複合機のMG6230は,ちょ
と面倒なようです。その時は,どうするか,考えますが,しばらくは,使えそうです。

MG6230 ヘッド 故障

愛用していたプリンターのヘッドがだめになったようです。
インク詰まりかなと思い強力クリーニングをなんかもやりましたが一行に改善しません。以前にやった,
ヘッドの温水洗浄もやってみました。互換インクと使ってましたので,そのせいかなとも思い,純正品に
交換もしてみました。
それで,何度も強制クリーニング。おかげで買ったばかりのインクほぼからに。しかし,PGBK が全く印
刷されないことを冷静に考えると,物理的不具合というより,電気的な不具合のような気がしてきました。

となると,部品交換しかないですね。まあ,中古品ということで,ヤフオク物色です。

ブラウン シェーバー 350CC 不具合

長年使っていたシェーバーが動かなくなりました。スイッチを入れても,

のように,赤のLEDが点滅して動きません。充電しても,いつまでも,終わりません。ということで,多分電
池だろうということで新年そうそう電池の交換をすることが,今年の最初のDIYになりそうです。
このシェーバーは,350CCというもので,メーカーではすでに販売終了,電池交換も対象外
ということなので,DIYしかないみたいです。



ネットで電池を検索してみると,〇zoneやアリエクで販売があるようですが,アリエクの方が安かったのでア
リエクに注文しました。安いのはいいのですが,到着予定が,3月2日です。少しは,早めに届くようです
が。それまで,諸兄のHPにて,分解の方法の研究です。

https://komoriss.com/braun_shaver_battery_replacement/

等に,参考になる記事があります。

謹賀新年

明けましておめでとうございます。

新しい年の始まりです。

昨年中は,HPへの訪問,ありがとうございます。

たいした中身はありませんが,時々,訪問してくださるとうれしいです。

今年もよろしくお願いいたします。

Perl プログラミング

仕事がらみのお手伝いの関係で,HPをあれこれいじってます。その関係で,perl のプログラムをいじりは
じめました。が,これが一筋縄ではいきません。

プログラムを書く。
   ↓
サーバーにアップロードする。
   ↓
ブラウザからアップロードファイルにアクセスして確認
   
を繰り返して,動作の確認をしてますが,結構時間がかかります。
一番こまるのは,同じプログラムを書いたを別名のファイルでアップロードしても,片方は動くが,片方は動
かないというようなことが起こります。下記のスクリプトは,htmlファイルを開いて,表示するという簡単な
なものです。

#!/usr/bin/perl

#文字/画像の表示
print "Content-type: text/html\n\n";

open (IN,"test2.html");
my @tmp=<IN>;
close (IN); #ファイルハンドルを閉じる

print @tmp;


exit;

このスクリプトを書き込んだ,app3.cgi は,


のように,うまく動きました。
しかし,同じスクリプトを書き込んだ test.cgi は


見事に,イターナルサーバーエラー500になってしまいました。

うまくいかない原因は,改行コードが違う,書き込んだ文字コードが違う,というようなことがいわれている
ようですが,やり方が悪いのか,これらを変更してもうまくいきません。もしかして,何度かファイル名で
エラーを起こしてしまうとサーバー側,ロックをかっけてしまうのあかなあ,と思えるくらうごきませんでし
た。動かない原因は謎です。ただ,思い当たるのは,app3.cgi のスクリプトは,動いていたスクリプトの中
身を削除して下記加えたもので,test.cgiは,テラパッドで新規にテキストファイルを作成して書き込み,
拡張子を変更したものです。もしかして,このあたりにも原因があるのかもしれませんね。

パナソニック ナビ ゴリラ CN-GP720VD 電池交換(3)

電池交換をしてから,本日法事のため遠出をしました。お寺さんまでの道のりをナビでと思い,案内を始めさ
せましたがなんと案内の音声がでません。内蔵のAV(テレビ等)をつけてみましたが,これもだめです。さて
は,電池交換の時に,線でも切ってしまったかなとおもいました。早速家についてから,から割りして,
確認してみると,スピーカーの端子が外れているだけでした。


写真矢印のコネクターを接続してサイド組み立て。TVをつけてみると,音声がでました。無事完了です。

パナソニック ナビ ゴリラ CN-GP720VD 電池交換(2)

電池が届きました。


早速交換です。ネジ,4カ所を外します。


サイドに金具を入れて,から割りをします。


ピック状のもので隙間をあけて,へら状の棒でこじ開けました。マイナスドライバーでもいいのですが,いた
めそうなので専用のへら購入しました。


写真赤丸がコネクターなので,ここを外して,バッテリーの線を途中で切断して,このコネクタと付け替えます。


念のため,上からカプトンテープで,押さえておきます。


念のため,閉じる前に,充電をしてみますと,赤いLEDがつきますので,大丈夫なようです。
それほど難しくはありませんでしたが,から割したものを戻すとき,コネクター側の爪を先にいれてない
と,うまくはまらないようで,ここだけ,やり直しました。動作も問題ないようですが,一晩充電しま
す。
ついていた物と,新しい物の規格を比べてみると微妙にちがうようで,新しい物の方は,電圧はたかいのです
が,容量はわずかにちいさいようです。