Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


8723 / 13646 ツリー ←次へ | 前へ→

【31548】コメント書換が出来ません mam 05/11/25(金) 13:48 質問[未読]
【31551】Re:コメント書換が出来ません Kein 05/11/25(金) 14:07 回答[未読]
【31554】Re:コメント書換が出来ません mam 05/11/25(金) 14:48 お礼[未読]
【31555】Re:コメント書換が出来ません Kein 05/11/25(金) 15:10 回答[未読]
【31565】Re:コメント書換が出来ません→解決 mam 05/11/25(金) 16:11 お礼[未読]

【31548】コメント書換が出来ません
質問  mam  - 05/11/25(金) 13:48 -

引用なし
パスワード
   こんにちは。いつも此方で助けていただいております。
また、皆様のお力をお借りしたくてきました。

現在以下のコードで複数ブックの複数のシートのH4セルにあるコメントの
書換処理をしようとしています。
一応動きますし、書換も行っているのですが、何シートかのみコメントが書き換えられず、前のコメントのままです。

まだまだVBAの初心者でまったく原因がわかりません。
何方か、原因と考えられる事がおわかりになるようでしたら、教えてください。
よろしくお願い致します。

For Each SH In Worksheets
 SH.Activate
 If SH.Name <> "INDEX" Then
   SH.Range("H4").Select
   Selection.ClearComments
   SH.Range("H4").AddComment
   SH.Range("H4").Comment.Text Text:= "コメント"
 End If
Next

【31551】Re:コメント書換が出来ません
回答  Kein  - 05/11/25(金) 14:07 -

引用なし
パスワード
   書き換えるだけなら、いちいちクリアしなくてもいいはずです。

For Each SH In Worksheets
  If SH.Name = "INDEX" Then GoTo NLine
  On Error Resume Next
  If Intersect(SH.Cells.SpecialCells(-4144), SH.Range("H4")) Is _
  Nothing Then GoTo NLine
  SH.Range("H4").Comment.Text "コメント"
NLine:
  If Err.Number <> 0 Then Err.Clear
  On Error GoTo 0
Next

てな感じで、どうでしょーか ?

【31554】Re:コメント書換が出来ません
お礼  mam  - 05/11/25(金) 14:48 -

引用なし
パスワード
   早速のご返答ありがとうございます。

ご掲示頂いたコードにて実行してみましたが、やはり同じシートでの
書換が出来ませんでした。
それで、ERRの表示を追加してみましたところ、書換されないコメントのシートは「シートの保護」が掛けられていました。

エラー処理を対応していなかったので、気付かずでした。申し訳ありません。
今からシートの保護有無確認をして保護が掛かっていれば、外して(←VBAでできるのでしょうか??)、コメントの書換という様に変更してみようと思います。

余談になりますが、ご掲示頂いたコードの中で
「If Intersect(SH.Cells.SpecialCells(-4144), SH.Range("H4"))・・・ 」の部分で
「Intersect」は「複数のセル範囲の共有セル範囲を表す」とHELPに
ありましたが、ここで何故このコードが必要なのか??がわからずにおります。
何故共有セルの確認が必要なのでしょうか?
勉強のためにご教授頂けると幸いです。

▼Kein さん:
>書き換えるだけなら、いちいちクリアしなくてもいいはずです。
>
>For Each SH In Worksheets
>  If SH.Name = "INDEX" Then GoTo NLine
>  On Error Resume Next
>  If Intersect(SH.Cells.SpecialCells(-4144), SH.Range("H4")) Is _
>  Nothing Then GoTo NLine
>  SH.Range("H4").Comment.Text "コメント"
>NLine:
>  If Err.Number <> 0 Then Err.Clear
>  On Error GoTo 0
>Next
>
>てな感じで、どうでしょーか ?

【31555】Re:コメント書換が出来ません
回答  Kein  - 05/11/25(金) 15:10 -

引用なし
パスワード
   >シートの保護有無確認をして保護が掛かっていれば、外して
という処理も含めるなら、変数の宣言に

Dim Flg As Boolean

を追加し

For Each SH In Worksheets
  Flg = False
  If SH.Name = "INDEX" Then GoTo NLine
  If SH.ProtectContents Then
   Flg = True: SH.Unprotect
  End If
  On Error Resume Next
  If Intersect(SH.Cells.SpecialCells(-4144), SH.Range("H4")) Is _
  Nothing Then GoTo NLine
  SH.Range("H4").Comment.Text "コメント"
NLine:
  If Err.Number <> 0 Then Err.Clear
  On Error GoTo 0
  If Flg Then SH.Protect
Next

と、します。
>ここで何故このコードが必要なのか
ループしている各シートの H4 セルが、確実にコメントをつけているかを確認
するためです。例えば「対象のセルに数式が含まれているか ?」という判定なら
HasFormulaプロパティの値を調べればよいのですが、HasCommentというプロパティ
はありませんから、SpecialCellsメソッドでコメントをつけたセルをピックアップし、
それと H4 が重なっているかを見て、コメントの有無を調べているわけです。
そうした判定によって「H4 には確実にコメントが設定されている」ということが
分かれば、単にその値を書き換えれば済む、というわけなのです。

【31565】Re:コメント書換が出来ません→解決
お礼  mam  - 05/11/25(金) 16:11 -

引用なし
パスワード
   Keinさん、丁寧なご指導ありがとうございました。
おかげで無事に仕様通りできました。
また、「Intersect」も『なるほど、なるほど、、』とパソの
前で手を叩いておりました。

▼Kein さん:
>>シートの保護有無確認をして保護が掛かっていれば、外して
>という処理も含めるなら、変数の宣言に
>
>Dim Flg As Boolean
>
>を追加し
>
>For Each SH In Worksheets
>  Flg = False
>  If SH.Name = "INDEX" Then GoTo NLine
>  If SH.ProtectContents Then
>   Flg = True: SH.Unprotect
>  End If
>  On Error Resume Next
>  If Intersect(SH.Cells.SpecialCells(-4144), SH.Range("H4")) Is _
>  Nothing Then GoTo NLine
>  SH.Range("H4").Comment.Text "コメント"
>NLine:
>  If Err.Number <> 0 Then Err.Clear
>  On Error GoTo 0
>  If Flg Then SH.Protect
>Next
>
>と、します。
>>ここで何故このコードが必要なのか
>ループしている各シートの H4 セルが、確実にコメントをつけているかを確認
>するためです。例えば「対象のセルに数式が含まれているか ?」という判定なら
>HasFormulaプロパティの値を調べればよいのですが、HasCommentというプロパティ
>はありませんから、SpecialCellsメソッドでコメントをつけたセルをピックアップし、
>それと H4 が重なっているかを見て、コメントの有無を調べているわけです。
>そうした判定によって「H4 には確実にコメントが設定されている」ということが
>分かれば、単にその値を書き換えれば済む、というわけなのです。

8723 / 13646 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free