オートシェイプの文字が更新されない

このQ&Aのポイント
  • EXCEL20007を使用している際に、オートシェイプのテキストが更新されない事象が発生しています。
  • 特定の条件下では、20シート中数シートでオートシェイプのテキストが更新されず、クリックすることで更新できる現象が発生しています。
  • マクロでのテキスト代入後、オートシェイプを再選択するなどの試みをしましたが、解決していません。どなたか解決策をご教示いただけないでしょうか。
回答を見る
  • ベストアンサー

オートシェイプの文字が更新されない。

こんにちは。 タイトルの件で、投稿いたします。 【現状】 ・EXCEL20007を使用しています。 ・シート構成は、カテゴリ選択シート、メニューシート、その他20シート程度。 --- 現在マクロを使用して、ある機能を実装しています。 【機能】  カテゴリシートでカテゴリを選択し、メニューシートへ遷移します。  この遷移時に、カテゴリ名をその他20シートのオートシェイプに反映させた状態で、  メニューシートを表示したいのです。 以下のマクロでそれは実現しました。 しかし、20シート中数シートで、オートシェイプのテキストが更新されていない場合がありました。 この場合、「カテゴリ名表示」のオートシェイプをクリックすることにより、 オートシェイプのテキストが更新されます。 なぜ、クリックしないと更新されないのでしょうか。 以下のマクロでのテキスト代入後、再度オートシェイプをselectするようにするなど、 そういった1文を追加してみたりしましたが、変化はありませんでした。 '================================================================== '== '各シートのオートシェイプ「カテゴリ名表示」にカテゴリ名をセット '================================================================== カテゴリ名 = カテゴリシート..Range("A1").Value  For Each sht In Worksheets    If sht.Visible = True Then      sht.Activate      For Each objShp In ActiveSheet.Shapes        'カテゴリ名表示というオートシェイプがあるかチェック        If objShp.Name = "カテゴリ名表示" Then          '存在すれば、カテゴリ名をセット          sht.Shapes("カテゴリ名表示").Select          Selection.Characters.Text = カテゴリ名        End If      Next    End If  Next '================================================================== 以上、原因をご存じの方や思い当たる節がある方、どうかご教示ください。 わかりにくい部分などがありましたら、ご指摘いただければ追記させていただきます。 よろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • end-u
  • ベストアンサー率79% (496/625)
回答No.4

ふむ... 最低限の再現コードとしては Sub test()   With Workbooks.Add(xlWBATWorksheet).Sheets(1)     .TextBoxes.Add(100, 100, 100, 20).Text = "aaa"     .Copy .Parent.Sheets(1)     .Copy .Parent.Sheets(1)   End With End Sub これでできたBookをActiveにして Sub test2()   Dim ws As Worksheet   Dim s As String   s = "bbb"   For Each ws In Worksheets     With ws.TextBoxes(1)       .Text = s       '.Visible = False       '.Visible = True     End With   Next End Sub これで再現しますかね? winVista.Ult.sp2/xl2007sp2.12.0.6565.5003 の環境では確認できます。 winXPsp3/xl2007sp2(詳細未詳)の環境では、同一現象ではないですが 別シートに切り替える時にシートタブをマウスダウンしたままだと "aaa"でマウスアップのタイミングで"bbb"に更新されます。 先ほどの私のレスはこのXP環境だったので適切な対策ではなかったです。 結論としては test2のコメントアウト行を活かしてもらうとなんとかなるかな..と。 VisibleプロパティのFalse/Trueの切り換えで対処できるのではないでしょうか。

tomolyu
質問者

お礼

ありがとうございました、解決いたしました。 オートシェイプのVisibleプロパティのFalse/Trueの切り換えで、対応できました。 再現コードなど、ご助言ありがとうございました。

その他の回答 (3)

  • MARU4812
  • ベストアンサー率43% (196/452)
回答No.3

