【解決 エクセルBad Request問題】ファイル選択を従来のダイアログで開く(写真帳)

これまで、写真帳のエクセルマクロで「Bad Request – Request Too Long」のエラーが出る問題と幾度となく戦ってきました。

1月にこの症状が出て、社内で何度となくこのエラーの対処をしてきましたが、ようやく一つの解決策を見出しました。

ファイル選択の違和感に気づく

ファイルを選択する際、これまでエクスプローラーからファイルを選ぶ従来の画面が一般的でした。けれどいつの間にかこのような画面に切り替わっていました。

これがWebView2というアプリケーションを使って開く画面だと思われますが、このキャッシュが悪さをして「Bad Request – Request Too Long」のエラーを吐き出していたものと考えられます。

今まではこのような画面だったのはみなさんもご存知だと思います。これをエクセルVBAで表示させるようにすれば、万事解決できると思い至りました。

従来のファイル選択ダイアログを表示するエクセルVBA

誰かが作ったダイアログ表示のエクセルVBAは次のようになっていました。

dlgAnswer = Application.Dialogs(xlDialogInsertPicture).Show

この関数を使うとWebView2ベースのダイアログが開きました。この部分を次のように変えました。

picName = Application.GetOpenFilename _
("画像(*.png; *.jpg; *.jpeg; *.gif),*.png; *.jpg; *.jpeg; *.gif", , "画像ファイルの選択")

このようにすることで、従来のダイアログが開くようになりました。しかし、この方法では画像を直接エクセルシートに貼り付けるのではなく、リンク貼りつけになってしまいます。

画像を直接貼り付けるエクセルVBA

リンク貼りつけではなく、画像の直接貼りつけにするために、上記のコードを少し書き換えます。

'画像選択ダイアログ 
picName = Application.GetOpenFilename _
("画像(*.png; *.jpg; *.jpeg; *.gif),*.png; *.jpg; *.jpeg; *.gif", , "画像ファイルの選択")
    
'ダイアログでキャンセルした場合は処理を終了 
If picName = "False" Then Exit Sub
    
'画像の取得 
With ActiveSheet.Pictures.Insert(picName)
    .CopyPicture    'クリップボードにコピー 
    .Delete         'リンク画像を削除 
End With
    
'コピーした画像の貼り付け 
ActiveSheet.Paste

少しトリッキーな動きですが一度リンク貼りつけした画像をコピーし、原本を削除したのち、コピーしておいた画像を貼り付けることで、画像の直接貼りつけができました。これでWebView2をそもそも使わずに処理することが可能になったので、Bad Requestの問題は解決できました。

EXCELマクロの修正は難易度が高い

このような建築業や建設業向けの写真帳エクセルマクロはずいぶん昔からあるようで、エクセルのバージョンアップに対応しきれなくなっているのではないかと推測しています。

社内SEがいる会社であればこのように対処可能ですが、建設現場の担当者はもちろん、プログラミングの知識がない一般職員ではなかなか敷居が高いかもしれません。ましてやすでに退社された人が作ったエクセルマクロであればなおさらです。筆者も誰が作ったかもわからないエクセルVBAのプログラムコードを解釈するところから始まりました(笑)

先日のWebView2のキャッシュフォルダを削除する方法や、WebView2の修復のような一時的な対処療法であっても難しいと感じる方も大勢いらっしゃいます。有償とはなりますが、Windows標準ソフトのクイックアシストや、Google Chromeのリモートデスクトップサービスを使って遠隔操作での支援も行っております。またエクセルVBAの修正もご相談に乗りますので、必要でしたらお問い合わせください。

遠隔サポート・お問い合わせ

有償とはなりますが遠隔サポートやエクセルVBAの修正なども承っております。ご質問・ご相談等がありましたら次のページよりお問合せください。

タイトルとURLをコピーしました