Страница 1 из 2

Как передать данные из массива в значения диаграммы?

Добавлено: 24 сен 2005, 03:10
Zhanibek
Imeetsya gotovye massivy iz odinakovogo kolichestva elementov.
Nado ispol'zovat' eti dannye kak istochnik dannyh dlya diagrammy.
Proboval etim sposopom:

Charts.Add
ActiveChart.ChartType = xlXYScatter
ActiveChart.SeriesCollection(1).XValues = DT_Range.Value
ActiveChart.SeriesCollection(1).Values = Pr_Range.Value
ActiveChart.SeriesCollection(1).Name = "=""Pws vs. log((T+dT)/dT)"""
ActiveChart.Location Where:=xlLocationAsNewSheet, Name:= _
"Pws_Dt correlation"

Ne rabotaet - govorit "Invalid qualifier" i vydelyaet "DT_Range.Value"

Veroyatno svyazano s sintaksisom, no razobrat'sya tak i ne smog.

Zaranee spasibo!

Добавлено: 24 сен 2005, 12:04
Naeel Maqsudov
Если DT_Range это экземпляр класса Range
(Т.е. он
1) объявлен как DT_Range as Range или Variant
2) и создан как, например, Set DT_Range = Sheets(1).Range("A1:A10")
)
То этот пример однозначно должен работать правильно!
(Даже ".Value" необязательно писать)

Дело не в синтаксисе, а в значении переменной DT_Range.

Добавлено: 24 сен 2005, 12:17
Naeel Maqsudov
Ne rabotaet - govorit "Invalid qualifier" i vydelyaet "DT_Range.Value"
Сейчас попробовал всяко-разно изощриться, но мне так и не удалось добиться ошибки "Invalid qualifier" :)
И хелпа нету, чтобы посмотреть что за ошибка :(

Что-то мне подсказывает, что это ошибка компиляции, а не RunTime-ошибка....
Видимо, действительно дело в том, что DT_Range не является диапазоном...
Но как, черт возьми, Вы добиваетесь такой ошибки! :)
Код в студию!

Добавлено: 24 сен 2005, 14:42
pashulka
Уважаемый Naeel Maqsudov, если Вам интересно как был получен обсуждаемый массив (не диапазон), то советую посмотреть предыдущий топик, который был создан автором этого вопроса. Я хоть там и немного намусорил, но Вы точно сможете найти всю интересующую Вас информацию.

Добавлено: 24 сен 2005, 19:53
pashulka
Попробуйте использовать вот этот вариант :

Код: Выделить всё

With Charts.Add
    .ChartType = xlXYScatterSmooth
    .SetSourceData Source:=Worksheets(1).Range("A1")
    .SeriesCollection(1).XValues = DT_Range
    .SeriesCollection(1).Values = Pr_Range
End With
Обратите внимание на то, что ячейка "A1" не должна быть пустая. В противном случае её нужно заменить на более подходящую.

Добавлено: 24 сен 2005, 20:35
Naeel Maqsudov
Ничего не выйдет
.XValues = DT_Range
Даст ошибку "Object required"
Range нужен как ни крути.

Добавлено: 24 сен 2005, 22:52
Naeel Maqsudov
Прошу прощения коллеги! Мне что-то тут взглюкнУлось под вечер...
Вот же как надо было! (Тут все и массивы и графики....)

Итак на форме 2 RefEdit-а и кнопка.

Код: Выделить всё

Private Function RefEdit2Array(ByRef RE As RefEdit.RefEdit, ByRef Arr As Variant) As Long
Dim n As Long, Cell As Range
On Error GoTo load_err
  n = 1
  For Each Cell In Range(RE.Value)
    ReDim Preserve Arr(n)
    Arr(n) = Round(Cell.Value)
    n = n + 1
  Next
  RefEdit2Array = n - 1
  Exit Function
load_err:
  RefEdit2Array = 0
End Function

Private Sub CommandButton1_Click()
Dim DT_range() As Integer
Dim Pr_range() As Integer
Dim i As Long, j As Long
  i = RefEdit2Array(Me.RefEdit1, DT_range)
  j = RefEdit2Array(Me.RefEdit2, Pr_range)
  If (i > 0) And (i = j) Then
    With Charts.Add
      .ChartType = xlXYScatter
      With .SeriesCollection.NewSeries
        .XValues = DT_range 'Array(1, 3, 5, 2, 2, 4, 5)
        .Values = Pr_range
        .Name = "=""Pws vs. log((T+dT)/dT)"""
      End With
      .Location Where:=xlLocationAsNewSheet, Name:="Pws_Dt correlation"
    End With
  Else
    MsgBox "Что-то криво навыбирали, батенька! Все сначала! Pleeeease :)"
  End If
