こんにちは。
タイトルの件で、投稿いたします。
【現状】
・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
'==================================================================
以上、原因をご存じの方や思い当たる節がある方、どうかご教示ください。
わかりにくい部分などがありましたら、ご指摘いただければ追記させていただきます。
よろしくお願いいたします。
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の切り換えで対処できるのではないでしょうか。
ありがとうございました、解決いたしました。
オートシェイプのVisibleプロパティのFalse/Trueの切り換えで、対応できました。
再現コードなど、ご助言ありがとうございました。
No.3
- 回答日時:
コードに不備があるとすれば、
sht.Activate
sht.Shapes("カテゴリ名表示").Select
の2箇所。
Active系とかSelect系の命令は失敗しやすいので
使わないようにし、オブジェクトに直接命令します。
まぁ、ただし、失敗した場合はデータが更新されないでしょう
から、クリックしようが何しようが更新されないはず。
> この場合、「カテゴリ名表示」のオートシェイプをクリックすることにより、
> オートシェイプのテキストが更新されます。
更新されないから「何度もプログラムを実行して、その後に
クリックしてみた」というのでもないと当てはまらない。
プログラムからは、いつ、どのシートの更新に命令したのか
確認しないと、プログラムの問題なのか、Excel の仕様に
よるものかの切りわけが出来ないです。自分でログを出力して
すべてのシートに命令を出しているか確認して下さい。
命令を出している事が確実に分かったなら、何らかの設定が
違うのでしょう。怪しいのは、
・設定する文字列に含まれる特殊コード
・設定する文字列の長さ
・シェイプのサイズ
・シートの保護、ロックとの組合せ
・Excelの表示更新設定
・Excelの自動計算設定
とか。
テスト用コードを書いて地道に調べるしかないですね。
No.2
- 回答日時:
質問のコードをシート小数例でシェイプの四角でやってみましたが、おかしいところは発見できない。
For Each objShp In ActiveSheet.Shapes の後に
MsgBox objShp.Name
または MsgBox sht.Name & " " & objShp.Name
を入れて問題の個所のオブジェクトの名前が「カテゴリ名表示」かチェックする。
もちろんシートの表示・表示しないを勘案すること。
またはそのオブジェクトをとらえて、シートの左上の名前ボックスに「カテゴリ名表示」と出るかどうかチェックしては。
ーー
こういうバグの質問は、所詮原因究明は無理でしょう。
パソコンにも触っつて確認したり出来ず、データやオブジェクトもわからないから。
読者側で追試行が出来る状態を示せなければ。
数日置いておいて適当な解答が付かなければ、あきらめてください。
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が見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 【Excel VBA】自動メール送信の機能追加 5 2022/09/29 12:53
- Visual Basic(VBA) VBA Userformで一部別シートに転記がしたいのですが 2 2023/05/24 13:08
- Visual Basic(VBA) ファイル全てを .xlsm に変更したところ、プログラムが途中で落ちてしまっています 17 2022/12/07 12:03
- Visual Basic(VBA) エクセルのマクロで対象ごとにシート分けしてその内容をセルに書き込みたい 9 2022/08/24 13:23
- Visual Basic(VBA) このVBAでExcelアプリケーションを作成は必要ですか? 3 2023/07/19 21:13
- Visual Basic(VBA) シート削除のマクロで「deleteメソッドは失敗しました」となります。助けてください! Sub 不要 6 2022/09/08 16:41
- Visual Basic(VBA) ユーザーフォーム「frm_基本❶」を立ち上げると新規で入力する行数を右下のNoとして表示しています。 1 2023/03/16 19:02
- Visual Basic(VBA) ユーザーフォームの表示を追加したい 2 2023/03/26 23:18
- Visual Basic(VBA) 別シートから年齢別の件数をカウントしたいの続き 5 2023/01/24 00:16
- Excel(エクセル) なぜExit Subがあるのかわかりません 4 2023/02/19 12:34
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
特定の文字を含むシートだけマ...
-
別のシートから値を取得するとき
-
同じ作業を複数のシートに実行...
-
XL:BeforeDoubleClickが動かない
-
excelのマクロで該当処理できな...
-
ユーザーフォームに入力したデ...
-
シートが保護されている状態で...
-
ブック名、シート名を他のモジ...
-
実行時エラー1004「Select メソ...
-
VBA 存在しないシートを選...
-
API関数ImmSetConversionStatus...
-
【ExcelVBA】全シートのセルの...
-
IFステートの中にWithステート...
-
マクロを使って、シート印刷完...
-
エクセル・マクロ シートの非...
-
Excelマクロのエラーを解決した...
-
ExcelのVBAのマクロで他のシー...
-
実行時エラー'1004': WorkSheet...
-
【VBA】特定の文字で改行(次の...
-
エクセルのシート名変更で重複...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
別のシートから値を取得するとき
-
VBAで大量のファイルをシート名...
-
ユーザーフォームに入力したデ...
-
excelのマクロで該当処理できな...
-
【ExcelVBA】全シートのセルの...
-
同じ作業を複数のシートに実行...
-
VBA 存在しないシートを選...
-
Excelマクロのエラーを解決した...
-
特定の文字を含むシートだけマ...
-
実行時エラー'1004': WorkSheet...
-
XL:BeforeDoubleClickが動かない
-
シートが保護されている状態で...
-
実行時エラー1004「Select メソ...
-
【Excel VBA】Worksheets().Act...
-
ブック名、シート名を他のモジ...
-
エクセルのシート名変更で重複...
-
ExcelのVBAのマクロで他のシー...
-
Excel VBA 複数行を数の分だけ...
-
エクセルのマクロについて教え...
-
VBA 最終行まで数式をコピーする
おすすめ情報