2010-02-01 4 views
2

Ce problème me rend fou.Problèmes d'interopérabilité Office 2003, interface, méthode introuvable

En fait, j'ai plusieurs problèmes.

premier:

Pourquoi diable est-il un sont _Worksheet et un Worksheetinterface dans le Interop Excel. Ils se ressemblent tous les deux, à l'exception de quelques attributs sur les méthodes.

C'est déroutant!

Deuxièmement: mon travail aujourd'hui fait un fichier VB.NET plus strict, par les paramètres Option Strict On et Option Explicit On

Bien que cela fonctionne pour la plupart des fichiers, je suis tomber sur un problème.

est ici un petit morceau de code:

Private _pivotTable As Excel.PivotTable


pvf = .AddDataField(pvc)
End With

PivotTable.AddDataField est défini sur la page MSDN: http://msdn.microsoft.com/en-us/library/microsoft.office.interop.excel.pivottable.adddatafield(office.11).aspx

Quand je consulte mes locale Interop dll w/Refle ctor cette méthode n'est pas là.
Lorsque j'exécute l'application et la parcours, la méthode fonctionne.
Lorsque j'essaie d'entrer dans la méthode, j'obtiens une exception LateBound.

WTF? Donc la question est: pourquoi les interfaces sont-elles définies plus d'une fois (parfois deux fois?).
2e question. Problème AddDataField

+0

Je n'ai pas de réponse à vos options maux explicites mais la réponse acceptée http://stackoverflow.com/questions/1051464/excel-interop-worksheet-or-worksheet va en détail à propos du problème d'interface –

+0

Mettez à jour votre publication pour afficher la déclaration de _pivotTable. –

+0

@nobugz: fait le changement :) c'est juste un champ privé. Et oui c'est instancié;) – Snake

Répondre

1

Certains des éléments qui sont censés exister selon msdn ne sont pas réellement présents dans VB. J'ai trouvé que c'était le cas plusieurs fois. Fait intéressant, ces propriétés ou méthodes sont disponibles dans VBA, mais pas dans VB.NET. Pour contourner cela, j'ai en fait créé une macro temporaire dans le fichier Excel que je suis en train d'éditer, j'ai inclus le code pour manipuler les choses que je ne pouvais pas obtenir autrement, et ensuite je l'ai exécuté. Donc, c'était en fait du code VBA écrit comme une chaîne dans VB.NET et exécuté dans Excel.

Voici le code de ce projet. Peut-être que ça vous aidera:

'---------------------------------------------------------Nitrate Graph 
     ' 
     ' 
     'Build the Nitrate graph 
     Dim objExcel As New Excel.Application 'create an Excel application object 
     Dim objWrkBk As Excel.Workbook 'create a workbook 
     Dim objSheet As Excel.Worksheet 'create a worksheet 
     Dim Range As Excel.Range 'create a range 
     Dim Chart As Excel.Chart 'create a chart 
     Dim chartObjects As Excel.ChartObjects = Nothing 'create a chartObjects instance 
     Dim existingChartObject As Excel.ChartObject = Nothing 'create a chartObject instance 

     objExcel = New Excel.Application 'start the Excel application 
     objWrkBk = objExcel.Workbooks.Add 'add the workbook to this excel application 
     objSheet = objWrkBk.Sheets.Add 'add the worksheet to the workbook object 
     objSheet = objWrkBk.Sheets(1) 'objSheet is the first sheet in the workbook 
     Chart = objExcel.Charts.Add 'add a chart to the Excel application 
     'objExcel.Visible = True 

     ''''''''''''''''''''''''''''''''''''''''''''' 
     'Create a macro to be run within the excel ' 
     'application to delete a series that is  ' 
     'otherwise undeletable.      ' 
     ''''''''''''''''''''''''''''''''''''''''''''' 

     Dim macro As VBIDE.VBComponent 'create a macro object 
     Dim sCode As String 'create a string to hold the macro programming 

