suipy
@suipy

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

TextFrameオブジェクトを操作する際の1004エラーについて

Q&A

Closed

解決したいこと

マクロを作成して複数人のチームにて運用中です.
ある人の環境でのみ,".TextFrame"コマンドを使用した操作(セルに設定されたメモ内の書式変更や箱のサイズ変更)の際に,「実行時エラー ‘1004’」エラーが発生してしまいます.
何か影響を与えているExcelやPCの設定等があればご教示いただきたいです.

動作環境

  • Windows 10 Pro
  • Excel バージョン 2310 (ビルド 16924.20150)

発生している問題・エラー

image.png

該当するソースコード

If Not (ws.Cells(1, 1).comment Is Nothing) Then
    With ws.Cells(1, 1).comment.Shape
        .TextFrame.Characters.Font.Bold = False
        .TextFrame.AutoSize = True
0

1Answer

メモが設定されてないセルだとエラーになります。
if文を入れて、メモが設定されている場合だけ処理するようにすればどうでしょうか。

If Not (ws.Cells(1, 1).comment Is Nothing) Then
  With ws.Cells(1, 1).comment.Shape
      .TextFrame.Characters.Font.Bold = False
      .TextFrame.AutoSize = True
1Like

Comments

  1. @suipy

    Questioner

    ご回答ありがとうございます.

    私の説明不足で申し訳ないのですが,該当のソースコードはメモが設定されているセルにのみ実行するようにしています.

  2. 実行時エラー‘1004’となるのは、.TextFrameを書いた行ですか? Withの行ですか?

  3. @suipy

    Questioner

    .TextFrmaeを書いた行です.

  4. .TextFrmaeを書いた行です.

    CommentのShapeは存在するが、Shape.TextFrameは存在しない という事実。
    これがどういう場合のセルなのか分かりませんが、もし、この処理が無くても致命的ではないならば、if文で回避はできます。

    With ws.Cells(1, 1).Comment.Shape
      If Not (.TextFrame Is Nothing) Then
          .TextFrame.Characters.Font.Bold = False
          .TextFrame.AutoSize = True
    

    調べてみたいので、エラーが起きた時に、ws.Cells(1, 1).Comment.Shapeをウォッチ式に追加して、変数の左の+をクリック、下の方にスクロールして、TextFrameの+をクリック。
    TextFrameの+をクリックする前と、クリックした後の2枚のスクショを貼ってもらうことはできますか。

    scr1.PNG
    scr2.PNG
    scr3.PNG

  5. @suipy

    Questioner

    調べてみたいので、エラーが起きた時に、ws.Cells(1, 1).Comment.Shapeをウォッチ式に追加して、変数の左の+をクリック、下の方にスクロールして、TextFrameの+をクリック。
    TextFrameの+をクリックする前と、クリックした後の2枚のスクショを貼ってもらうことはできますか。

    承知しました.
    エラーが発現するPCが私のものではないため,キャプチャに少々お時間いただきますことご了承ください.

  6. @suipy

    Questioner

    調べてみたいので、エラーが起きた時に、ws.Cells(1, 1).Comment.Shapeをウォッチ式に追加して、変数の左の+をクリック、下の方にスクロールして、TextFrameの+をクリック。
    TextFrameの+をクリックする前と、クリックした後の2枚のスクショを貼ってもらうことはできますか。

    上記を実行してみたのですが,本マクロのWith以降のShapeオブジェクトをウォッチウィンドウに追加したところ,+マークが表示されませんでした.

    試しにセルがないBookで以下のコードを実行し,エラーを出してShapeオブジェクトをウォッチ式に追加してみたのですが,こちらも+マークが出ることがありませんでした.

    Sub main()
    
    Dim wb As Workbook
    Dim ws As Worksheet
    
    Set wb = ThisWorkbook
    Set ws = wb.ActiveSheet
    
    With ws.Cells(1, 1).Comment.Shape
        If Not (.TextFrame Is Nothing) Then
            .TextFrame.Characters.Font.Bold = False
            .TextFrame.AutoSize = True
        End If
    End With
    
    End Sub
    

    VBAの知見があまり無いため,必要な設定等ありましたらご教示ください.


    また,本件に関してはエラーが発現する方のみ,TextFrameの処理を回避するマクロを使用する方針にいたします.

  7. 上記を実行してみたのですが,本マクロのWith以降のShapeオブジェクトをウォッチウィンドウに追加したところ,+マークが表示されませんでした.

    (その状態のスクショを貼って欲しかったですが。。。)

    +マークが表示されない位置は、Shapeの左側ですか?
    (私が添付したスクショの一枚に相当する場所)

    もし、そうであれば、Withの行がエラーになるはずですが。。。

    本件に関してはエラーが発現する方のみ,TextFrameの処理を回避するマクロを使用する方針にいたします.

    当Q&Aの扱いは、どうされますか?
    引き続き調査されるのか、回避処理を追加したので、Q&Aとしてはクローズされるのか。


    ちなみに、絶対に安全に回避するのであれば、「Commentがない場合」、「Comment.Shapeがない場合」、「Comment.Shape.TextFrameがない場合」の3重チェックするのがよいと思います。

    If Not (ws.Cells(1, 1).comment Is Nothing) Then
      If Not (ws.Cells(1, 1).comment.Shape Is Nothing) Then
        With ws.Cells(1, 1).comment.Shape
          If Not (.TextFrame Is Nothing) Then
            .TextFrame.Characters.Font.Bold = False
            .TextFrame.AutoSize = True
    (略)
    

    if文の条件をANDでつなげてるのは駄目で、一つづつif文にする必要があります。

    マクロの中にこいう処理が何度も出現する場合は、関数化してif文一つにすることができます。
    もし、必要であれば、コメントください。

  8. @suipy

    Questioner

    +マークが表示されない位置は、Shapeの左側ですか?
    (私が添付したスクショの一枚に相当する場所)

    はい,ご認識の通りです.

    当Q&Aの扱いは、どうされますか?
    引き続き調査されるのか、回避処理を追加したので、Q&Aとしてはクローズされるのか。

    本件に関してはクローズとさせていただきます.ご回答いただき誠にありがとうございます.

Your answer might help someone💌