[[20171113172559]] 『マクロ登録ボタンの異常』(T17) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『マクロ登録ボタンの異常』(T17)

オートフィルタをマクロで解除した場合に、そのシート内にあるマクロ登録ボタンが
勝手に小さくなったり(文字の確認ができないぐらいに)、位置がズレたり、
またはその両方の場合があります。(シート内に登録ボタンは4個あります)

現在のところ、手操作で解除する場合には発生していません。

データに悪影響を及ぼしているようには思えないのですが、都度元に戻さねばならず鬱陶しいです。

コントロールの書式設定は「セルに合わせて移動やサイズ変更しない」にチェックを入れております。

対処方法をご教示お願いします。
(ご返信の確認は明日になります、ご容赦願います)

< 使用 Excel:Excel2010、使用 OS:Windows7 >


Excelの不具合のようですが、残念ながら、直る見込みはないですね。
https://support.microsoft.com/ja-jp/help/417966

マクロ実行で行、列を操作した場合によく再現しますが、手作業でも発生します。
(???) 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

選択したものを再表示と言われても、

非表示の物は選択しようがないと思いますが。。。^^;

Selection.Visible = True
とするまえに、

debug.print typename(selection)

としてみて、何が選択されているか確認してみては?

(まっつわん) 2017/11/17(金) 16:23


ActiveSheet.Shapes.SelectAll
マクロでは数少ない「選択しなければならない」ケースだと思います。
非表示のシートは選択できるのか?と考えたらわかりそうなものだと思いますが。。。

「一括」でに拘らず、素直に
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

ちょっと気になったので試してみました。

シートがアクティブでなくても選択はされているようですね。

でも、非表示にしたあと、もう一度試してみると、


Microsoft Visual Basic for Applications

実行時エラー '-2147024809 (80070057)':

選択した図形はロックされています。


OK ヘルプ

と出て選択できなさそうですね。

あと、
Worksheets(2).Shapes.SelectAll.visible=false
は出来ないんですねーやはり。。。


Microsoft Visual Basic for Applications

実行時エラー '424':

オブジェクトが必要です。


OK ヘルプ

あと、マクロだから出来る操作っていうことも少ないので、
あくまでも手動の操作を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


表示非表示を操作しても駄目でしょうね。リサイズ時の内部処理問題のようですから、オブジェクトのサイズと位置をコードで指定しないと駄目でしょう。が、それでも駄目な気がしますが…。(サイズ変更後、フォントの種類やサイズ指定も行うと、可能性が…)
(???) 2017/11/22(水) 11:11

手作業でちょっと試してみたところ、フォームのコントロールなら問題ないようですね。

更には、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


ご提示コードは、今のボタンの「Height」値を取得しておいてフィルタオフ実行後に
再設定する・・と理解しました。

他の「Left,Top,Width,Rotation」については、現象をよく観察して取捨選択して
試してみます…
(T17) 2017/11/22(水) 13:12


すみません、事前に確認しておきたく…

「DrawingObject」、これ調べていてもよくわかりません。

試してみましたが「Shape」や「ShapeRange」には置換できないんですよね?

特有の機能なんでしょうか?
(T17) 2017/11/22(水) 15:36


フォームコントロールのボタンでも発生していたのですか。でも、普通のHeightやWidthプロパティでは多分駄目です。 DrawingObjectプロパティの、HeightやWidth(Heightだけで再表示されます)を使ってください。
(オブジェクトで使えるプロパティについては、コード途中で止めておいて、ローカルウィンドウで見てください)

コントロールそのものではなく、外側のサイズを変えると直る(変える事により再計算が発生して直るのでしょう)というのが、リサイズ時の2進数誤差問題っぽい感じです。だからMSも直せていないのでしょう。
(???) 2017/11/22(水) 17:11


???様、 ありがとうございます。

現象が再現したのでコードを試してみた結果、「効果あり」でしたっ!
数回データを更新して確認しましたが、再発はしておりません。
このまま様子をみたいと思います。

>リサイズ時の2進数誤差問題っぽい感じ・・・

う〜ん、これは私には意味不明(失礼^^;)ですが、

>普通のHeightやWidthプロパティでは多分駄目・・ DrawingObjectプロパティの、
>HeightやWidth(Heightだけで再表示されます)を使って・・・

↑について、お時間があるときにでも噛み砕いていただけると嬉しいです。

よろしくお願いいたします。

(T17) 2017/11/22(水) 22:21


Excel内部ロジック等は公開されていないので、以下は、ふるまいを見た推測になります。

フォームコントロールのボタンの場合だと判りにくいのですが、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.