- ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:Excelで、マウスの動きに合わせて図形を作成するVBAを組もうとして)
Excelでマウスに合わせて図形を作成するVBAを組む方法
このQ&Aのポイント
- Excel2003の環境で、マウスの動きに合わせて図形を作成するVBAを組む方法について教えてください。
- VBAを利用する理由は、細かな位置指定を行うためではなく、セルの幅や高さを基準にした仮想の升目にスナップさせて図形を作成するためです。
- 問題は画面分割がされている場合、PointsToScreenPixelsXの値が変化することです。現在は画面分割を一時解除して値を取得し、再度分割して差を計算しています。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
http://excelfactory.net/excelboard/excelvba/cfs.cgi?word=98419&andor=and&logs=12.txt PointsToScreenPixelsX/Yを使う方式は意外とややこしいです。 FreezePanesプロパティの状態だけでなく、Zoomも考慮しなければなりません。 画面分割時の対応のヒントとしては、 http://hp.vector.co.jp/authors/VA016119/index.html └Excel 関係の仕事 ⇒ └Personal.xls └CellScreenPos ここに CellScreenPos というFunctionが公開されてますから、参考にさせてもらうと良いですよ。 ただし、セルを引数として与え、スクリーン座標を返す関数ですから、そのままでは使えません。 ダミーのセルの座標を得て差異から導くか、Functionの内容を応用して修正しなければいけないです。 昔書いた習作コードが残ってるかもしれないのでアップしても良いのですが、 他の方のFunctionが元になっているので少々気が引けます。 『マウスポインタに最も近い升目にスナップさせた図形を作成させたい...』 これがクリック時に配置するなどでは妥協できないのですよね?
お礼
素早いご回答をありがとうございます。 確認させていただきました。 完全に解決の目処が立ちました。ありがとうございます。 但し、対策は少々不思議な方法となるのですが... 私がリンク先を確認させていただいて、最初に感じたことを正直に申しますと、「これはおかしい」というものでした。 PointsToScreenPixelsXなどの変化についての対応が全く見受けられなかったからです。 ですが、事実としてこのコードは立派に機能しています。私が無視した中途半端な倍率のZoomの対応まで図られていますし。 確認のため、プログラム実行前と実行直後のPointsToScreenPixelsXの値を比較してみました。 すると、実行前は私を悩ませ続けたおかしな値が返っているのに、プログラム実行直後は画面分割をしていない場合と同じ値が返ってきます。 どこでこの値が変化するのかをイミディエイトに出力して確認したところ、何故か SplitHorizontal の値を取得した直後から値が変わることがわかりました。 単純に分割の幅を取得するプロパティの筈ですが、何故かPointsToScreenPixelsの値も修正する効果があるようです。 (ちなみにActivePane.Indexの変化はありませんでした) 念のため、画面分割をしたシートで以下のテストコードを実行して Sub Test() With ActiveWindow Cells(4,3) = .PointsToScreenPixelsX(0) Cells(4,4) = .PointsToScreenPixelsY(0) dummy = .SplitHorizontal Cells(5,3) = .PointsToScreenPixelsX(0) Cells(5,3) = .PointsToScreenPixelsX(0) End With End Sub 間違いなく値を戻す効果があることを確認しました。勿論、SplitVerticalにも同様の効果があります。 私はPanes(1).VisibleRangeの幅や高さを利用していましたので、この効果には気付くことができませんでした。 クリックなどの都度、この値を取得してリセットをかければ良いわけですからこれは非常に楽です。 何しろ、今まではわざわざ画面分割を解除して値を取得後、分割を再構成するといった手間をかけており画面操作負荷が重く、マウス移動やスクロールの都度しかけるわけにはいかなかったため、やむを得ずスクロールを禁じていたのですから。 これから先は、重装備だったコードを解きほぐして簡潔なものに修正する作業と、スクロール禁止を解除し、その代わりスクロール操作が図形描画モジュールに影響を与えないよう、慎重に有効範囲を設定しなおす作業が必要ですが、今までの苦労に比べたら随分と楽なものです。 本当にありがとうございました。 今回のことわかったことをまとめておきます。 ・横方向に画面分割を行うと、PointsToScreenPixelsXの値が変化する ・縦方向に画面分割を行うと、PointsToScreenPixelsYの値が変化する これらの変化の値は、それぞれ、SplitHorizontalやSplitVerticalの値をPixel変換したものと、Zoom毎の定数(100%なら34、50%なら20等)を足し合わせたものと等しくなる (恐らくは行列番号の見出しの幅や高さだと思われる) この変化は、SplitHorizontal若しくはSplitVerticalの値を取得することでリセットされる。