5

チャートのplotarea.widthプロパティを設定しようとしているサブルーチンでエラーが発生しています。

ここに画像の説明を入力してください

前の行をコメントアウトすると、他のディメンションでもこのエラーが発生します。ActiveChartや選択などがありません。具体的なエラーメッセージは次のとおりです。「-2147467259(80004005)オブジェクト「PlotArea」のメソッド「幅」が失敗しました」

これはいくつかの理由で私を困惑させています:

  • デバッグモードでは、F8を押してコードをステップ実行してもエラーは発生しません。
  • AFAIKの「幅」は「メソッド」ではなく、チャートのプロットエリアの「プロパティ」であるため、エラーメッセージでさえかなりあいまいです。

何かご意見は?共有できるコード、ChartSizeMediumサブルーチン全体、およびチャートを確立して、別の関数に渡す前にサイズとその他のプロパティを設定するサブに渡す方法を示すダミースニペットを次に示します。系列データをグラフに追加します。

    Option Explicit
    Private Sub EstablishChartObject()
    Dim cObj as ChartObject
    Set cObj = ActiveSheet.ChartObjects.Add(Left:=30, Top:30, Width:=740, Height:=300)
        ChartSizeMedium cObj.Chart, "Integer", "Example Chart Title"
    End Sub
    Private Sub ChartSizeMedium(cht As Chart, NumType As String, Optional chtTitle As String)
    'Subroutine to make a consistent size chart
    Dim s As Long
    With cht
    'Add a chart title if one exists.
        If Len(chtTitle) > 0 Then
        .HasTitle = True
        .chartTitle.Characters.Text = chtTitle
        End If
    'Create the default chart Legend
        .HasLegend = True
        With .Legend
        .Position = xlTop
        .Font.Size = 11
        .Font.Bold = True
        End With
    'Format the axes
        .Axes(xlValue).MajorGridlines.Format.Line.Visible = msoFalse
        .Axes(xlValue).MinorGridlines.Format.Line.Visible = msoFalse

    'Format the size of the chart
        With .Parent
        .Width = 740
        .Height = 396
        End With

        With .PlotArea
        .Width = 640    '<---- THIS LINE TRIGGERS THE ERROR
        .Height = 280
        .Left = 30
        .Top = 30
        End With
    End With
    'Some charts start with more than one series container, so make sure they're gone:
    With cht
    Do Until .SeriesCollection.Count = 0
    s = .SeriesCollection.Count
    .SeriesCollection(s).Delete
    Loop
    End With
    End Sub

更新2012年12月12日

問題のないコードをすべて削除し、ブロック付きのPlotAreaのみを使用します。同じルーチンで、グラフの種類(いくつかの値)を設定し、この例に示すように、設定を試みる前に1つの一連のデータを手動で追加しました。 PlotAreaディメンションですが、エラーが解決しません。

Option Explicit
Private Sub EstablishChartObject2()
    Dim cObj As ChartObject
    Dim sh As Worksheet

    Set sh = ActiveSheet
    Dim srs As Series
    Set cObj = sh.ChartObjects.Add(Left:=30, Top:=30, Width:=740, Height:=300)
    Set srs = cObj.Chart.SeriesCollection.NewSeries

    srs.Values = "={1,3,5,7,4}"
    cObj.Chart.ChartType = 57

    With cObj.Chart.PlotArea
        .Width = 100   '<---- THIS LINE TRIGGERS THE ERROR
        .Height = 280
        .Left = 30
        .Top = 30
    End With

End Sub
4

6 に答える 6

4

私も同様の問題を抱えていました。そして、それは間違いなく優れた問題です(2013年)。

With .PlotArea 
    .Select 'err if delete this line of code
    .Top = 0
    .Left = 0
    .width = 40
    .Height = 40 
End With

行を削除する.selectと、次の行でエラーが発生します。< with selectiondostuff>を使用していないことに注意してください。選択を使用せずに動作させるので、.select明らかに優れたバグです(以前のバージョンから?)

于 2016-06-10T15:50:48.133 に答える
3

動作しているように見える2つのソリューションは、どちらも私が好むほど「エレガント」ではありません(チャートまたはその一部を選択することでこれを行う方法があることを望んでいました)。

オプション1-プロット領域を選択してから選択を解除します。 これは最も信頼性が高く効率的なソリューションのようです。