コードに不備があるとすれば、 sht.Activate sht.Shapes("カテゴリ名表示").Select の2箇所。 Active系とかSelect系の命令は失敗しやすいので 使わないようにし、オブジェクトに直接命令します。 まぁ、ただし、失敗した場合はデータが更新されないでしょう から、クリックしようが何しようが更新されないはず。 > この場合、「カテゴリ名表示」のオートシェイプをクリックすることにより、 > オートシェイプのテキストが更新されます。 更新されないから「何度もプログラムを実行して、その後に クリックしてみた」というのでもないと当てはまらない。 プログラムからは、いつ、どのシートの更新に命令したのか 確認しないと、プログラムの問題なのか、Excel の仕様に よるものかの切りわけが出来ないです。自分でログを出力して すべてのシートに命令を出しているか確認して下さい。 命令を出している事が確実に分かったなら、何らかの設定が 違うのでしょう。怪しいのは、 ・設定する文字列に含まれる特殊コード ・設定する文字列の長さ ・シェイプのサイズ ・シートの保護、ロックとの組合せ ・Excelの表示更新設定 ・Excelの自動計算設定 とか。 テスト用コードを書いて地道に調べるしかないですね。

tomolyu
質問者

お礼

ありがとうございました。 次回より、ログ出力なども視野に入れて取り組もうと思います。

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.2

質問のコードをシート小数例でシェイプの四角でやってみましたが、おかしいところは発見できない。 For Each objShp In ActiveSheet.Shapes  の後に MsgBox objShp.Name または  MsgBox sht.Name & " " & objShp.Name   を入れて問題の個所のオブジェクトの名前が「カテゴリ名表示」かチェックする。 もちろんシートの表示・表示しないを勘案すること。 またはそのオブジェクトをとらえて、シートの左上の名前ボックスに「カテゴリ名表示」と出るかどうかチェックしては。 ーー こういうバグの質問は、所詮原因究明は無理でしょう。 パソコンにも触っつて確認したり出来ず、データやオブジェクトもわからないから。 読者側で追試行が出来る状態を示せなければ。 数日置いておいて適当な解答が付かなければ、あきらめてください。

tomolyu
質問者

お礼

ご助言、ありがとうございました。

  • end-u
  • ベストアンサー率79% (496/625)
回答No.1

画面描画更新がおいついていないのかもしれませんね。 実行中ちらつきますが、下記コードだとどうなりますか? For Each sht In Worksheets   If sht.Visible = True Then     For Each objShp In sht.Shapes       'カテゴリ名表示というオートシェイプがあるかチェック       If objShp.Name = "カテゴリ名表示" Then         sht.Activate         '存在すれば、カテゴリ名をセット         objShp.TextFrame.Characters.Text = カテゴリ名         Application.ScreenUpdating = True         Exit For       End If     Next   End If Next