End Sub
перекачка данных по ссылке в массив: i = RefEdit2Array(Me.RefEdit1, DT_range)
i будет равно размеру массива.

pashulka, я нашел .NewSeries - это лучше чем .SetSourceData Source:=Range("A1")

...
Посмотрел на свое творение... нашел навскидку 2 вещи которые надо сделать совсем по другому, ну да лучшее - враг хорошего :)

Добавлено: 24 сен 2005, 23:19
pashulka
Naeel Maqsudov, Конечно лучше, но только свой вариант я писал по памяти, без изысканий в этой области и он всё таки работает :P

Добавлено: 25 сен 2005, 13:57
Zhanibek

Код: Выделить всё

Private Sub CommandButton1_Click()
    ' DT_Range - Range of Date.Time for each measurement of pressure
    ' Pr_Range - Range of measured pressure
    Dim DT_Range() As Variant
    Dim PR_Range() As Variant
    
    Dim Tp As Variant
    production = ActiveSheet.Range(RefEdit3.Value).Value
    shutin = ActiveSheet.Range(RefEdit5.Value).Value
    Tp = 24 * (Val(shutin - production))
    
    'In this section we fill DT_Range with data from RefEdit control on form
    ' Then we substract shut-in time from current time (delta t)
    ' Also we are converting values from date.time format to number
    'For Each c In ActiveSheet.Range(RefEdit4.Value)
    '    If c.Value > 0 Then
    '        n = n + 1
    '        'DT_Range(n) = Val(c.Value) - Val(RefEdit5.Value)
    '        xx = 24 * (c.Value - ActiveSheet.Range(RefEdit5.Value).Value)
    '        xx = Log10((xx + Tp) / xx)
    '        DT_Range(n) = xx
    '        MsgBox "DT_Range(" & n & ")" & DT_Range(n)
    '    End If
    'Next c
    
    n = -1
    
    For Each c In ActiveSheet.Range(RefEdit4.Value)
        If c.Value > 0 Then
            n = n + 1
            'DT_Range(n) = Val(c.Value) - Val(RefEdit5.Value)
            DT_Range(n) = 24 * (c.Value - ActiveSheet.Range(RefEdit5.Value).Value)
            
        End If
    Next c
    
    For k = 0 To n
        DT_Range(k) = Log10((Tp + DT_Range(k)) / DT_Range(k))
    Next k
    
    
      
    ReDim Preserve DT_Range(n) As Variant

    
    'In this section we fill Pr_Range with data from RefEdit2 control on form
    n = -1
    For Each c In ActiveSheet.Range(RefEdit2.Value)
        If c.Value > 0 Then
            n = n + 1
            'DT_Range(n) = Val(c.Value) - Val(RefEdit5.Value)
            PR_Range(n) = c.Value
            'MsgBox "DT_Range(" & n & ")" & DT_Range(n)
        End If
    Next c
    ReDim Preserve PR_Range(n) As Variant
    
    'We have to define other parameters for our calculations (in conditions of JOGMEC.TRC exercize)
    'Par_H - thikness of tested layer, feet     on paper
    'Par_Mu - viscosity of oil, cp              on paper
    'Par_B - formation volume factor os oil     on paper
    'Par_Fi - porosity, percents                on paper
    'Par_C - compressibility (total)            on paper
    'Par_Rw - raduws of flow, feet              on paper
    '
    'Par_Q - oil production rate, STB/day       in table
    'Par_Pwf - pressure just before shut-in,psi in table
    '
    'Par_M - slope of trendline
    '(plot P vs. log((Tp+dT)/dT)after
    'excluding wellbore storage effect          will be derived             slope of curve
    '
    'Par_P1hr - pressure after 1 hour of staying will be calculated         P1hr=
    
    'Output data we want to get from this fucking form
    '
    'Out_K - permeability, md
    'Out_S - skin factor
    'Out_dPsk - delta P skin, psi
    'Out_Jact - productivity index actual
    'Out_Jid - productivity index ideal
    'Out_Fef - flow efficiency
    
    

   
    A_Sheet = ActiveSheet.Name
    ActiveSheet.Range("IQ1").Select
    For k = 0 To n
        ActiveCell.Value = DT_Range(k)
        ActiveCell.Offset(1, 0).Range("A1").Select
    Next k
    ActiveSheet.Range("IQ1").Select
    e2 = "IQ1:IQ" & (n + 1)
    'ActiveSheet.Range(e2).Select
    ActiveSheet.Range("a1").Select
    Charts.Add
    ActiveChart.ChartType = xlXYScatter
    ActiveChart.SetSourceData Source:=Sheets(A_Sheet).Range("D5")
    'ActiveChart.SeriesCollection.NewSeries
    ActiveChart.SeriesCollection(1).Values = PR_Range
    ActiveChart.SeriesCollection(1).XValues = Sheets(A_Sheet).Range(e2) 'Zdes' prishlos' ubrat' DT_Range
    ActiveChart.SeriesCollection(1).Name = "=""Pws vs. T+dT/dT"""
    ActiveChart.Location Where:=xlLocationAsNewSheet, Name:= _
        "Pws_Dt correlation"
    With ActiveChart
        .HasTitle = True
        .ChartTitle.Characters.Text = "Pws vs. T+dT/dT"
        .Axes(xlCategory, xlPrimary).HasTitle = True
        .Axes(xlCategory, xlPrimary).AxisTitle.Characters.Text = "t+dt"
        .Axes(xlValue, xlPrimary).HasTitle = True
        .Axes(xlValue, xlPrimary).AxisTitle.Characters.Text = "Pws"
        .HasLegend = False
    End With
    With ActiveChart.Axes(xlCategory)
        .HasMajorGridlines = True
        .HasMinorGridlines = False
    End With
    With ActiveChart.Axes(xlValue)
        .HasMajorGridlines = True
        .HasMinorGridlines = False
    End With
    
    'Trying to define min & max values of scale
    
    
        ActiveChart.Axes(xlValue).Select
    With ActiveChart.Axes(xlValue)
        '.MinimumScale = PR_Range(0) * 0.9
        .MinimumScaleIsAuto = True
        .MaximumScaleIsAuto = True
        .MinorUnitIsAuto = True
        .MajorUnitIsAuto = True
        .Crosses = xlAutomatic
        .ReversePlotOrder = False
        .ScaleType = xlLinear
        .DisplayUnit = xlNone
    End With
    'MsgBox R_2(DT_Range, PR_Range, n)
    'MsgBox M_Slope(DT_Range, PR_Range, n)
    'MsgBox B_Intersect(DT_Range, PR_Range, n)
    
    'Finding optimal value of correlation
    'rop = 0
    For cp = 0 To n
        r1 = R_2(DT_Range, PR_Range, cp, n)
        If r1 >= 0.999 Then
           Exit For
        End If
        'If (rop > r1) Then
        '  Exit For
        'Else
        '  rop = r1
        'End If
    Next cp
    
    'MsgBox r1 & " c= " & c
    Sheets(A_Sheet).Activate
    Sheets(A_Sheet).Cells(1, 1).Value = "M_slope=" & M_Slope(DT_Range, PR_Range, cp, n)
    Sheets(A_Sheet).Cells(2, 1).Value = "B_Intersect=" & B_Intersect(DT_Range, PR_Range, cp, n)
    Sheets(A_Sheet).Cells(3, 1).Value = "R_2=" & r1
    Sheets(A_Sheet).Cells(4, 1).Value = "np=" & (cp + 1)
    'ActiveWorkbook.Charts.Delete
    
    ActiveSheet.Cells(1, 2).Select
    For X = 0 To cp
    ActiveCell.Value = DT_Range(X)
    ActiveCell.Offset(1, 0).Range("A1").Select
    Next X
    
    ActiveSheet.Cells(1, 3).Select
    
    For X = 0 To cp
    ActiveCell.Value = PR_Range(X)
    ActiveCell.Offset(1, 0).Range("A1").Select
    Next X
     
     
     'Sheets(A_Sheet).Cells(1, 3).Value = PR_Range(cp)
    
    Unload frmWell_Test
    
End Sub
Uvazhaemye Pashulka & Naeel Maqsudov, k sozhaleniu ya tak i ne smog zastavit' rabotat' predidushim sposobom. Mne prishlos' perekinut' dannye massiva v yacheiki i vzyat' ih kak diapazon (range). Hotya eto konechno ne ochen' krasivy vihod.
Prosto v nastoyashee vremya ya nahozhus' v Yaponii i ne mogu naiti normal'noi literaturi po VBA.
Budu rad, esli smozhete izbavit' menya ot etogo appendiksa.
P.S. Po ukazannym vishe prichinam prihoditsya i pisat' translitom

Добавлено: 25 сен 2005, 16:50
pashulka
Zhanibek, Возможно причина кроется именно в массиве, так как после некоторых тестов я пришёл к выводу, что существует некоторое ограничение, которое связано с общим количеством символов в этом массиве …