With .PlotArea
    Application.ScreenUpdating = False
   .Select
    With Selection
        .Width = paWidth
        .Height = paHeight
        .Left = paLeft
        .Top = paTop
        ActiveSheet.Range("A1").Activate
    End With
    Application.ScreenUpdating = True
End With

オプション2-ループ内のエラー処理を無効にします(これはDougのリンクから続きます)。これはあまり信頼性が高く効率的な方法ではないようです。機能しているように見えますが、そのループ内では、後続のパスでプロパティを正常に設定する前に、各プロパティで1回失敗していることがわかります。

With .PlotArea
    For pLoop = 1 To 5
        On Error Resume Next
        .Width = paWidth
        .Height = paHeight
        .Left = paLeft
        .Top = paTop
        On Error GoTo 0
    Next
End With
于 2012-12-11T16:32:58.327 に答える
1

シートとチャートに最大幅を取得できることを願っています640その場合は、明示的な参照を試してください。width, heightまた、値を低い値に変更して、プログラムがどのように応答するかを確認することをお勧めします。あなたが言ったので、あなたがselectそれが働くとき、

  • これは、正しいチャートオブジェクトをラップしていることも意味します。cht特に、を使用してチャートを選択した場合を除きますActiveChart.PlotArea.Width。したがって、明示的な参照が試してみる可能性があると思います。

cht.PlotArea.Width = 640
cht.PlotArea.Height = 280
cht.PlotArea.Left = 30
cht.PlotArea.Top = 30

さらに、Aspect Ratioロックまたはロック解除を確認します。これらのいずれも機能しない場合は、チャートをシートに追加し、最も単純なチャートフォーマットコードを使用して変更を確認しwidht, height, left, topます。


2つ更新

チャートタイプを指定し、2番目にもチャートオブジェクトを設定してみましょうsub。私は最後に試してみましたが、うまくいきました。次の変更を加えてコードを試してください。

コード:シートに示されているボタンからこのサブを呼び出す。

Option Explicit

  Public Sub EstablishChartObject()
  Dim mySheet As Worksheet
  Dim cObj As ChartObject

    Application.ScreenUpdating = False
    Application.StatusBar = "Chart is coming soon..."

    Set mySheet = Sheets(2) '-- set according to yours
    '-- create chart with some source data first, which you can change later
    Set cObj = mySheet.ChartObjects.Add(Left:=30, Top:=30, Width:=400, Height:=200)
    ChartSizeMedium cObj, "Integer", "Example Chart Title"
        
  End Sub


  'Subroutine to make a consistent size chart
  Private Sub ChartSizeMedium(chtObj As ChartObject, NumType As String, _
                                  Optional chtTitle As String)
    
  Dim myChart As Chart
  Dim s As Long
    
     Set myChart = chtObj.Chart '-- specify chart type
     myChart.SetSourceData Source:=Sheets(2).Range("B3:C12")  '-- set to what you have
     myChart.ChartType = xlXYScatterLines  '-- set to the type you want 
                                          'and make sure to **use correct properties**

        With myChart
            If .HasTitle Then
                .ChartTitle.Characters.Text = chtTitle
            End If
        
            'Create the default chart Legend
            If .HasLegend Then
                With .Legend
                    .Position = xlTop
                    .Font.Size = 11
                    .Font.Bold = True
                End With
            End If
            
            'Format the axes
            With .Axes(xlValue)
                .HasMajorGridlines = False
            End With
                    
            'Format the size of the chart
            With .Parent
                .Width = 400 '-- change to yours
                .Height = 250 '-- change to yours
            End With
    
            With .PlotArea
                .Width = 300 '-- change to yours
                .Height = 180 '-- change to yours
                .Left = 30
                .Top = 30
            End With
    End With

    Application.ScreenUpdating = True
    Application.StatusBar = "Chart is Here!"

End Sub

Otput:

ここに画像の説明を入力してください

グラフの種類ごとに正しいプロパティを使用してください。上記のコードは、シートから残った古いグラフを削除しないことに注意してください。

.MajoreGridlines.Format.Lines.Visible失敗します。したがって.MajorGridlines = False、グリッド線を表示したくないことを確認するようにを設定します。他にやりたいことは後で行うことができます。最初に寸法を変更してみてください。

参照元:MSDNGridlinesプロパティ