関連するQ&A

  • エクセルVBAでオートシェープを識別して削除したいのです・・・

    エクセルシートにたくさん貼り付けた画像を一度に削除するため、下記のようなマクロを作成しました。 しかし、これでは「テキストボックス」や「→」のようなオートシェープも全部消えてしまいます。 画像データ(図)だけを認識して消すにはどうすればよいのでしょうか? Sub sakujo() Dim Myshape As Shape For Each Myshape In ActiveSheet.Shapes If Myshape.Type <> msoFormControl Then Myshape.Delete End If Next End Sub

  • シート上のオートシェイプをすべて非表示にしたい

    マクロで ActiveSheet.Shapes.Visible = False と作って見ましたが、だめでした。 シート上のオートシェイプをすべて非表示にしたい時は、マクロではどのようにすれば良いでしょうか? よろしくお願い致します。 Excel2002 WINXP

  • 指定範囲内のオートシェイプを数えるには?

    I5:I24の範囲内のオートシェイプの数を数え、I25に合計数を表示させるマクロを作っているのですが、どうしても範囲指定の仕方が分かりません。教えてください。 'オートシェイプの合計数算出 Dim shp As Object Dim cnt As Long For Each shp In ActiveSheet.Shapes If shp.Type = msoAutoShape Then If shp.TopLeftCell.Column = 9 Then cnt = cnt + 1 End If End If Next shp Range("I25").Value = cnt このマクロのどこにどう入れればよいでしょうか?

  • JavaScriptで書き出したオートシェイプにテキストを挿入したいの

    JavaScriptで書き出したオートシェイプにテキストを挿入したいのですができません。 先日、ExcelのシートにJavaScriptでオートシェイプを書き出す方法を質問した者です。 今度は書き出したオートシェイプにテキストを挿入したいのですが上手くいきません。 どうすれば良いのか教えてください。 ※またもやJavaScriptで解決したいです。 なお、現在悩み中のソースは以下のようです。 ※教えて頂いたソースほとんどそのままですが... function createShapes() { var excel = new ActiveXObject( "Excel.Application" ); excel.visible = true; var sheet = excel.Workbooks.Add().activeSheet; // オートシェイプ挿入:引数の105は吹き出しを示す sheet.Shapes.AddShape(105, 123, 37.5, 151.5, 94.5); // ココでメソッド、プロパティがないとエラーになってしまう...  sheet.Shapes("AutoShape 1").Characters.Text = "ほげほげ"; } よろしくお願いします。

  • VBAでオートシェープのテキストを取得の際、ShapesとDrawingObjects?

    エクセル2003です。 オートシェープの基本図形の「額縁」に以下のマクロを登録しました。 マクロを呼び出したオートシェープに表示してあるテキストを取得しようとするものです。 Sub test() x = Application.Caller MsgBox ActiveSheet.Shapes(x).Characters.Text End Sub ところが実行時エラーとなってしまいます。 試行錯誤の結果、ShapesをDrawingObjectsに変えるとうまくいきます。 なぜでしょうか?

  • ExcelVBA オートシェイプについて

    セルの選択した場所のとなりにオートシェイプを移動させるマクロを組みたいと思っています 見かけがまったく同じシートが4枚あり、そのシート全てに同じマクロを指定したいのですが、オートシェイプの名前の指定の仕方が分からなく困っています SelectionChangeイベントでオートシェイプ移動のマクロを動かしているので、同じ名前のボタンならよいのですが・・・ なにかよい方法はないでしょうか?

  • オートシェイプが消えたり出たりする

    Windows 7+ Excel 2013を利用しています。 オートシェイプを200個位(四角、丸)入れています、重ね合わせはありません。 エクセルで職場のレイアウトを作成・更新しているのですが、 突然、全てのオートシェイプが表示されなくなり、オートシェイプがあるあたりの セルをクリックしたら、幾つかのオートシェイプが表示され、マウスを動かすと オートシェイプが消えてしまいます。 また、別のセルをクリックしたら、先とは、違うパターンで幾つかオートシェイプが 表示され、マウスを動かすと、何個かオートシェイプが表示されたまま、他のが消えます。 オブジェクトの選択と表示では、全て表示になっていますが、一旦、全て非表示にして、全て表示にしても、全く、オートシェイプが表示されません。 慌てて、保存せずに、終了して、パソコンを再起動、変になったエクセルブックを開いても直っていません。 仕方なく、先月のブックをコピーして、修正しています。 変になったエクセルブックですが、他のパソコン何台かで開いても同じようになります。 マクロでもあるのかと思い、Alt + F10を押してみましたが、コードは書かれていません。 諦めかけていたら、調べていないPCから開いたら、表示されています。 そこで、そのPCで上書き保存してから、変になったPCで開いたら、表示されています。 何故なんでしょうか? エクセルブックは、壊れてなかったんでしょうか?

  • オートシェイプの文字列の抽出について

    エクセルのマクロについて教えてください。 今、オートシェイプで四角が描いてあり、その中にテキストで他のエクセルブックへのパスが記入してあります。 この状態から、オートシェイプ内のパスのブックを開き、開いたブックに何らかの処理をして、開いたブックを閉じるという処理をしたいと考えております。 処理を始めるトリガーは、他のオートシェイプをクリックするなどを考えております。 いろいろ試してみたのですが、オートシェイプ内に記述してあるテキストを抽出する方法が思いつきませんでした。(ここで使われているのはテキストボックスではなく、四角のオートシェイプです。) お詳しい方、どのようにすればよいか教えてください。 よろしくお願いいたします。

  • オートシェープをグルーピングして動作させたい

    office365 2つのオートシェープをグルーピングして図形を動作させたい 下記で kibanは平行四辺形のオートシェープ yajirushiは右向き矢印のオートシェープ で、それぞれ、ある範囲で左から右に移動を繰り返します。 この2つのオートシェープをグルーピングして 平行四辺形の右側に矢印を配置した状態で、そのグルーピングされた図形の動作を繰り返す様にしたいのですが、 その内容が分からないのでコードで教えていただきたく、よろしくお願いします。 #If Win64 Then Private Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As LongPtr) #Else ' Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) #End If Sub kiban() shape_delete Dim ws2 As Worksheet Dim i As Integer Set ws2 = Sheets("sheet1") ws2.Shapes.AddShape(msoShapeParallelogram, 2265, 354, 46, 20).Select With Selection.ShapeRange.Fill .Visible = msoTrue .ForeColor.RGB = RGB(0, 176, 80) .Transparency = 0 .Solid End With ws2.Shapes.AddShape(msoShapeParallelogram, 2265, 458, 20, 20).Select ws2.Shapes(ws2.Shapes.Count).name = "kiban" For i = 0 To 30 If i = 30 Then i = 0 End If ws2.Shapes(1).Left = i * 3 + 365 ws2.Shapes(1).Top = 458 Sleep 100 DoEvents Next i ws2.Shapes("kiban").delete End Sub Sub yajirushi() shape_delete Dim ws As Worksheet Dim i As Integer Set ws = Sheets("sheet1") ws.Shapes.AddShape msoShapeRightArrow, 2265, 458, 20, 20 ws.Shapes(ws.Shapes.Count).name = "yajirushi" For i = 0 To 30 If i = 30 Then i = 0 End If ws.Shapes(1).Left = i * 3 + 420 ws.Shapes(1).Top = 458 Sleep 100 DoEvents Next i ws.Shapes("yajirushi").delete End Sub Sub shape_delete() Dim shp As Shape Dim rng As Range Range("P22:CM28").Select If TypeName(Selection) <> "Range" Then Exit Sub For Each shp In ActiveSheet.Shapes '‘ 図形の配置されているセル範囲をオブジェクト変数にセット Set rng = Range(shp.TopLeftCell, shp.BottomRightCell) '‘ 図形の配置されているセル範囲と '‘ 選択されているセル範囲が重なっているときに図形を削除 If Not (Intersect(rng, Selection) Is Nothing) Then shp.delete End If Next End Sub

  • excel VBA オートシェイプのテキスト段落

    おはようございます。 【オートシェイプ内のテキスト行間を指定するプロパティ】 オートシェイプ内のテキスト行間を指定するプロパティはありますでしょうか? excel 2007で オートシェイプにテキストをいれた場合、 右クリックすると「段落」という項目がでてきて、 オートシェイプ内のテキストの行間を指定できたのですが、 オートシェイプ内のテキストの行間をVBAで指定することはできるのでしょか? (マクロを登録してもなにも記述されていないので、困っています。) 最終的にはアクティブブックの全シートのオートシェイプの行間を変更する VBAにしたいと思っています。 参考URL等あれば教えていただけませんでしょうか? よろしくお願いいたします。

専門家に質問してみよう