dポイントプレゼントキャンペーン実施中!

こんにちは。
タイトルの件で、投稿いたします。

【現状】
・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

'==================================================================

以上、原因をご存じの方や思い当たる節がある方、どうかご教示ください。
わかりにくい部分などがありましたら、ご指摘いただければ追記させていただきます。
よろしくお願いいたします。

A 回答 (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の切り換えで対処できるのではないでしょうか。
    • good
    • 0
この回答へのお礼

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

お礼日時:2011/10/03 10:28

コードに不備があるとすれば、


sht.Activate
sht.Shapes("カテゴリ名表示").Select
の2箇所。
Active系とかSelect系の命令は失敗しやすいので
使わないようにし、オブジェクトに直接命令します。

まぁ、ただし、失敗した場合はデータが更新されないでしょう
から、クリックしようが何しようが更新されないはず。
> この場合、「カテゴリ名表示」のオートシェイプをクリックすることにより、
> オートシェイプのテキストが更新されます。
更新されないから「何度もプログラムを実行して、その後に
クリックしてみた」というのでもないと当てはまらない。

プログラムからは、いつ、どのシートの更新に命令したのか
確認しないと、プログラムの問題なのか、Excel の仕様に
よるものかの切りわけが出来ないです。自分でログを出力して
すべてのシートに命令を出しているか確認して下さい。

命令を出している事が確実に分かったなら、何らかの設定が
違うのでしょう。怪しいのは、
・設定する文字列に含まれる特殊コード
・設定する文字列の長さ
・シェイプのサイズ
・シートの保護、ロックとの組合せ
・Excelの表示更新設定
・Excelの自動計算設定
とか。

テスト用コードを書いて地道に調べるしかないですね。
    • good
    • 0
この回答へのお礼

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

お礼日時:2011/10/03 10:29

質問のコードをシート小数例でシェイプの四角でやってみましたが、おかしいところは発見できない。


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

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

お礼日時:2011/10/03 10:30

画面描画更新がおいついていないのかもしれませんね。


実行中ちらつきますが、下記コードだとどうなりますか?
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
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!