Excelで半角カナのファイル名で強制保護ビュー

TL;DR 2023年5月2日15:00現在、Office 365の最新のExcelで半角カナのファイル名をつけ、OneDrive同期対象のフォルダで開くと毎回保護ビューになる不具合があるようです。 やはりファイル名に半角カナは避けたほうが良いのかもしれません… 経緯 利用者より、自分の場合だけExcelファイルを開くと毎回保護ビューになるとのこと。試してみると、ファイルサーバ上で開く際には初回に保護ビューとなり、「編集を有効にする」をクリックすると以降は保護ビューにはならない。が、どうもインターネットからダウンロードしたファイルではないっぽいのが気になる。なぜ保護ビューに? このファイルを、OneDriveで同期しているデスクトップで開くと、初回だけでなく、毎回保護ビューになる。「編集を有効にする」をクリックしても。 7-zipがMark-of-the-Webに対応したニュースは知っていたので、これが原因だろうとあたりをつけ、再現を試みるもどうにもダメ。Mark-of-the-Webの場合はエクスプローラーでファイルのプロパティに「Security」の項目が追加されチェックボックスが表示されるはずが、表示されない… https://www.bleepingcomputer.com/news/microsoft/7-zip-now-supports-windows-mark-of-the-web-security-feature/ Excelにて保護ビューのチェックボックスのうち、「インターネットから取得したファイルに対して、保護ビューを有効にする」のチェックをしたときのみ発生するので、Mark-of-the-Webと絡んでいそうなものなのだが、上記の通りファイルのプロパティには該当の項目が表示されない。 まさかとは思ったが、念のためと思い、ファイル名に含まれている半角カナを削除したところ問題が解消…マジか… 検証したところ、半角カナがファイル名に含まれると発生する、発生するのはExcelのみ、かつ2023/5/2 15:00時点で最新の 2304(build 16327.20214)で発生することまで突き止められた。(たまたま社内にあった、古いバージョンのExcelでは発生しなかった) 同様の症状がWebでは見つからなかったので、現時点で未解決の問題と判断。利用者には半角カナを全角カナに変えることでの暫定対応を指示。Win+FでFeedback Hubにて報告した。 1日つぶれてしまった…

<span title='2023-05-02 00:00:00 +0900 +0900'>May 2, 2023</span>&nbsp;·&nbsp;1 min&nbsp;·&nbsp;tack41

Excelで謎の肥大化

TL;DR Excelの容量肥大化では、以下の順に切り分けましょう 見た目で明らかにオブジェクトが詰め込まれていないか Ctrl+Endで、想定以上に広い範囲が指定されていないか [ホーム]-[選択]-[オブジェクトの選択と表示]で、想定以上のオブジェクトが表示されないか ちょっとしたプログラムをぱっと作るのにChatGPTは便利 経緯 あるExcelファイルが開くと動作が遅いのでなんとかならないかと問い合わせがありました。とりあえずファイル送ってもらい、調べました。 1ファイルで容量が3MBを超えており、かなり大きいです。数式が重いか、データが重いかで原因を考えていましたが、少なくとも後者は原因になりそうです。 シート数は2つ。行は1000近くまで行っているので小さくはないがそれほどでもない感じ。中にあるのは工程表で、罫線の表に線オブジェクトが多数という感じでむちゃくちゃ多いというほどでもない感じ。 この手の肥大化でよくあるのは、利用者が気づかないうちにデータが入力されているセルの範囲が広がってしまっているケース。この場合はスクロールバーがパット見の工程表の範囲よりも広く設定されいるかどうかでわかりますが、どうもそうではなさそうでしgた。 一方のシートが見た目上データが多く、こちらのシートが原因かなと思い、少しずつ行を削除して切り分けていこうと考えました。が、とにかく動作が重い。別の画面にフォーカスを移して戻ってくるだけでマウスがくるくる回ります… 上下にスクロールするのもしんどい感じ。 なんとか頑張って、複数ある工程表のうち、最初のものだけ残して他を削除しましたが、容量は大きいまま。で、この表を削除してもまだ容量は大きいままでした。オブジェクトの範囲選択で怪しそうな場所を選択しても、それらしいオブジェクトは無し。 そこで改めて[ホーム]-[選択]-[オブジェクトの選択と表示]を見ようとしたところ、表示までに5-10分かかり、大量のテキストボックスが表示されました、これだ… 通常であればここで1つを選択した状態でCtrl+Aですべての図形を選択できるようなのですが、重すぎていつまで立っても選択が終わりません… 色々試行錯誤したのですが、VBAでテキストボックスを削除してしまうのが手っ取り早そうだと考えました。こういったときに使ってみようと思ったのがChatGPT。Bingで使えるようになっているので、すべてのテキストボックスのオブジェクトを削除するVBAを聞いて返ってきた内容を微調整したのが以下 Sub DeleteTextBoxes() Dim ws As Worksheet Dim shp As Shape Dim n As Long Application.ScreenUpdating = False Application.Calculation = xlCalculationManual For Each ws In ThisWorkbook.Worksheets For Each shp In ws.Shapes Debug.Print "[" &ws.Name & "シートの処理を開始" & "]" If shp.Type = msoTextBox Then shp.Delete n = n + 1 Debug.Print n & "個目のテキストボックスを削除しました" Else Debug....

<span title='2023-03-18 00:00:00 +0900 +0900'>March 18, 2023</span>&nbsp;·&nbsp;1 min&nbsp;·&nbsp;tack41

Excelでオプションボタン

