[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『マクロ登録ボタンの異常』(T17)
オートフィルタをマクロで解除した場合に、そのシート内にあるマクロ登録ボタンが
勝手に小さくなったり(文字の確認ができないぐらいに)、位置がズレたり、
またはその両方の場合があります。(シート内に登録ボタンは4個あります)
現在のところ、手操作で解除する場合には発生していません。
データに悪影響を及ぼしているようには思えないのですが、都度元に戻さねばならず鬱陶しいです。
コントロールの書式設定は「セルに合わせて移動やサイズ変更しない」にチェックを入れております。
対処方法をご教示お願いします。
(ご返信の確認は明日になります、ご容赦願います)
< 使用 Excel:Excel2010、使用 OS:Windows7 >
マクロ実行で行、列を操作した場合によく再現しますが、手作業でも発生します。
(???) 2017/11/13(月) 17:50
> 対処方法
マクロでやっているなら、元の大きさのボタンに戻すコードを 後ろに付け足せばいいんじゃないですか?
(半平太) 2017/11/13(月) 18:49
データベースとして使うシートをユーザーに直接触らせないようにしたいので(どんな間違いでデータが壊れるか解らないので)、マクロで何かするなら、
ボタンを配置するシートと、データベースのシートとは分けた方がいいかも。。。
(出来ればブックを分ける?)
1)ユーザーフォームを使えばいいのでは?
2)ボタンを別シートに配置し2画面を表示する
3)表示用シートとデータのシートと分けて、フィルターオプションでデータを持ってくる。
(まっつわん) 2017/11/14(火) 10:00
???様
直る見込みがない…にはビックリですが、受け入れるしかなさそうですね。
半平太様
見込みがないなら、作ってしまえということですね。
今はコードが思い浮かびませんが、挑戦したいと思います。
まっつわん様
>ボタンを配置するシートとデータベースのシートとは分けた方がいい…
今まで意識していませんでした。そういうもんなんですね。
ユーザーフォームは使ったことがないので、調べてみます。
自力で何とかしたいですが、躓いた時はよろしくお願いいたします。
※今は別件で躓いているのがあり、そちらを先に“SOS”しそうですが
(T17) 2017/11/14(火) 11:01
マクロ内でボタンを元に戻す場合ですが、「フォーム コントロール」のボタンでも可能でしょうか?
「ActiveX コントロール」や「ユーザーフォーム」を使う必要があるのでしょうか?
また、元に戻す考え方として、以下のどれになるのでしょうか?
・何かの命令で初期設定状態に戻す
・初期設定状態を取得(記録)しておいて、再設定する
・その他
どうも私にはハードルが高く、当面はボタンを別シートに設置して運用しようと思っていますが、
参考までにお尋ねするものです。
(T17) 2017/11/16(木) 16:18
基本、図形の一種なので、
Top、Left、Height、Widthを初期化してやればいいのでは???
https://kosapi.com/post-3169/
(まっつわん) 2017/11/16(木) 17:02
ご紹介いただいたサイトは初めて目にします。
今日は時間取れない為、明日以降にじっくり見て考えてみます。
ありがとうございました。
(T17) 2017/11/16(木) 21:07
Dim shp As Shape For Each shp In ActiveSheet.Shapes shp.Visible = False '再表示の時は「True」 Next shp
最初は以下を考えていたのですが、「True」の時に「メモリ不足エラー」が出てしまいます。
sub test() ActiveSheet.Shapes.SelectAll Selection.Visible = False stop ActiveSheet.Shapes.SelectAll Selection.Visible = True End Sub
テスト用ブックでの確認で、他に図形やボタンなどは一切ありません。
考えられる原因は何でしょうか?
(T17) 2017/11/17(金) 13:54
ループしないとだめか?
グループ化できるのかな?
探ってみてください。
(まっつわん) 2017/11/17(金) 14:23
テストでは最初のループコードで非表示・再表示はできています。
調べていたら、「Shapes」は「Visibleプロパティを持っていない云々」と出てきたので
ループしています。
何故「…Selection.Visible = False」は実行できて、「…Selection.Visible = True」は
ダメなのか…もう少しあがいてみます...
(T17) 2017/11/17(金) 14:50
選択したものを再表示と言われても、
非表示の物は選択しようがないと思いますが。。。^^;
Selection.Visible = True
とするまえに、
debug.print typename(selection)
としてみて、何が選択されているか確認してみては?
(まっつわん) 2017/11/17(金) 16:23
「一括」でに拘らず、素直に
dim shp as shape
for each shp in activesheet.shapes
shp.visible=true next
とすればよいような・・・・
(まっつわん) 2017/11/17(金) 16:32
承知いたしましたっ!
そりゃそうですよね...^ ^;
ただ、これで実際に対策になるか?
帰宅して確認してみます。
ありがとうございました。
(T17) 2017/11/17(金) 16:50
ちょっと気になったので試してみました。
シートがアクティブでなくても選択はされているようですね。
でも、非表示にしたあと、もう一度試してみると、
選択した図形はロックされています。
と出て選択できなさそうですね。
あと、
Worksheets(2).Shapes.SelectAll.visible=false
は出来ないんですねーやはり。。。
オブジェクトが必要です。
あと、マクロだから出来る操作っていうことも少ないので、
あくまでも手動の操作をVBA語で表現したら、その操作が遠隔操作みたいにして自動で実行できるって
いうだけなんだというとこは認識しておかないとだめっぽいですね。
Selectionの親オブジェクトはActiveWindowなんですね。
裏でSelectAllできても、それを操作したかったら、
そのシートをアクティブにしてアクティブなウィンドウに表示してやらないとだめなんですねー
(まっつわん) 2017/11/17(金) 17:07
ボタンの表示・非表示の効果を自宅で確認するつもりだったんですが、
件の現象(ボタンのサイズ・位置が勝手に変化する)が再現せず、???状態です。
ネットで検索すると、オートフィルタ操作以外でも発生する現象みたいですね。
(しかもエクセルの最新バージョンでも…)
データ加工シートには極力ボタンを配置しないようにするしかなさそうですね。
勉強になりました。
(T17) 2017/11/20(月) 09:17
発生させない方法としては、既に行っている、「セルに合わせて移動やサイズ変更しない」としておく事と、ボタンを「ウィンドウ枠の固定」により常に表示されているセルに置くことです。 またはデータシートとマクロシートを分けてしまうのも良いですね。
そして、別シートに分ける必要もないような小さいマクロなら、「この現象が発生しても、無視してそのまま使う」と開き直るのも手です。
(???) 2017/11/20(月) 09:30
「ウィンドウ枠固定」、要はボタンはセルが変化しない場所に置けということですね。
私は“お金を出して得たものの不具合”に対しては“あきらめが悪い”ところがあり
ゲイツに腹が立ちましたが、今回は見習ってケセラセラでいこうと思います。^^;
ありがとうございました。
(T17) 2017/11/20(月) 11:27
因みに、ネットにあった、各ボタンをグループ化するのも試してみましたが、これもダメでした。
やはり、初期化コードの追加かセルが変化しない場所へのボタン設置しか対策はないようです。
ご参考まで…
(T17) 2017/11/22(水) 11:00
更には、ActiveXのボタンですが、オブジェクトのサイズに関するプロパティを変えてもフォントを変えても直らなかったですが、「コントロールの書式設定」でサイズを変化させると直るようです。 しかし、マクロの自動記録ではコード化されないので、どのプロパティなのか調べてみないと判らないですが。
(???) 2017/11/22(水) 11:27
Sub test() Dim OBJ As Object Dim dw As Double
Set OBJ = ActiveSheet.Shapes(1) dw = OBJ.DrawingObject.Height OBJ.DrawingObject.Height = 1 OBJ.DrawingObject.Height = dw End Sub (???) 2017/11/22(水) 11:47
>フォームのコントロールなら問題ないようです・・・
そうですか、各ボタンはフォームコントロールで作成しているのですが…
作成したブックやシート、パソコン環境によるということでしょうか?
提示いただいたコードは、初期化マクロでしょうか?
今の環境では件の現象が起こらないため、帰宅して試してみます。
(T17) 2017/11/22(水) 12:00
他の「Left,Top,Width,Rotation」については、現象をよく観察して取捨選択して
試してみます…
(T17) 2017/11/22(水) 13:12
「DrawingObject」、これ調べていてもよくわかりません。
試してみましたが「Shape」や「ShapeRange」には置換できないんですよね?
特有の機能なんでしょうか?
(T17) 2017/11/22(水) 15:36
コントロールそのものではなく、外側のサイズを変えると直る(変える事により再計算が発生して直るのでしょう)というのが、リサイズ時の2進数誤差問題っぽい感じです。だからMSも直せていないのでしょう。
(???) 2017/11/22(水) 17:11
現象が再現したのでコードを試してみた結果、「効果あり」でしたっ!
数回データを更新して確認しましたが、再発はしておりません。
このまま様子をみたいと思います。
>リサイズ時の2進数誤差問題っぽい感じ・・・
う〜ん、これは私には意味不明(失礼^^;)ですが、
>普通のHeightやWidthプロパティでは多分駄目・・ DrawingObjectプロパティの、
>HeightやWidth(Heightだけで再表示されます)を使って・・・
↑について、お時間があるときにでも噛み砕いていただけると嬉しいです。
よろしくお願いいたします。
(T17) 2017/11/22(水) 22:21
フォームコントロールのボタンの場合だと判りにくいのですが、ActiveXのボタンを貼った場合、デザインモードでボタンを右クリックすると、設定変更するためのメニューが「プロパティ」と「コントロールの書式設定」の2つあるのが判ると思います。「プロパティ」というのが、ボタンコントロールに直結するプロパティを操作する画面であり、他方はボタン、図形等を含む、これらをまとめたオブジェクト(Shape)のプロパティを操作するのだと思います。Shapeオブジェクトに含まれるボタンオブジェクト、と考えてください。
このように、サイズ情報を持つオブジェクトの中に、更にサイズ情報を持つオブジェクトを持っているため、実際に表示するサイズはExcelが計算して決めているのでしょう。ただ、サイズのプロパティはどちらも浮動小数型なので、計算に2進数誤差が生じてしまい、ほんの僅か小さめの値になる場合があります。これが勝手に見た目が変わってしまう原因のように見えますし、直せない原因とも思います。
ゲイツ君がこれを直そうとすると、オブジェクトサイズを整数型に変えればできそうですが、それはOfficeのファイルフォーマットを全て変えないといけないでしょうし、もしかするとWindowsのオブジェクト情報を管理する根本まで変えないといけなそうです。64bitが主流に変わってきたし、更にCPUのビット数が上がる事を考えると、整数化もアリと思うのですが、表示画素の拡大進歩が激しいので、浮動小数にしておくのが安全、というのも判ります。
そして、ウィンドウの再表示は1つ1つのオブジェクトに対してメッセージを送ると膨大な数になってしまうので、親のウィンドウに対して行われます。 実際には個々のオブジェクトが再表示要求しても、OSがそれをまとめて代表のウィンドウにだけ1回送る、なんて事もOS内で行われています。 つまり、シートのレイアウトを変えると、ボタンに関しては外側のShapeに対して再表示指示がくる。でもこれでは今回の表示サイズがおかしくなることを直せない。 同様に、マクロでShapes(1).Heightを変えても直らない。 こんな感じではないかと思います。
更には、ボタンをレイアウトする際は変な事になりませんが、ボタンをリサイズ→Shapeにも伝わる、というように、下から変わっている感じなのでしょう。 Shapes(1).DrawingObject.Height を変えたのは、こっちの操作をした事になるかと思います。
(???) 2017/11/24(金) 09:43
>サイズ情報を持つオブジェクトの中に、更にサイズ情報を持つオブジェクトを持っている・・・
↑が、不具合の原因(2進数誤差発生の)らしいということですね。
で、先述しましたが「DrawingObject」、これについて知りたいのですがうまくヒットしません。
中には、「DrawingObjects」はあっても「s」なしの単体はない・・と記載されていたりします。
(参考;http://www.clayhouse.jp/vba/vba03.htm)
でも、ご提示のコードでローカルウィンドを見るとちゃんと単体で出てきます。
ちょっと脱線気味ですが、よろしければ教えていただきたく…
(T17) 2017/11/24(金) 11:38
中断状態でローカルウィンドウを表示させると、変数の内容を確認できます。 ここに、デフォルトで Me とありますが、これが自シートオブジェクトです。ツリーを展開していくと、DrawingObjectsはMe直下に存在しないことが判るでしょう。RangeとCellsの関係のように、別名を付けているのだと思われます。
Me直下に、Shapesが見つかるかと思います。これを下っていくと、Item 1 がシートに貼ったボタンと判るはず。(Item 1 とは、Items(1)として扱えます) そして、Item 1 の下に、DrawingObject があります。 今回はこれを対象にした訳ですね。
そして、Item 1 の直下にも、WidthやHeight等の、サイズを表すプロパティがあるのも確認できるでしょう。こっちがShapeのサイズであり、DrawingObjectの下のはボタンのサイズだろう、と思われます。(DrawingObjectsは、デフォルトでShapeの方のサイズに紐付いているのでしょう)
探してみてはいませんが、このような枝葉の情報までMSは公開していないと思いますので、こうやって勝手にオブジェクト構造を解析して、マクロを書いてます。 Web検索しても情報が見つからないのは、誰もそこまで突っ込んで調べていないか、調べても公開していないかだと思いますよ。
(???) 2017/11/24(金) 13:12
オブジェクト構造を解析する癖を身につけたいと思います。
その後、参考に掲載したサイトの作者自ら“単体のDrawingObjectは存在しない”は
“ミスだった”と訂正されているのが確認できました。
※記事では該当サイトは修正済みとなっているので???ですが…
(http://blog.clayhouse.jp/article/23452755.html)
今回はMSの不具合からいろいろとみなさまに勉強させていただきました。
ゲイツさんに感謝ですね。^ ^;
これからもよろしくお願いします。
(T17) 2017/11/24(金) 15:06
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.