前回、ファイル→アカウントの画面から製品情報のバージョン(製品エディション)を取得する方法を紹介しましたが、それだけでは正確なバージョンが不明なケースがある(Office Premium)ようなので、更に「バージョン情報」ボタンを押して表示されるダイアログからバージョンを取得する方法も紹介します。
開発用ライブラリ
前回、ファイル→アカウントの画面から製品情報のバージョン(製品エディション)を取得する方法を紹介しましたが、それだけでは正確なバージョンが不明なケースがある(Office Premium)ようなので、更に「バージョン情報」ボタンを押して表示されるダイアログからバージョンを取得する方法も紹介します。
Office2016以降、VBAでバージョンを取得するのが難しく、
そんな中、UIAutomationを使って取得する方法を模索してみました!!
(当初はレジストリを探索するも、PC環境によってバラバラだったりで挫折し...
サンプルブックはこちら↓(解凍パスワード:123)
EdgeIEmode【Pass:123】.zip
(2022/5/27 16:15 微調整 ※関数名を微調整、参照設定3を追記)
弁士さんに感謝(=人=)
Webとかからコピペした時に、
変なスペースが混じってる事ないですか??
『Non Break Space』と呼ばれるものらしく、
Webページ上で、スペースを空けたい時に使われてる
制御文字らしいです。
これがTRIMでは除去できないので、
この関数で半角スペースに変換しちゃいましょう~♪
*****************************************************************************************
'#VBA100本ノック 87本目
'「相関表」に数式の依存関係を作成してください。
'B列のシートの数式が2行目のシートを参照している場合に
'交点に"○"を入れてください。
'※画像参照
'セルの数式のみ対象です。
'以下は考慮しない。
'・INDIRECT関数、串刺し計算、名前定義、条件付き書式、入力規則、文字定数
●アプローチ
エクセルの数式タブにある「参照元のトレース」を応用し、
ShowPrecedents と NavigateArrow を利用して
数式の参照元を追ってみました~
クセが強いので、
大量に数式がある場合は
もう少し調整が必要かもですが
こういう方法もあるよってことで~ノ゚∀゚)ノヤットサー!
2,3年前に構想するも作れてなかったので いい機会になりました!!
ありがとうございます(^人^)
IEのゴースト現象について、
自分の経験を基に不明なデバッグを減らすIEの閉じ方を
需要ありそうなので記載しておきます。
IE起動→スクレイピング→IE閉じる
の繰返しでたまにIE起動時でNGになることがあります。
原因は
閉じた後も裏でIEのプロセスが暫く残る事があるということが判明(・・;)
※他の何かが原因のケースがあるかもですが、自分の経験として。
そして対応方法として
IE.Quitの前にプロセスIDを取得しておき、
Quit後にプロセスを直に殺して対応しました。
WinAPIが多くなるのが難点です(^_^;)
使う【WinAPI】はこんな感じです~
GetWindowThreadProcessId
ウィンドウハンドル(IE.hWnd)からプロセスIDを取得
IsWindow
ウィンドウが生きてるか判定 ※IEが閉じるまで念の為に待つ用
OpenProcess
プロセスIDからプロセスのハンドルを取得
TerminateProcess
プロセスを殺す
※他にもっと簡単に解決できる方法があるかもなので、あくまで1つのケースとして
-------------------<以下、VBAソース>----------------------------------------------------------
#VBA100本ノック 66本目
ブック自身のあるフォルダ以下の全サブフォルダを検索し、
自身と同一名称(拡張子含めて)のファイルを探してください。
同一名称のファイルが見つかったら、シートに出力してください。
・A列:フルパス
・B列:更新日時
・C列:ファイルサイズ
※シートは任意
アルゴリズムを、再帰的に見直しました。
四方の端から攻めて、入り口が見つかれば、そこから再帰的に進んでいきます^^
いやー! 楽しかった!!
神髄先生、ありがとうございます!!
https://excel-ubara.com/vba100/ ★回答がアップされたらURLを更新するよてー
島問題? と呼ばれてるもの?
所要時間は、コード3時間 & パックマン化2時間 だったか
'#VBA100本ノック 魔球編2
'シート内のセルが四辺の罫線(線種は問わず)で完全に塞がれている閉じた範囲内にある場合、
'罫線で閉じられたセル範囲を黄色(好きな色)で塗りつぶしてください。
'シートの端も罫線があるか無いかで判定してください。
'※閉じられた範囲とは画像の黄色部分になります。
'#VBA100本ノック 42本目
'画像1のように「階層」シートに階層を表したデータがあります。
'これを画像2のように「階層DB」シートにデータベース形式に変換して出力してください。
https://excel-ubara.com/vba100/VBA100_042.html
VBAのコード(プログラム)のインデントを、
自動的に揃えるプログラム
(一部の処理は省略して、メインのみ)
緑里庵さんのIEShotという
IEのスクロールキャプチャを実現するコードを
丸々コピペさせていただきました。
というのも、いつの間にか緑里庵さんのページが表示されない状態に...
この場を借りて御礼申し上げますm(_ _)m
緑里庵さん、めちゃくちゃ助かりました!!
ありがとうございました!!!!!
1次元x1次元配列を2次元配列に変換します。
Dictionaryに1次元配列を溜めておいて、
最後に2次元配列に変換する時に使用することが多いです。
いやむしろ、その為だけの関数かも...
例:DataArray = fArray_Dim1x1_to_Dim2(Dic.Items)
ハイパーリンク関数で、同じブックのセルを参照することは当たり前ですが、
実は別ブックのセルを参照することが出来ます。
※あまり情報が出回ってないので、出来ないと思ってる人も多いハズ。
これをうまく使うと、
ブック、シート、セルのアドレス、の一覧に対して、
数式で動的なハイパーリンクを生成することができます!!!!
セルに直接ハイパーリンクを追加(右クリック→ハイパーリンク)せず、
あえて数式の HYPERLINK を使うメリットを挙げておきます。
・リンク先が一目で分かる
・リンク先を動的に変える事ができる(数式でセルの参照先を変える等)
・ブックを開いた時に、リンク更新ダイアログが表示されない
・万が一にもリンクが消えない
※非常に稀ですが、右クリックで追加したハイパーリンクが消えて無くなる事があったので...
大量のブック・シート・セルに対して、
エラーチェック&確認 をしたい時に、
確認効率が非常に良くなるのでお試しあれ~
スタイル、便利な時もあるんですが、
他のブックからデータをコピペ、シートをコピーした時に、
いつの間にかスタイルも入ってきてしまい、
増殖に増殖を重ね、
セルの書式が設定できなくなる、
というウイルスのような側面もある。。。
しかも、スタイル名がおかしいのか、
削除ができなくなっているものもある。。。
どうしても不要なスタイルが削除したくて、
見つけた削除手順に少し不備があったので、
自分で発見した対応方法を公開してみます。
Aブックから、Bブックにシートをコピー・移動し、Bブックを保存しようとすると、
「[ファイルパス]の保存中にエラーが検出されました。いくつかの機能を・・・」
とアラートが出て、保存できないケースの対応方法を記載。
***************************************************************
指定Rangeに指定罫線が格子状に引かれているか判定
【引数】Range :対象のRange
【引数】Style :罫線のスタイル
【引数】Color :罫線の色
【引数】Weight :罫線の太さ
***************************************************************
***************************************************************
指定Rangeのデータ最終行を取得
【引数】Range :レンジ
Hidden : 非表示行に対応するオプション
MergeCell: 結合セルに対応するオプション
***************************************************************
***************************************************************
指定Rangeのデータ最終列を取得
【引数】Range :対象のRange
Hidden :非表示列に対応するオプション
MergeCell: 結合セルに対応するオプション
***************************************************************
***************************************************************
指定Rangeの最終列を取得
【引数】Range :対象のRange
***************************************************************
***************************************************************
指定Rangeの最終行を取得
【引数】Range :対象のRange
***************************************************************
***************************************************************
固定長処理用。
文字列の右端から指定バイト数を切り出す
※VBAのRightBが正しい値を返さない為
【引数】Value :対象の文字列
Length :バイト数
***************************************************************
***************************************************************
固定長処理用。
文字列の左端から指定バイト数を切り出す
※VBAのLeftBが正しい値を返さない為
【引数】Value :対象の文字列
Length :バイト数
***************************************************************
よく使う関数を1シートにまとめました
***************************************************************
固定長処理用。
文字列を指定バイト数に調整する
2バイト文字に対応
【引数】Value :対象の文字列
Length :バイト数
***************************************************************
***************************************************************
文字列のバイト数を取得
※VBAのLenBが正しくバイト数を返せない為
【引数】Value :対象の文字列
***************************************************************
***************************************************************
デバッグ用。
[?]や[・]等と表示されたり, 表示されない制御文字を
見えるようあぶり出す。
例:タブを『[Tab]』と表示
【引数】Value :対象の文字列
***************************************************************
***************************************************************
文字列の右端で指定値をカウント
【引数】Value :対象の文字列
Find :検索値
Compare :文字列判定方法(VbCompareMethodに準拠)
***************************************************************
***************************************************************
文字列の右端を1文字削除(値指定の場合、指定値の場合のみ除去)
【引数】Value :対象の文字列
Chop :除去したい値
Compare :文字列判定方法(VbCompareMethodに準拠)
***************************************************************
***************************************************************
文字列の右端が指定値でない場合に補完
【引数】Value :対象の文字列
FixVal :補完したい値
Compare :文字列判定方法(VbCompareMethodに準拠)
***************************************************************
***************************************************************
文字列の右端が指定値か判定
【引数】Value :対象の文字列
Find :検索値
Compare :文字列判定方法(VbCompareMethodに準拠)
***************************************************************
***************************************************************
文字列の左端で指定値をカウント
【引数】Value :検索対象の文字列
Find :検索値
Compare :文字列判定方法(VbCompareMethodに準拠)
***************************************************************
***************************************************************
文字列の左端を1文字削除(値指定の場合、指定値の場合のみ除去)
【引数】Value :対象の文字列
Chop :除去したい値
Compare :文字列判定方法(VbCompareMethodに準拠)
***************************************************************
***************************************************************
文字列の左端が指定値でない場合に補完
【引数】Value :対象の文字列
FixVal :補完したい値
Compare :文字列判定方法(VbCompareMethodに準拠)
***************************************************************
***************************************************************
文字列の左端が指定値か判定
【引数】Value :対象の文字列
Find :検索値
Compare :文字列判定方法(VbCompareMethodに準拠)
【戻値】
***************************************************************
***************************************************************
文字列をカウント
※様々な方法から、最速の方法でカウント
【引数】Value :検索対象の文字列
Find :検索値
Compare :文字列判定方法(VbCompareMethodに準拠)
***************************************************************
***************************************************************
選択されているセルを取得する
※指定条件に合致していない場合はエラーを表示させ, Nothingになる
※用途:ユーザが選択しているデータに対して処理する場合に
取得対象に範囲やエリア数,セル数等の制限をチェックして取得
【引数】UserSel :主にSelectionを指定する
Row_Min :取得したい範囲の開始行
Row_Max :取得したい範囲の終了行
Col_Min :取得したい範囲の開始列
Col_Max :取得したい範囲の終了列
Area_Max :取得したいエリア数
Cell_Max :取得したいセル数
Alert :アラートを出すオプション
AlertHead :アラートメッセージの頭出し
***************************************************************
***************************************************************
セルを選択する
【引数】Range :選択したいセル
ScrollRow :スクロール行(0=スクロールしない)
ScrollCol :スクロール列(0=スクロールしない)
【戻値】
***************************************************************
***************************************************************
Rangeを結合させる
※Union関数がNothingに対応していないので対応
【引数】Range1 :レンジ
Range2 :レンジ
***************************************************************
***************************************************************
2つの配列を結合する(配列の次元数が同じであること)
【引数】Array1 :データ配列(1次元or2次元)
Array2 :データ配列(1次元or2次元)
Direction :結合する方向(xlRows=行方向に結合)
***************************************************************
***************************************************************
配列の次元数を下げる(2次元配列を1次元配列にする)
【引数】DataAry :データ配列
Direction :1次元に結合する時の方向(xlRows=1行毎に結合する)
***************************************************************
***************************************************************
配列を切り取る
【注意】切り取った配列の要素は, 切り取る場所に合わせている
例えば{1 to 3}という配列に対して要素2-3(Start=2, End_=3)を切り取った場合、
戻値の要素は{2 to 3}となる(2次元配列も同様)
【引数】DataAry :データ配列
Start :切り取る開始位置
End_:切り取る終了位置(省略時は指定方向のMAX)
Direction :切り取る方向(xlRows=横方向(1次元), xlColmuns=縦方向(2次元))
【戻値】切り取った配列
***************************************************************
***************************************************************
2つの配列をDictionary(辞書)に変換する
【引数】KeyAry :1次元配列(Key用)
ItemAry :1次元配列(Item用)
***************************************************************
***************************************************************
配列をDictionary(辞書)に変換する
1次元配列の場合、配列中の値をKeyとした辞書を作成
2次元配列の場合、1列目をKey、2列めをItemとした辞書を作成
【引数】DataAry :データ配列(1次元or2次元)
IgnoreNullStrKey:Keyに空文字があった場合に除去するオプション
***************************************************************
***************************************************************
配列の長さを取得する
【引数】DataAry :データ配列
Dimension :1次元or2次元の指定(1次元=xlRows, 2次元=xlColmuns)
***************************************************************
***************************************************************
配列の基底を調整する
【引数】DataAry :データ配列
Base_Row :1次元の配列のBase
Base_Col :2次元の配列のBase
***************************************************************
***************************************************************
配列の縦と横を逆転させる
※1次配列(横)の場合は、2次配列(縦)にする
【引数】DataAry:1次元or2次元配列
Trans:貼付け時、配列の行・列を入れ替えるオプション
※1次元配列の場合、2次元配列に変換し、縦方向に張り付ける
***************************************************************
***************************************************************
指定セルにデータ配列(主にfRange_Valueで取得した配列)を貼り付ける関数
【注意】非表示行があると正しくデータを貼り付けれない(Excelの既存バグ)
【引数】Cell:貼付けセル(1セルで十分。範囲の場合は最初のセルが起点となる)
DataAry:貼付けるデータ配列
Trans:貼付け時、配列の行・列を入れ替えるオプション
※1次元配列の場合、2次元配列に変換し、縦方向に張り付ける
PasteFormula:数式として貼り付けるオプション
【戻値】配列を張付けた範囲のRange
***************************************************************
***************************************************************
配列の要素の下限・上限を、ByRef で返す関数。
主には配列系の関数用に使用。
***************************************************************
***************************************************************
配列の次元数を返す
***************************************************************
***************************************************************
既存の IsArray の弱点(型配列で生成されていない場合に判定できない)を克服した関数
***************************************************************
Wordの起動時や検索時に表示される「ナビゲーションウィンドウ」の表示/非表示用
※VBA・マクロで閉じる方法が見つからず、自己解決したので掲載
VBProjectにパスワードの保護がかかっているか判定
******************************************************************************************************************************
メッセージボックスのラッパー
【重要】既存のMsgBoxは引数を[+]して指定するが、
この関数ではコーディングしやすいよう、
引数を分類分けしている。
※1モジュール(例:M_MsgBox)に下記のコードのみを記述する事を推奨
※既存の列挙体(VbMsgBoxStyle等)を、自作列挙体(E_MsgBox_Button)に
同名のメンバーを作って値をそのままあてることで、
既存のMsgBoxに影響を与えることなく、違和感が少なく使えるようにしている。
【引数】Message:メッセージ本文
Icon:vbCritical等のアイコンを指定
Button:vbOKOnly等を指定
Default:デフォルトでアクティブになっているボタンを指定
Title:メッセージのタイトルを指定(ConstのMsg_Titleでデフォルトを調整)
【戻値】vbOK等(必要に応じてEnum の E_MsgBox_Result メンバーを調整)
******************************************************************************************************************************
2021/10/22 改行コードの調整処理を追加
オプション設定[VBAへのアクセスを信頼する]の設定値を取得
※VBAでモジュール等を処理する際に必須の判定