Excel VBA Макросы: Построение графиков с помощью формы

Автор Maks00, 02 ноября 2017, 19:52

Maks00

Здравствуйте.
Мне нужно использовать следующие данные, но у меня происходит ошибка:
Уравнение: =2*x*ln(x)
Начальное значение: 0,2
Шаг: 0,2
Конечное: 5,2

[вложение удалено администратором]

Администратор

Код для UserForm:
Код
Private Sub UserForm_Initialize()
    With Image1
        .PictureAlignment = fmPictureAlignmentTopLeft
        .PictureSizeMode = fmPictureSizeModeStretch
    End With
End Sub

Private Sub CommandButton1_Click()

    Dim x_nz As Double
    Dim x_pz As Double
    Dim x_shag As Double
    Dim uravnenie As String
    Dim nx As Integer
    Dim i As Integer

   
    '1. Проверка, что юзер ввёл числа в текстбоксы формы.
    If IsNumeric(TextBox2.Text) = False Then
        MsgBox "Ошибка в начальном значении х", vbInformation, "Построение графика"
        TextBox2.SetFocus
        Exit Sub
    End If
    If IsNumeric(TextBox3.Text) = False Then
        MsgBox "Ошибка в шаге х", vbInformation, "Построение графика"
        TextBox3.SetFocus
        Exit Sub
    End If
    If IsNumeric(TextBox4.Text) = False Then
        MsgBox "Ошибка в конечном значении х", vbInformation, "Построение графика"
        TextBox4.SetFocus
        Exit Sub
    End If
   
    '2. Копирование данных из формы в переменные. Это нужно по двум причинам:
        '1) с переменными макрос быстрее работает, чем с объектами;
        '2) удобнее читать и писать код.
    x_nz = CDbl(TextBox2.Text)
    x_shag = CDbl(TextBox3.Text)
    x_pz = CDbl(TextBox4.Text)
    uravnenie = Trim(TextBox1.Text)
   
    '3. Проверки.
    If x_nz >= x_pz Then
        MsgBox "Начальное значение х слишком большое", vbInformation, "Построение графика"
        TextBox2.SetFocus
        Exit Sub
    End If
   
    If x_nz + x_shag >= x_pz Then
        MsgBox "Шаг х слишком большой", vbInformation, "Построение графика"
        TextBox3.SetFocus
        Exit Sub
    End If

    '4. Замена x на адрес эксель-ячейки A1.
        ' vbTextCompare - чтобы функция "Replace" заменяла и меленькую и большую "x".
    uravnenie = Replace(uravnenie, "x", "A1", , , vbTextCompare)
   
    '5. Очистка эксель-листа от старых данных.
    Cells.Clear
   
    '6. Вставка на эксель-лист данных из формы в столбец A.
    Range("A1").Value = x_nz
    Range("A1").DataSeries Rowcol:=xlColumns, Type:=xlLinear, Step:=x_shag, Stop:=x_pz, Trend:=False
   
    '7. Проверка формулы. Проверяется именно здесь после того, как были вставлены данные в столбец A.
        ' Иначе может быть ошибка "Деление на  ноль". Но здесь есть нестыковка: при некоторых значениях
        ' (например, когда будет деление на ноль), будет ошибка, а при других нет. Поэтому
        ' по такой проверке нельзя сказать, правильная формула или нет.
    If IsError(Evaluate(uravnenie)) = True Then
        MsgBox "Ошибка в формуле", vbInformation, "Построение графика"
        Exit Sub
    End If
   
    '8. Вставка формулы из формы в столбец B.
    nx = Range("A1").CurrentRegion.Rows.Count
    Range("B1:B" & nx).FormulaLocal = uravnenie
   
    '9. Вставка диаграммы на эксель-лист.
    ActiveSheet.ChartObjects.Add(20, 19.5, 192, 192).Select
   
    '10. Очистка в столбце B ячеек, в которых не числа. Не понятно, почему такое может быть.
        ' Может быть там эксель-ошибки. Но тогда проверка правильности формулы имеет ли смысл?
    For i = 1 To nx
        If IsNumeric(Cells(i, 2)) = False Then
            Cells(i, 2) = ""
        End If
    Next i
   
    '11. Построение диаграммы.
    ActiveChart.ChartWizard Source:=Range(Cells(1, 1), Cells(nx, 2)), Gallery:=xlLine, _
        Format:=2, PlotBy:=xlColumns, CategoryLabels:=1, SeriesLabels:=0, HasLegend:=False, _
        Title:="График", CategoryTitle:="Аргумент", ValueTitle:="Функция y" & TextBox1.Text
   
    '12. Настройка надписи оси Y.
    ActiveChart.Axes(xlValue).AxisTitle.Select
    With Selection
        .HorizontalAlignment = xlCenter
        .VerticalAlignment = xlCenter
        .Orientation = xlUpward
    End With
   
    '13. Копирование диаграммы в форму в объект "Image".
    ActiveChart.Export Filename:="Graph.jpg", FilterName:="JPEG"
    UserForm1.Image1.Picture = LoadPicture("graph.jpg")
    ' Удаление временного файла.
    Kill "graph.jpg"
   
    '14. Просто выделение ячейки A1. Для удобства юзера, наверное.
    Range("A1").Select
   
End Sub

Private Sub CommandButton2_Click()
    UserForm1.Hide
End Sub
[свернуть]

Maks00

Все работает отлажено и эстетично, со своими ошибками разобрался, спасибо огромное!