2010-08-05 4 views
1

기본적으로 저는 양방향 대화 형 차트를 만들 수있는 VB.NET 2010에서 Excel 2007 프로젝트를 코딩했습니다. 사용자가이 통합 문서를 저장하고 다시 열 수 있으며 이미 만든 차트에서 계속 대화 형 작업을 수행 할 수 있기를 원하기 때문에 다시 만들 필요가 없습니다.Microsoft.Office.Interop.Excel.Chart 개체를 Microsoft.Office.Tools.Excel.Chart 개체로 변환 할 수 있습니까?

차트를 만들 때 이벤트를 처리 할 수있는 Microsoft.Office.Tools.Excel.Chart를 반환하는 Sheet1.Controls.AddChart (...)를 사용합니다. 그러나 파일을 다시 열어서 Sheet1.Controls 컬렉션을 살펴보면 Chart 개체가 없습니다. Sheet1.ChartObjects.Chart를 통해 차트에 액세스하면 도구 차트가 필요할 때 Interop 차트가 제공됩니다.

더 좋은 방법이 있나요? 나만의 Interop 차트를 사용해야할까요?

답변

1

MSDN article에 따르면 HasVstoObject 및 GetVstoObject 메서드를 사용하여 native object into a host control.을 변환 할 수 있습니다.하지만 문서에서 특별히 차트 개체를 언급하지는 않습니다.

+0

을 http://msdn.microsoft.com/en-us/library/cc442765.aspx에 따르면 을 Microsoft.Office.Tools.Excel을 다시 만들려면 .Chart 호스트 컨트롤을 사용하려면 먼저 기본 Microsoft.Office.Interop.Excel.Chart를 삭제 한 다음 AddChart (Range, String) 또는 AddChart (Double, Double)를 사용하여 Microsoft.Office.Tools.Excel.Chart를 다시 만들어야합니다. 더블, 더블, 더블, 스트링) 방법. 기존 Microsoft.Office.Interop.Excel.Chart를 기반으로 Microsoft.Office.Tools.Excel.Chart를 새로 만들 수있는 Add 메서드는 없습니다. _Startup에서 완전히 다시 만들어야하는 것처럼 보입니다. – Paul

1

폴. 문제가 해결되지 않을 경우 미리 사과드립니다. 지금까지 두 가지 유형의 차트가 있다는 것을 깨닫지 못했고 그 차트의 문제점을 이해하는 데 관심이있었습니다. 어쨌든, 주위를 속일 때 나는 차트를 만들 수 있었고, 이름을 지정하고, 지속시키고, 이벤트에 응답 할 수있었습니다. 그래도 상호 운용성 차트에 의존 않습니다

Public Class ThisWorkbook 
    Dim clsChart As cChart 

    Private Sub ThisWorkbook_Startup() Handles Me.Startup 
     Dim coChartObj As Microsoft.Office.Interop.Excel.ChartObject 
     Dim chtMyChart As Microsoft.Office.Interop.Excel.Chart 
     Dim i As Int32 

     With Globals.Sheet1 
      For i = 1 To .ChartObjects.count 
       If .ChartObjects(i).Name = "MyChart" Then 
        chtMyChart = .ChartObjects(i).chart 
        Exit For 
       End If 
      Next i 
      If chtMyChart Is Nothing Then 
       chtMyChart = .Shapes.AddChart.Chart 
       chtMyChart.SetSourceData(.Range("A1:B2")) 
       coChartObj = chtMyChart.Parent 
       coChartObj.Name = "MyChart" 
      End If 
      clsChart = New cChart 
      clsChart.chtChart = chtMyChart 
     End With 
    End Sub 
End Class 

Public Class cChart 
    Public WithEvents chtChart As Microsoft.Office.Interop.Excel.Chart 

    Private Sub chtChart_Resize() Handles chtChart.Resize 
     MessageBox.Show("resize") 
    End Sub 
End Class 
+0

안녕하세요, 코드에서 해당 차트의 이벤트를 처리 할 수 ​​있었습니까? 내 경험에 비추어 볼 때 필자는 Microsoft.Office.Tools.Excel.Chart를 사용하여 WithEvents를 선언해야만 이벤트가 적절하게 트리거되어 내 코드에서 처리되도록해야했습니다. Interop의 다양한 기능만으로이 작업을 수행 할 수 있었다면 알려주십시오. 감사! – Paul

+0

Paul, 저는 약간의 .Net을 가진 VBA 프로그래머입니다. 따라서 VBA에서 어떻게 할 수 있을까요? 저는 cChart라는 클래스를 만들었습니다. (지금은 코드 끝 부분에 나와 있습니다). 설명 된대로 WithEvents 차트가 포함되어 있습니다. 데모를위한 Resize 이벤트가 포함되었습니다. 그런 다음 내에서 ThisWorkbook 코드에서 나는 상단에 cChart로 clsChart을 선언하고 그 끝 부분이 개 라인 차트에서 WithEvents에 새로 또는 이전에 만든 차트를 할당합니다 clsChart = 새 cChart clsChart.chtChart = chtMyChart 최선을 이것을 테스트하는 방법은 그것을 게시하고, 통합 문서를 열고, 변경하고, 저장하고, 다시 열어 보는 것입니다. –

+0

안녕하세요. Doug, 상당히 합리적인 것 같습니다. 첫 번째로 도구 차트를 사용하는 이유 중 하나는 그것이 Sheet1.Controls.AddChart (...)에 의해 반환 된 개체 유형이라는 것입니다. 필자는 매개 변수에서 차트의 이름을 설정할 수 있기 때문에이 함수를 사용하는 것을 좋아합니다. Interop 버전에서 작업 할 수있는 방법을 찾을 수 있는지 보겠습니다. Interop 버전으로 이벤트가 제대로 실행되는 데 문제가있는 것처럼 느껴졌지 만, 시도하는 동안 얼마 전 이었으므로 기회가 생겼을 때 다시 한 번 시도해 보겠습니다. 감사! – Paul

관련 문제