Excel VBA質問箱 IV

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

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


566 / 76735 ←次へ | 前へ→

【81835】Re:セル内の文字色操作
お礼  こまおじ  - 21/6/20(日) 9:54 -

引用なし
パスワード
   情報提供ありがとうございます。
おかげさまで、VBAのバグということがわかり、
ロジックがまずい訳ではないと分かり助かりました。
そこで、解決方法より回避方法を模索し、
どうやら、回避出来ました。

原因はよくわからないままですが、
リボン上に現れるセルのフォント情報と、
セル内の1文字目のフォント情報が乖離している場合に、
このバグは発生するみたいです。
もう少し、VBAよりに書くと、
Range.Fontのプロパティと
Range.Characters(1, 1).Fontのプロパティの全てが一致していない場合に、
マクロ実行でRange.Characters(1以外, 1).Fontのプロパティの一部をいじると
セル内の書式情報が壊れます。

では、RangeとRange.Characters(1, 1)の情報を合わせればいいと考えるも、
VBA実行時にRange.Characters(1, 1)の情報を退避してから、
Range.Fontのプロパティ情報でプロパティに上書きし、
最後に退避した情報で元に戻してやればいいかと考えたのですが、
Range.FontのプロパティがNULLの場合(フォントサイズ等でありえます)、
データが上書きできずバグります。

詰んだかと思ったんですが、もうひとつのVBAのバグ(仕様?)があり、
Fontの情報を揃えることが出来ました。
やりかたは簡単で、Range.Characters(1, 1).Fontのプロパティを
Range.Characters(1, 1).Fontのプロパティで自身の情報で上書きすると、
Range.Fontのプロパティが自動的に同期をとります。
ただし、文字の上位置と下位置のプロパティは、
どちらか一方しか成り立ちませんので条件分岐が必要になります。

以下、解決したコードを載せておきます。

'RangeのFontプロパティを上書き。Characters(1, 1)の情報を更新するとなぜか更新される。
With Cells(対象行, 対象列).Characters(1, 1).Font
 .Name = Cells(対象行, 対象列).Characters(1, 1).Font.Name
 .FontStyle = Cells(対象行, 対象列).Characters(1, 1).Font.FontStyle
 .Size = Cells(対象行, 対象列).Characters(1, 1).Font.Size
 .Strikethrough = Cells(対象行, 対象列).Characters(1, 1).Font.Strikethrough
 .OutlineFont = Cells(対象行, 対象列).Characters(1, 1).Font.OutlineFont
 .Shadow = Cells(対象行, 対象列).Characters(1, 1).Font.Shadow
 .Underline = Cells(対象行, 対象列).Characters(1, 1).Font.Underline
 .ColorIndex = Cells(対象行, 対象列).Characters(1, 1).Font.ColorIndex
 .TintAndShade = Cells(対象行, 対象列).Characters(1, 1).Font.TintAndShade
 .ThemeFont = Cells(対象行, 対象列).Characters(1, 1).Font.ThemeFont
End With

'NULLがあるため、入れ子ではなく独立して条件の確認を行う。
If Cells(対象行, 対象列).Characters(1, 1).Font.Superscript = True Then
 Cells(対象行, 対象列).Characters(1, 1).Font.Superscript = Cells(対象行, 対象列).Characters(1, 1).Font.Superscript
End If

'NULLがあるため、入れ子ではなく独立して条件の確認を行う。
If Cells(対象行, 対象列).Characters(1, 1).Font.Subscript = True Then
 Cells(対象行, 対象列).Characters(1, 1).Font.Subscript = Cells(対象行, 対象列).Characters(1, 1).Font.Subscript
End If

'斜体文字チェック→赤文字設定
For 開始文字位置 = 1 To Len(対象セル)
 If Cells(対象行, 対象列).Characters(開始文字位置, 1).Font.Italic = True Then
  Cells(対象行, 対象列).Characters(開始文字位置, 1).Font.ColorIndex = 3
 End If
Next
16 hits

【81832】セル内の文字色操作 こまおじ 21/6/19(土) 5:30 質問[未読]
【81833】Re:セル内の文字色操作 マナ 21/6/19(土) 14:28 発言[未読]
【81835】Re:セル内の文字色操作 こまおじ 21/6/20(日) 9:54 お礼[未読]
【81836】Re:セル内の文字色操作 マナ 21/6/20(日) 12:21 発言[未読]
【81837】Re:セル内の文字色操作 マナ 21/6/20(日) 17:41 発言[未読]
【81838】Re:セル内の文字色操作 マナ 21/6/20(日) 19:05 発言[未読]
【81839】Re:セル内の文字色操作 こまおじ 21/6/21(月) 2:03 お礼[未読]
【81840】Re:セル内の文字色操作 マナ 21/6/21(月) 21:59 発言[未読]
【81844】Re:セル内の文字色操作 こまおじ 21/6/24(木) 0:51 お礼[未読]
【81834】Re:セル内の文字色操作 マナ 21/6/19(土) 16:03 発言[未読]

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