于 2012-12-11T13:07:58.280 に答える
1

私はこれが古いことを知っています、そしてこの解決策は悪いようです、しかしそれは働きます。あなたが作品をステップスルーすると言っているように、私はそれをやろうと思っただけです。

Option Explicit

Sub chart()

Dim cObj As ChartObject
Dim sh As Worksheet

Set sh = ActiveSheet
Dim srs As Series
Set cObj = sh.ChartObjects.Add(Left:=30, Top:=30, Width:=740, Height:=300)
cObj.chart.ChartType = 57
Set srs = cObj.chart.SeriesCollection.NewSeries
    srs.Values = "={1,3,5,7,4}"
Application.Wait Now + TimeValue("00:00:01") '<~~ Added This line
With cObj.chart.PlotArea
    .Width = 100
    .Height = 280
    .Left = 30
    .Top = 30
End With
End Sub
于 2013-04-16T15:56:29.107 に答える
1

編集:これは一部のグラフタイプでは機能するようですが、他のグラフタイプではまだ失敗していました。私は引き続き5xループを使用してきましたが、On Error Resume Nextこれは残念ながら、これまでで最も「信頼できる」ソリューションのようです。

オリジナル:これは、上記のUser2140261の提案された回答に基づいています。

https://stackoverflow.com/a/16041640/1467082

質問が最初に投稿されたため、アプリケーションは現在PowerPointにあるため、を使用できませんApplicaiton.Wait。1秒間の一時停止で断続的なエラーが発生し、3秒間の一時停止が長すぎるため、次のエラートラップを作成しました。同じアイデアをExcelで。と組み合わせて使用​​することもできますApplication.Wait

私にフィットを与えていたのはこのコードのブロックだったので、Powerpointにこのエラー処理を追加してを模倣しましたApplication.Wait

RetryChartDimensions:
On Error GoTo ErrChartDimensions
With .PlotArea
    .Width = paWidth
    .Height = paHeight
    .Left = paLeft
    .Top = paTop
End With
On Error GoTo 0

' More code
' more code

Exit Sub 'gracefully exit this subroutine before the error-handling.'

ErrChartDimensions:
Err.Clear
'Pause before setting the PlotArea dimensions:'
Dim wtTime As Double
Dim startTime As Long

'A maximum 3 second delay should be more than enough time.
If wtTime < 3 Then
    wtTime = wtTime + 0.5
    startTime = Timer
    While Timer < startTime + wtTime
        DoEvents
    Wend
End If
Resume RetryChartDimensions

End Sub
于 2013-04-16T16:46:30.197 に答える
0

コメントを追加するのに十分な評判がないため、上記のソリューションを使用して、VB.Net2010およびExcel2013の円グラフの問題を修正しました。xlLineグラフで問題が発生することはありませんが、同じコードを使用するとコードがクラッシュします。 Excel 2013のxlPieグラフに対して実行されました(Excel 2007ではすべて問題ありませんでした)。

私の現在機能しているコード:

    appExcel.Visible = False
    xlchart_for_96_Well_Plate_Source = appExcel.Charts.Add(After:=wkbExperiment_Details.Sheets(wkbExperiment_Details.Sheets.Count))
    appExcel.ScreenUpdating = False

    With xlchart_for_96_Well_Plate_Source
            .SetSourceData(Source:=wksData.Range(wksData.Cells(2, byteCharts_added), wksData.Cells(intUsed_Rows, byteCharts_added)), PlotBy:=Microsoft.Office.Interop.Excel.XlRowCol.xlColumns)
            .ChartType = objChart_Type
            .PlotArea.Select() 
            .PlotArea.Top = 2
            .PlotArea.Select()
            .PlotArea.Left = 2
            .SeriesCollection(.SeriesCollection.count).xvalues = wksData.Range(wksData.Cells(2, 1), wksData.Cells(intUsed_Rows, 1)).Value ' Scale - wavelength for line chart
            .SeriesCollection(.SeriesCollection.count).Values = wksData.Range(wksData.Cells(2, byteCharts_added + 1), wksData.Cells(intUsed_Rows, byteCharts_added + 1)).Value
            .SeriesCollection(.SeriesCollection.count).Name = wksData.Cells(1, .SeriesCollection.count + 1).value
    End With
appExcel.ScreenUpdating = True
于 2015-06-24T10:10:34.893 に答える