retry: 'A point at which the macro creation is retried if unsuccessful 

     'Add in a macro so that Excel will delete the day as the series. 
     Try 
      macro = objWrkBk.VBProject.VBComponents.Add(VBIDE.vbext_ComponentType.vbext_ct_StdModule) 'place the macro into the workbook 
     Catch ex As Exception 'if an error occurs, catch it and do the following: 
      'If the user has not enabled access to Visual Basic a Run-time error will occur. 
      'Details on this error can be found here: http://support.microsoft.com/kb/282830/en-us 
      'Run-time error '6068': Programmatic Access to Visual Basic Project is not trusted 
      Dim Response As Integer 
      'if the error is caught, a message box will display with the following text instructions on how to fix the problem. 
      Response = MessageBox.Show("Access is denied from Microsoft Excel. You need to do the following:" & vbCr & vbCr & _ 
          " 1. Open Microsoft Office Excel 2007. Click the Microsoft Office" & vbCr & _ 
          "   button, and then click Excel Options." & vbCr & vbCr & _ 
          " 2. Click the Trust Center tab, and then click Trust Center Settings." & vbCr & vbCr & _ 
          " 3. Click the Macro Settings tab, click to select the Trust access to " & vbCr & _ 
          "  the VBA project object model check box, and then click OK." & vbCr & vbCr & _ 
          " 4. Click OK. " & vbCr & vbCr & _ 
          "Restart IX Report Gen.", "Security Access Denied", MessageBoxButtons.RetryCancel, MessageBoxIcon.Exclamation) 
      If Response = 4 Then 'If the user selected to retry they will be taken to the retry point above 
       GoTo retry 
      Else 
       End 'If the user cancels the program simply ends. 
      End If 
     End Try 

     'The macro code is put into the sCode string. 
     'Line by line, the code below is described: 

     'Sub Macro2() 
     'ActiveSheet.ChartObjects(""Chart 1"").Activate  'Activate the chart in the sheet 
     'ActiveChart.SeriesCollection(1).Select    'Select the chart's 1st data series 
     'Selection.Delete         'Delete the chart's 1st data series 
     'End Sub           'End the macro 

     sCode = "Sub Macro2()" & vbCr & "ActiveSheet.ChartObjects(""Chart 1"").Activate" _ 
       & vbCr & "ActiveChart.SeriesCollection(1).Select" _ 
       & vbCr & "Selection.Delete" _ 
       & vbCr & "End Sub" 
     'The sCode string is placed into the empty macro 
     macro.CodeModule.AddFromString(sCode) 


     'Populate the Nitrate Avegare Array 
     Dim HeadingArray(1, 1) As String 'A HeadingArray is created to place headings into the Excel sheet 
     HeadingArray(0, 0) = "Day" 'Heading 1 is Day 
     HeadingArray(0, 1) = "Nitrate Avg" 'Heading 2 is Nitrate Avg 
     Range = objSheet.Range("A1", "B1") 'Range is assigned to the cells A1 and B1 
     Range.Value = HeadingArray 'The value of the range is set to the value of the HeadingArray. A1=Day and B1=Nitrate Avg 
     'Range is now assigned to the cells from A2 to the B column and 'as many rows as are in the reporting month plus 1 
     'to accomodate the heading row. 
     Dim BNum As Integer = ArrayRows(DailyNitrateAverageArray) 
     Dim NumArray(BNum - 1, 1) As Double 
     'Transfer the string array's values into a double array 
     For i As Integer = 0 To BNum - 1 
      NumArray(i, 0) = DailyNitrateAverageArray(i, 0) 
      NumArray(i, 1) = DailyNitrateAverageArray(i, 1) 
     Next 

     Range = objSheet.Range("A2", "B" & BNum + 2) 
     Range.Value = NumArray 'The value of Range is now assigned the values of DailyAverageArray 
     Range = objSheet.Range("A1", "B" & BNum + 2) 'Range is reassigned to select the whole edited area from A1 to B# 
     'This is the title later used for the chart. An example of what the title would 
     'say if it were April is, Daily Nitrate Averages for April 
     Dim Title As String = "Daily Nitrate Averages for " & Month & " - Train " & GraphNumber + 1 

     Chart.Location(Excel.XlChartLocation.xlLocationAsObject, objSheet.Name) 'The chart is placed into the worksheet 
     ' Get the ChartObjects collection for the sheet. 
     chartObjects = objSheet.ChartObjects() 'chartObjects is assigned to this sheet 

     ' Get the chart to modify. This is the first item in chartObjects 
     existingChartObject = chartObjects.Item(1) 

     'Custom settings are assigned to the chart using the With keyword 
     With existingChartObject 
      .Chart.ChartType = Excel.XlChartType.xlLine 'This is a line graph 
      .Chart.SetSourceData(Range, PlotBy:=Excel.XlRowCol.xlColumns) 'we plot by the columns selected--this gives us our headings as names 
      .Chart.HasLegend = True 'give the chart a legend 
      .Chart.HasTitle = True 'tell the chart it has a title 
      .Chart.ChartTitle.Text = Title 'give the chart its title (declared and assigned earlier) 
      .Shadow = True 'Give the chart a shadow effect 
      .Chart.ChartArea.Shadow = True 'Give the chart area a shadow effect 
      .Chart.ChartArea.Format.Shadow.Style = MsoShadowStyle.msoShadowStyleOuterShadow 'assign an outer shadow style 
      .Chart.Legend.Position = Excel.XlLegendPosition.xlLegendPositionTop 'position the legend at the top of the chart 
      .Chart.ChartArea.Format.Glow.Radius = 10 'add a glow with a radius of 10 
      .Chart.ChartArea.Format.Glow.Color.RGB = RGB(90, 90, 90) 'set the color of the glow to a gray color 
      .Chart.ChartArea.Format.Fill.Visible = True 'make the fill on the chart visible 
      'give the chart major gridlines on it's x axis 
      .Chart.Axes(Excel.XlAxisGroup.xlPrimary).HasMajorGridlines = True 
     End With 'Finish working with existingChartObject 

     'from the perspective of the sheet, set the Width and Height to 500 X 300 
     objSheet.ChartObjects(1).Width = 500 
     objSheet.ChartObjects(1).Height = 300 

     'Format the Chart's 2nd data series 
     With existingChartObject.Chart.SeriesCollection(2) 
      .Shadow = True 'give it a shadow 
      .Format.Shadow.Style = MsoShadowStyle.msoShadowStyleOuterShadow 'set the shadow to be an outer shadow 
      .Format.Shadow.Transparency = 0.5 'make the shadow 50% transparent 
     End With 'stop working with the existingChartObject.Chart.SeriesCollection(2) 

     objExcel.Run("Macro2") 'Run Macro2 to delete the unecessary series 
Questions connexes