ExcelVBAクイズ今回は先日投稿したクイズの問17~問20について解説していきたいと思います。Dictionaryの注意事項www.excel-chunchun.com解説について基礎知識まずは本記事で使用しているプロパティのリンク集を貼っておきます。ブック2私の会社では業務の進捗管理を行うエクセルの調書があって、それらの調書を週に一回管理システムに集計するマクロを実行しています。このようなマクロにおいて、近年になって原因不明の誤動作が起きて利用者が右往左往していることがありました。その時の経験を元にこの問題を作成しました。xlMinimizedです。次に使用時の部分です。現在のウィンドウ状態を標準に変更(最大化状態を解除)ブック2を開くCells(1,1)の値を出力ブック2を閉じるここで問題なのは、3のCells(1,1)ですね。実はこのCells(1,1)ですが、厳密にはActiveWindow.ActiveSheet.Cells(1,1)の省略表記となります。現在アクティブなウィンドウのシートのA1を出力するということですね。アクティブなウィンドウって何でしょう?誰が決めたんですか?たぶん、このコードを書いた本人は、Open直後だからアクティブになって当然だと思っていたのでしょうね。ところが今回のように、開いたばかりのブックがアクティブウィンドウになっていないという現象が起こります。これによってOfficeのバージョンによっては後のCells(1,1)の結果が変わります。前者はこのプロシージャに入る前からアクティブだったブックのA1の内容:空欄が出力されます。後者はBook2.xlsxのA1:ブック2が出力されます。対策は簡単でCells(1,1)なんて書き方は止めて、ブック・シートを指定した書き方に統一することです。今回の例ならWithしていますから、.ActiveSheet.Cells(1,1)とすれば済む話です。何度も言いますがブックやシートの省略は止めましょう。コードから読み取れることですが、再現条件は次の3つ全てに該当する場合です。Openしたブックを前に保存した人が最小化したまま保存していること実行しているExcelのバージョンが2007や2010であること。使用中のExcelの子ウィンドウの表示モードが最大化されていないこと1.まず最小化したまま保存とは、最小化されているのに、どうやったら保存終了出来るのかと言うと、次のようなパターンが考えられます。2013や2016ではSDIに変わったことで、最小化したまま保存終了されることがとても増えました。2.次にバージョンが2007や2010であることこれは2010まではMDIだった事が関係しています。試すことは出来ませんが、2003以前もMDIでしたので同様の症状は起こるのかも知れません。MDIだからこそ次の条件が生まれます。3.使用中のExcelの子ウィンドウの表示モードが最大化されていないことどういうことか分かりづらいと思いますので、ここで動画をお見せします。(が大人の事情により動画が用意できませんでした。)というわけで、今後は最小化されたブックがあるかも知れないという点を考慮して、連続処理の実行前に最大化しておく処置を取ったほうが良いかもしれません。今後は2010以前の環境は減って行くと思いますから、類似するトラブルは減りそうですけどね。そもそもブック・シートを省略した記法に大きな問題があるので、Open時にWith文を使い.Cells()などとするか、Workbook型の変数にブックは格納しておくことが必須かと思います。Sheet1罠でも何でもない問題です。Excelのシートには、ワークシート(WorkSheet)、グラフシート(Chart)、他色々があります。それら全てのシートを管理しているのがSheetsコレクションで、ワークシートのみを管理しているのがWorksheetsコレクションというわけです。上記のコードではグラフシートをワークシートの前に挿入しています。その後Worksheetsコレクションの1番目のワークシートのい名前を取得しているため、グラフ1ではなくSheet1が出力されます。グラフ1を取得したいならSheets(1)とするかCharts(1)とする必要があります。詳しくはこの辺が参考になると思います。SheetsとWorksheetsって何が違うの?普段はあまり意識する機会は無いのですが、グラフシートやマクロシートを使っている場面では、シートを先頭に移動/挿入させたつもりが移動されなかった。なんていう場面で困る事があるかも知れませんね。問19様式シート「tmp」を非表示で持たせておいて、それをコピーして使うような場合に発生する問題です。(2)になっているはずですが、実際にはtmpが出力されます。ここでは順番に流れを追ってみます。(2)の順で並んでいるはずである。(2)、tmpの順で並んでいます。表でも説明しましょう。After:=Worksheets("tmp")すると、なぜかこうなります。OFFちなみに、可視シートが右にある場合は問題ありません。After:=Worksheets("tmp")すると、正常にtmpの右に追加されます。(2)に相当するシートは最終的に可視化するはずですから、tmpシートを可視化してからコピーしてその後不可視にするのが良いかと思います。シートをコピーする部分をこうすればOKです。Subシェイプに名前を付けて管理する場合です。こちらの実行結果は(結果なし)です。Thenは絶対にTrueにならないのでDebug.Printに到達しません。設置初期状態のNameは和名ではなく英名がベースとなるようです。一度Nameを設定して初めてNameプロパティは表示されている名前と一致するのです。1と設定しているはずですが、これまた厄介なことに設定変更前と同じ名前を設定した場合は、その処理は無かったことにされるようです。まとめ今回は問17~問20について説明しました。これで出題した全ての問題の解説は終了です。いうマイナーな問題をかき集めて、不定期で公開出来たらと思います。Part3游ゴシック大嫌いな同志諸君!お久しぶりです。今回は先日投稿したクイズの問1~問5のRangeに関する問題につい...www.excel-chunchun.com週1回の更新を目指して活動中です。ヶ月)私がExcelを使っていて気になったことを記事に書いていきます。VBAを使い初めて、もう10年ほど経ちましたが、楽しくて楽しくて毎日自宅でもVBA書いてます。自作PCとかサーバー立てたりするのも好きなのでPCとかサーバーのことも書くかもしれません。記事の元ネタは主にTwitterの方で呟いてますので、最速で情報を仕入れたい方は是非フォローしてください。part12019-11-12SpecialFoldersの引数にString型変数を指定すると意図した通りに動かない2019-11-03ワークシート用ユーザー定義関数は使い方を誤ると危険である2019-10-28VBAのコメントの書き方の試行錯誤2019-10-27VBAでの広域コメントアウトの代替案2019-10-26VBAで戻り値のある複数シートをコピーする関数を作ってみた2019-10-22Outlookでメール受信者がローカルパスをクリックできるようにUNCパス化するマクロを作ってみた2019-10-21Outlookでメール受信者がローカルパスをクリックできるようにするマクロを作ってみた2019-10-20VBAでWin32APIの64bit対応自動変換プログラムを作ってみた2019-10-06ワークシート用ユーザー定義関数を揮発性にする方法2019-10-04VBAによる安定したワークシート用ユーザー定義関数の作り方2019-10-02VBA関数のライブラリ名やモジュール名の省略を検知するアイディア2019-09-29EnumWindowsを使って別プロセスのExcelを取得してみた2019-09-24エクセルマクロで野生のマグロを駆逐するミニゲームを作ってみた2019-09-19VBAでIIF関数が全ての項を評価してしまうのは当然である2019-09-16VBAの裏技?コロンで好きな位置にブレークポイントを設置する2019-09-15VBAのStopとDebug.Assertステートメントの違い2019-09-13VBAのInStr関数の不思議な挙動について調べてみた2019-09-08VBAで文字列中の文字をカウントする関数を作ってみた2019-08-31VBAで環境に依存しないWindowsMediaPlayerの使い方もっと見る最新記事(ハードウェア)2019-10-31Realforceを買ってみた。TS-932X-2Gを購入しました。広告プライバシーポリシースターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。