3

Excel 2003 では正常に動作していたが、Excel 2010 では失敗した Excel VBA アプリケーションがあります。

相対コードは

Public Sub Create_Chart
    Dim c
    Dim OutputText As String
    OutputText = OutputSource
    Workbooks(NewWorkBook).Activate

    With ActiveSheet
        obj.Range(DataRange).NumberFormat = "0.0%"
        ActiveSheet.ChartObjects(1).Activate
        ActiveChart.ChartArea.Select
        ActiveChart.SetSourceData Source:=obj.Range(DataRange)
    End With
End Sub

デバッガーがこのウィンドウで ActiveChart.SetSourceData Source:=objNBR.Range(DataRange) にヒットすると、エラーメッセージが表示されます- ここに画像の説明を入力

デバッガーの DataRange は F2:R2、F3:R3 で、obj は正しい Excel フォームを指しています - ここに画像の説明を入力

ActiveChart はテンプレートからのものです - ここに画像の説明を入力

私のデバッガーは、「ActiveChart.ChartArea.Select」がtrueであることを示しています。また、ActiveChart と obj は有効なオブジェクトです。

最も重要なのは、Excel 2003 が正常に動作することです。デバッガーを使用して、Excel 2003 と 2010 の obj と ActiveChart を比較します。そして、コードの点で大きな違いは見つかりません。ActiveChart のテンプレートが 2003 年には少し異なっていることがわかります - ここに画像の説明を入力

元のテンプレートは 2010 年に表示されたものとまったく同じですが、2003 年のワーキング シートへのコピー中に自動的にゼロ設定されました。2003 年と 2010 年の相違点はこれだけです。それがこのエラーの原因になるかどうかはわかりません。

証拠を逃したかどうかはわかりません。エラー メッセージには詳細が示されていません。より多くのデバッグ情報を取得する他の方法はありますか?

誰かが問題と修正を見つけるのを手伝ってくれれば幸いです。

前もって感謝します

Edit1: obj は別のルーチンで作成され、DataRange はそのルーチンに取り込まれます -

Workbooks.Add
MyWorkbook = ActiveWorkbook.Name
Set obj = ActiveWorkbook.Worksheets(1)

次に、データが DataRange セル (F2:R2、F3:R3) に挿入されます。正しいデータが表示された Excel ファイルを確認できます。

Edit2 上記のサブの Workbooks(NewWorkBook) はこれらのコードから生成され、チャートが画面に表示された新しい Excel を確認できます -

Windows(Dir(TemplateFile)).Activate
ActiveWorkbook.Sheets("C1").Select
ActiveWorkbook.Sheets("C1").Copy
NewWorkBook = ActiveWorkbook.Name
Windows(NewWorkBook).Visible = True

Edit3 Sidのアプローチを使用して、最初にこの方法でオブジェクトを宣言します-

Public Sub Create_Chart()

    Dim wb As Workbook
    Dim ws As Worksheet
    Dim objChrt As ChartObject
    Dim Chrt As chart

    Set wb = Workbooks(NewWorkBook)
    Set ws = wb.Sheets(1)

    Set objChrt = ws.ChartObjects(1)
    Set Chrt = objChrt.chart

    With wb
        obj.Range(DataRange).NumberFormat = "0.0%"

        'Chrt.Export ("c:\temp\testChrt.gif")

        'With obj.PageSetup
         '   .PrintArea = DataRange
         '   .Zoom = False
         '   .FitToPagesTall = 1
         '   .FitToPagesWide = 1
         '   .Orientation = xlLandscape
       ' End With

       ' obj.PrintOut Copies:=1

        Chrt.SetSourceData Source:=obj.Range(DataRange)
    End With
End Sub

エラーはまったく同じです。Chrt および obj.Range(DataRange) オブジェクトを印刷して保存するためのコメント アウトされたコードがあることに注意してください。値は上記の画像 2 と画像 3 と同じです。グラフとデータがあります。なぜ「Chrt.SetSourceData Source:=obj.Range(DataRange)」がこの場合 2010 年には機能せず、2003 年には機能するのか不思議です。

4

3 に答える 3

0

上記のコメントに加えて、これはオブジェクトを宣言して操作する方法です。の使用を避ける必要があります。Activesheet/Activeworkbook/ActiveChart... etc

これも見たいかもしれませ

これはほんの一例です。必要に応じて修正してください。

Public Sub Create_Chart()
    Dim wb As Workbook
    Dim ws As Worksheet
    Dim objChrt As ChartObject
    Dim Chrt As Chart

    Set wb = ThisWorkbook
    Set ws = wb.Sheets("Sheet1")

    Set objChrt = ws.ChartObjects(1)
    Set Chrt = objChrt.Chart

    Chrt.SetSourceData Source:=ws.Range("B2:B3,I2:I3")
End Sub
于 2013-11-14T20:44:14.973 に答える
0

以下がまったく同じ問題であるとは 100% ではありませんが、近いと感じています。

以下は私にはバグのように思えます-プロパティをActiveChartサポートするのに、同じチャートを参照するオブジェクト変数がそのプロパティをサポートしないのはなぜですか?

Sub findTheChart()

Dim p_Snapshot As Excel.Workbook
Dim myChartObject As Excel.ChartObject

Set p_Snapshot = Excel.Workbooks("theBookWithTheCharts")

Dim chtName As String
Dim dayNum As Integer
Dim sourceAddress As String
Dim ws As Excel.Worksheet
Dim r As Excel.Range

Set ws = p_Snapshot.Sheets("theSheetWithTheCharts")
sourceAddress = "$AW$69:$BA$84"

For Each myChartObject In ws.ChartObjects
    chtName = myChartObject.Name

    If (chtName = "Chart_nameGiven") Then
        myChartObject.Activate

        Set r = ws.Range(sourceAddress)
        'myChartObject.SetSourceData Source:=r '<<<<<<<<<<<<doesn't work
        Excel.ActiveChart.SetSourceData Source:=r '<<<<<<<<works fine!!!
    End If
Next myChartObject


End Sub
于 2014-05-14T16:44:44.990 に答える