2013-08-27 4 views
0

Я вытаскиваю свои волосы, пытаясь разобрать данные или редактировать их в коллекцию серии msgraph.
Я получаю error 438 - object does not support this property or method.Невозможно отредактировать msgraph seriescollection

Я могу манипулировать другими свойствами, которые объект имеет, например, ChartTitle.Font.Size, но не серией.

Intellisencing не работает с этим объектом, что заставляет меня судить, что я не задал конкретной ссылки.

Разделы кода приведены ниже.
Основная процедура получает объект:

strReportName = "Security Selection" 
strChartName = "MACD_Chart" 

DoCmd.OpenReport strReportName, acViewDesign 
Set rptMACD = Reports(strReportName) 
Set chartMACD = rptMACD(strChartName) 

Набор записей данных строится затем все это передается в подпрограмму:

Call UpdateChart(chartMACD, rstMACD) 


Public Sub UpdateChart(chartPlot As Object, rstChart As ADODB.Recordset)   
'FUNCTION: 
'  a chart object is passed into the routine, 
'  source data is update to the recordset being passed in. 
Dim lngType As Long 
Dim i, j, iFieldCount As Integer 
Dim rst As Recordset 
Dim arXValues() As Date 
Dim arValues() As Double 
Dim strChartName, strYAxis, strXAxis As String 
Dim ChrtCollection As ChartObjects 

Dim colmCount As Integer 
chartPlot.RowSourceType = "Table/Query" 

'get number of columns in chart table/Query 
iFieldCount = rstChart.Fields.Count 

With chartPlot 
'change chart data to arrays of data from recordset 
    .Activate 
    j = 0 
    rstChart.MoveFirst 
    Do While Not rstChart.EOF 
     j = j + 1 
     ReDim Preserve arXValues(1 To j) 
     arXValues(j) = rstChart.Fields("Date").Value 
     rstChart.MoveNext 
    Loop 

    For i = 1 To iFieldCount - 1 'Date is first field 
     j = 0 
     rstChart.MoveFirst 
     Do While Not rstChart.EOF 'get next array of data 
      j = j + 1 
      ReDim Preserve arValues(1 To j) 
      arValues(j) = rstChart.Fields(i + 1).Value 
      rstChart.MoveNext 
     Loop 
     .SeriesCollection(i).Name = rstChart.Fields(i + 1).Name 
     .SeriesCollection(1).XValues = arXValues 
     .SeriesCollection(i).Values = arValues 

    Next i 
end sub 

Я пытался много вещей, и теперь я полностью смущенный. Я также пытаюсь разобрать в наборах записей (что является моим предпочтением), но я возьму что-нибудь в данный момент.

ответ

0

Прежде чем продолжить: я рекомендую установить свойство Chart Rowsource запросу, который возвращает нужные данные, а затем Requery в диаграмме. Это WAY проще, чем следующее.

Вы получаете Error 438, потому что Name, XValues, Values не являются объектами объекта Series. MSDN Info

Это, как говорится, здесь идет ваш метод и некоторые рекомендации для этого. SeriesCollection не содержит значений, связанных с точками MSGraph, как в Excel. Вам нужно отредактировать данные в DataSheet, который ОЧЕНЬ фиктивный. Должна быть включена ссылка на библиотеку графиков Microsoft. Это было проверено для работы с моей базой данных. Microsoft Graph MSDN info

DAO

Public Sub testing() 
Dim rstChart As Recordset 
Dim seri As Object, fld As Field 
Dim app As Graph.Chart 

chartPlot.SetFocus 
Set app = chartPlot.Object 
Set rstChart = CurrentDb.OpenRecordset("SELECT DateTime, ASIMeasured FROM Surv_ASI WHERE CycleID = 2 ORDER BY DateTime") 

app.Application.DataSheet.Range("00:AA1000").Clear 

With rstChart 
    For Each fld In .Fields 
     app.Application.DataSheet.Range("a1:AA1").Cells(0, fld.OrdinalPosition) = fld.Name 
    Next 

    Do While Not .EOF 
     For Each fld In .Fields 
      app.Application.DataSheet.Range("a2:AA1000").Cells(.AbsolutePosition, fld.OrdinalPosition).Value = fld 
     Next 
     .MoveNext 
    Loop 
End With 

app.Refresh 
End Sub 

ADO (Предполагается, что rstChart уже действительный ADODB.Recordset)

Public Sub testing() 
Dim app As Graph.Chart, i As Integer 

chartPlot.SetFocus 
Set app = chartPlot.Object 

app.Application.DataSheet.Range("00:AA1000").Clear 

With rstChart 
    .MoveFirst 'Since I don't know where it was left off before this procedure. 

    For i = 0 To .Fields.Count - 1 
     app.Application.DataSheet.Range("a1:AA1").Cells(0, i) = .Fields(i).Name 
    Next 

    Do While Not .EOF 
     For i = 0 To .Fields.Count - 1 
      app.Application.DataSheet.Range("a2:AA1000").Cells(.AbsolutePosition, i).Value = .Fields(i) 
     Next 
     .MoveNext 
    Loop 
End With 

app.Refresh 
End Sub 

Некоторые замечания по поводу моих изменений:
1. Я предпочитаю, имеющие мой With указывает на циклический набор записей, вместо Объект управляется, тем более, что больше вызовов производится в свойствах Recordset в вашей процедуре.
2. Вам не нужно указывать переменную, к которой применяется Next (Next i). Просто положите Next.
3. Пожалуйста, выберите мой ответ, если он помог :)

+0

Hi @usncahill. набор записей, который я использую, является результатом движущегося алгоритма (такого как индикаторы MACD и RSI). Я не уверен, как это сделать в форме запроса. есть ли лучший способ обновить или создать диаграмму? По сути, я хочу поместить диаграмму в форму с данными, которые я создал (массив, набор записей или запрос ... Я не суетливый). –

+0

@ian Где находится набор записей 'rstChart'? Как это связано с MACD и RSI?Они генерируются на основе записи (т. Е. Каждая запись представляет собой день/час/минуту, для которой создается скользящее среднее)? – usncahill

+0

@usnacahill. MACD генерируется из сценария, который затем попадает в набор записей. пример: «dEMAS (iCount) = (curPrice * dEXPSlowWeight) + (dEMAS (iCount - 1) * (1 - dEXPSlowWeight)) –

Смежные вопросы