4

曲線のあるExcelのグラフがあります。曲線は、時間に応じた株価を表します (つまり、基本的には列 A に日付を、列 B に価格とチャートを入力します)。

チャートの各ポイントには、次のようなデータラベルテキストがあります

Charts("CHART").SeriesCollection(1).Points(Numpoint).DataLabel.Text = numcomptagesetup & vbCrLf & numcomptagecountdown

「numpoint」は、ポイント 1 から最後のポイントまでの変数です。「numcomptagesetup」と「numcomptagecountdown」は、「numcomptagesetup」の場合は 1 から 6、「numcomptagecountdown」の場合は 1 から 15 の値です。

上記のコードは、「numcomptagesetup」と書いてから 2 行ジャンプしてから「numcomptagecountdown」と書いています。

必要なのは、2 つの信号に応じて、「numcomptagesetup」の色を緑または赤に変更し、「numcomptagecountdown」の色も緑と赤に変更することです。したがって、場合によっては、同じ datalabeltext に 2 つの異なる色を含める必要があります。

私はこのループを書きましたが、少なくとも最初は (段階的な方法で) 動作し、その後すべてが変化し、色が適切な場所にありません (緑ではなく赤、またはその逆) ... 本当に奇妙です デフォルトでは、すべてのポイントが緑で、必要に応じてポイントの色を赤に変更します:

 For numpoint=1 to 100
With Charts("CHART").SeriesCollection(1).Points(Numpoint)
            .HasDataLabel = True
            .DataLabel.Text = numcomptagesetup & vbCrLf & numcomptagecountdown
            .DataLabel.Font.Size = 6
            .DataLabel.Font.Color = vbRed
            .MarkerSize = 5
End With
If Signal = 2 Then Charts("CHART").SeriesCollection(1).DataLabels.Select 
  With Charts("CHART").SeriesCollection(1).Points(Numpoint).DataLabel.Format.TextFrame2.TextRange.Characters(1, 3).Font.Fill 
    .Visible = msoTrue 
    .ForeColor
    .RGB = RGB(0, 176, 80) .Solid 
  End With 
End If

If Signal2 = 2 Then
    Charts("CHART").SeriesCollection(1).DataLabels.Select
    With Charts("CHART").SeriesCollection(1).Points(Numpoint).DataLabel.Format.TextFrame2.TextRange.Characters(4, 1).Font.Fill
        .Visible = msoTrue
        .ForeColor.RGB = RGB(0, 176, 80)
        .Solid
    End With
End If

私の問題を理解していただければ幸いです。質問できない場合は、できるだけ早くお答えします

ありがとうございました!!

4

2 に答える 2

2

私はこれに困惑しています。マクロ レコーダーでもあなたのコードに似たコードが得られますが、実行するとSeries.DataLabels のすべてのデータラベルに色が適用されます。

TextBox 図形をグラフに追加し、それらをデータ ラベルの上に直接配置するという回避策があります。次に、最後にデータラベルを削除します。

'## This is from your original code:
For numpoint=1 to 100
    With Charts("CHART").SeriesCollection(1).Points(Numpoint)
        .HasDataLabel = True
        .DataLabel.Text = numcomptagesetup & vbCrLf & numcomptagecountdown
        .DataLabel.Font.Size = 6
        .DataLabel.Font.Color = vbRed
        .MarkerSize = 5
    End With
Next

'## Now, I make some changes:
Dim srs As Series
Dim dl As DataLabel
Dim dlText As String

Set srs = Charts("CHART").SeriesCollection(1) '## I find it easier to work with objects, so I use variable "srs"

'## Delete any textboxes that might be leftover from previous.
For Each shp In cht.Shapes
    shp.Delete
Next

For Each dl In srs.DataLabels  '## object-oriented programming, use a DataLabel object variable :
    dlText = dl.Caption
    '## Add a textbox to overlay the datalabel
    Set tb = cht.Shapes.AddTextbox(msoTextOrientationHorizontal, dl.Left, dl.Top, dl.Width, dl.Height)
    With tb.TextFrame2
        .VerticalAnchor = msoAnchorMiddle
        .WordWrap = msoFalse
        .AutoSize = msoAutoSizeShapeToFitText
        With .TextRange
            .Text = dlText
            .Font.Size = dl.Format.TextFrame2.TextRange.Font.Size
            '## Apply character color format to the textbox:
            If Signal = 2 Then
                With .Characters(, 3).Font.Fill
                    .Visible = msoTrue
                    .ForeColor.RGB = RGB(0, 176, 80)
                    .Solid
                End With
            End If
            '## Apply character color format to the textbox:
            If Signal2 = 2 Then
                With .Characters(4, 1).Font.Fill
                    .Visible = msoTrue
                    .ForeColor.RGB = RGB(0, 176, 80)
                    .Solid
                End With
            End If
        End With
    End With
Next

'## Finally, turn off the datalabels that you don't need anymore.
srs.HasDataLabels = False
于 2013-06-13T15:22:25.313 に答える