4

複数行のテキスト セルの最初の行の色 (または太字のテキスト ...) を書式設定する必要があります。だから例えば私は得た

=myfunction (firstLine, secondLine)、これにより (1 つのセル内) が生成されます。

    firstLine (vbLf)
    secondLine

しかし、私は生産する必要があります

    **firstLine** (vbLf)
    secondLine

(最初の行は太字です) したがって、文字列の一部だけをフォーマットしますが、VBA 関数内にあります。Sub内で次のようなことを行うことができます

    lngPos = InStr(myCell.Value, vbLf)
    With myCell.Characters(Start:=1, Length:=lngPos - 1).Font
        .FontStyle = "Bold"
    End With

しかし、可能であれば、関数内でそれを行う方法を見つけることができません。

4

2 に答える 2

2

ユーザー定義関数 (UDF) から値を返すこと以外はできません。ただし、変更でワークシート イベントをトリガーしてから、データを更新することができます。関連するシートのモジュールにこれを追加します。Range("J6:J10") を監視する必要がある範囲に変更し、太字/追加のコードを追加します。

Private Sub Worksheet_Change(ByVal Target As Range)

    If Not Intersect(Target, Range("J6:J10")) Is Nothing Then

        ' do something on the cells

    End If

End Sub
于 2012-12-06T22:49:09.587 に答える
0

直接の変更を待つのではなく、コードを介して更新をトリガーする場合 (セルをフォーマットしてもChangeイベントはトリガーされません)、単純なサブルーチンを介して強制的に実行できます。

意図しないループを避けるためEventsに、イベントを操作するときは常に無効にする必要があります。Change書式設定によってイベント自体がトリガーされることはありませんが、さらにコードを変更/追加することでトリガーされる可能性があります - このリスクを軽減するための良い方法

通常のモジュール

Sub MakeUpdate()
Sheets(1).[a1:a10].Formula = Sheets(1).[a1:a10].Formula
End Sub

Sheet(1) のシート コードで

Private Sub Worksheet_Change(ByVal Target As Range)
Dim rng1 As Range
Dim rng2 As Range
Set rng1 = Intersect(Target, [a1:a10])
If rng1 Is Nothing Then Exit Sub
With Application
.ScreenUpdating = False
.EnableEvents = False
End With
For Each rng2 In rng1.Cells
rng2.Characters(1, InStr(rng2.Value, vbLf) - 1).Font.FontStyle = "Bold"
Next
With Application
.ScreenUpdating = True
.EnableEvents = True
End With
End Sub
于 2012-12-07T00:37:28.647 に答える