利用者が使い慣れたExcelでアンケートシートを作ろうとした際のこと。 どれか1つを選択してほしい場合は、オプションボタンを使う。開発タブにあり、フォームコントロールとActiveXの2つがある。 フォームコントロール フォントの見た目がActiveXと比べればマシ。 グループ化するのに、グループポックスを使用しないといけない。 行や列の追加・削除でグループボックスに入ったり外れたりすると挙動が想定外となる レイアウト上、グループボックスが不要な場合は非表示にしないといけない。が、非表示にするとどこにあったかわからなくなる。 誤ってグループボックスが重なったりするとやはり想定外の挙動となる。 ActiveX グループ化するのにグループ名を指定できるので、フォームのように想定外の動作をすることはない フォントの見た目がひどい。クリックしたときとそうでないときで大きさが変わる? 項目Aを選択し、項目Bを選択してさらに項目Aを選択…と繰り返すと、どんどんフォントが大きくなる(致命的) プロパティ上のフォントサイズは変わっておらず、コントロールのサイズを変更すると直る。 当方では2013で発生。MSも認識はしているらしいが、対応作なし… https://support.microsoft.com/ja-jp/help/417966 ActiveXのフォントが大きくなる不具合は致命的なので、グループボックスの位置に注意しながらフォームコントロールを使うことにした。 どちらの場合もだが、オプションボックスをセル内に収まるようにしないと、セルの追加で配置がずれてしまうので注意。

<span title='2018-11-30 00:00:00 +0900 +0900'>November 30, 2018</span>&nbsp;·&nbsp;1 min&nbsp;·&nbsp;tack41

Excelで「このワークシート内にある1つ以上の式の参照に問題が見つかりました」

Excelで解決がとてもめんどくさいエラー。 このワークシート内にある1つ以上の式の参照に問題がみつかりました。数式内のセル参照、範囲名、定義名、および他のブックへのリンクがすべて正しいことをご確認ください。 Excel 2013で発生し、どう考えても参照する箇所がなくなるくらい該当シート、セルを削除しても保存のたびにエラーが出る。 で、一旦保存して終了して開き直すと出なくなることも… 全てではないのだが、エラー箇所を修正しても保存して開き直すまでエラーが出続けることがあるらしい… そもそも、エラーを出すのだからそのエラー箇所を素直に指摘してくれよと思うのだが…

<span title='2018-08-03 00:00:00 +0900 +0900'>August 3, 2018</span>&nbsp;·&nbsp;1 min&nbsp;·&nbsp;tack41

C#でExcelのバージョンに依存しないCOM経由での操作

C#での社内プログラムでExcelを操作する際、大部分はClosedXMLを利用しているのだが、ActiveXを使用しているなどでうまく動作しない場合にはCOM経由で操作している。 Visual Studioで参照ツリーにExcelのCOM参照を追加するのだが、その時点でPCにインストールされているOfficeのバージョンに対応したCOMを追加する形になる。 ビルド時に参照ツリーにあるCOMを参照するため、参照追加時のPCとビルド時のPCでインストールされているOfficeのバージョンが異なると、ビルド時に警告、またはエラーとなる。 参照追加時には2013、ビルド時に2016だったためにビルド時に警告が出て、そのまま実行すると該当箇所でRuntime Errorでコケる事象が発生した。 社内には、今後2013, 2016が混在する予定のため、どちらかだけしか対応できないとなると困るので、対応方法を調査した。 参照ツリーに追加して開発する形式を事前バインディング、実行時にCOMの名前から該当のCOMを参照する形式を遅延(動的)バインディングというらしい。 事前バインディング Visual StudioでCOMオブジェクトの仕様を把握しているため、補完が効いて開発効率が高い 型情報なども取得済みでコンパイルするため、実行速度は遅延バインディングと比較して速い 使用するOfficeのバージョンを指定する必要がある。 遅延バインディング 使用するOfficeのバージョンを指定する必要がない Visual Studioでの補完は効かず、各オブジェクト、メソッドの情報を調べながら呼び出す必要がある。大変。 実行時に型チェックを行うため、遅い。実行時エラーが出る可能性も。 遅延バインディングは、各メソッドをInvokeMemberで引数を調査しながら呼び出す必要があり、とても大変。以下のサイトにこの大変さをWrapするコードが公開されていた。 https://zenmai.wordpress.com/2011/06/24/excel%E3%81%AE%E5%8F%82%E7%85%A7%E3%82%92%E8%BF%BD%E5%8A%A0%E3%81%9B%E3%81%9A%E3%81%ABexcel%E3%82%92%E4%BD%BF%E3%81%86c/ とても素晴らしいのでぜひ利用しようと考えたのだが、(当然ながら)COMオブジェクトのすべてが実装されているわけではないので不足個所を追加実装する必要があり、結構大幅な追加が必要と思われた。 で、たどり着いたのがこちらの記事。 https://teratail.com/questions/109579 なんと、dynamicという宣言に変更するだけで、ビルド時のチェックはやめて実行時に動的に呼び出してくれるとのこと。 (COMオブジェクトの生成部分は固有の書き方への変更が必要)。素晴らしい!! 実際にdyamicに変更したところ、WorkbookオブジェクトへのReleaseComObject呼び出し時にエラーが発生。 http://hiro-syumi.ldblog.jp/archives/36511362.html こちらの記事を参照させてもらってエラー箇所のみobject型へのキャスト処理を追加したところ、問題なく動作するようになった。 このdynamicの利用だが、最初からこれを前提に行うと上記の通りVisualStudioによるサポートが効かないので開発効率はかなり落ちると思われる。今回のようにCOM参照を追加して事前バインディングで実装したうえで、dynamicに書き換えるという形が効率が良いと感じた。

<span title='2018-07-04 00:00:00 +0900 +0900'>July 4, 2018</span>&nbsp;·&nbsp;1 min&nbsp;·&nbsp;tack41