VB.NET - Проблема при изменении диаграммы в Excel
От: Muff Россия  
Дата: 21.07.06 12:37
Оценка:
При выполнении следующего кода

   Dim oExcel As Object 'Excel.Application
        Dim oBook As Object 'Excel.Workbook
        Dim oSheet As Object 'Excel.Worksheet

        Dim oldCI As System.Globalization.CultureInfo = _
        System.Threading.Thread.CurrentThread.CurrentCulture
        System.Threading.Thread.CurrentThread.CurrentCulture = _
            New System.Globalization.CultureInfo("en-US")

        'Start a new workbook in Excel.
        oExcel = CreateObject("Excel.Application")

        oBook = oExcel.Workbooks.Add

        'Add data to cells of the first worksheet in the new workbook.
        oSheet = oBook.Worksheets(1)
        Dim i As Integer
        For i = 1 To 5
            oSheet.Range("A" & CStr(i)).Value = i
            oSheet.Range("B" & CStr(i)).Value = i * i
        Next i

        Dim oChart As Object 'Excel.Chart
        oChart = oBook.Sheets.Add(Type:=-4109) 'Excel.XlSheetType.xlChart
        oChart.ChartType = 74 'Excel.XlChartType.xlXYScatterLines
        oChart.Location(Where:=1, Name:="function") ' Excel.XlChartLocation.xlLocationAsNewSheet 
        oChart.PlotArea.Interior.ColorIndex = 2

        Dim s1 As Object 'Excel.Series
        s1 = oChart.SeriesCollection.NewSeries()

        s1.XValues = oSheet.Range("A1:A5")  ' Ошибка здесь !!!!!!!!!!!!!!!!!!!!!!!
        s1.Values = oSheet.Range("B1:B5")

        'Save the Workbook and quit Excel.
        oBook.SaveAs("c:\Book1.xls")

        If Not oBook Is Nothing Then oBook.Close(False)
        oExcel.Quit()

        System.Threading.Thread.CurrentThread.CurrentCulture = oldCI


возникает следующая ошибка при попытке изменить данные в объекте Series:

Type mismatch. (Exception from HRESULT: 0x80020005 (DISP_E_TYPEMISMATCH))

Дело в том, что поле XValues объекта Series имеет тип System.Array, a oSheet.Range("A1:A5") имеет тип System.__ComObject . У объекта Range есть поле Value, которое возвращает массив значений. Однако код
s1.XValues = oSheet.Range("A1:A5").Value

не работает, если массив достаточно большой.
Re: VB.NET - Проблема при изменении диаграммы в Excel
От: Elena_ Россия  
Дата: 21.07.06 15:07
Оценка:
Здравствуйте, Muff, Вы писали:


M>Дело в том, что поле XValues объекта Series имеет тип System.Array, a oSheet.Range("A1:A5") имеет тип System.__ComObject . У объекта Range есть поле Value, которое возвращает массив значений. Однако код

M>
M>s1.XValues = oSheet.Range("A1:A5").Value
M>

M>не работает, если массив достаточно большой.

Не поняла, правда, зачем вы добавляете ряд, один же уже есть? А так не будет работать?


        s1.XValues = "=Лист1!R1C1:R5C1"  ' Ошибка здесь !!!!!!!!!!!!!!!!!!!!!!!
        s1.Values = "=Лист1!R1C2:R5C2"
Пользователь — друг программиста!
Re[2]: VB.NET - Проблема при изменении диаграммы в Excel
От: Аноним  
Дата: 23.07.06 14:28
Оценка:
Здравствуйте, Elena_, Вы писали:

E_>Не поняла, правда, зачем вы добавляете ряд, один же уже есть?


Так надо
Задача создать несколько рядов данных различной длины.

E_>А так не будет работать?

E_>
E_>        s1.XValues = "=Лист1!R1C1:R5C1"  ' Ошибка здесь !!!!!!!!!!!!!!!!!!!!!!!
E_>        s1.Values = "=Лист1!R1C2:R5C2"
E_>


Проверял. Так не работает.
Если точнее, то ошибка не возникает, файл создается. Но если открыть файл и посмотреть данные для созданного ряда, то в поле XValues содержится
="=Лист1!R1C1:R5C1"


а нужно чтобы там было

=Лист1!R1C1:R5C1


Короче в этом случае туда передается массив из одного элемента — строки "=Лист1!R1C1:R5C1"
Re[3]: VB.NET - Проблема при изменении диаграммы в Excel
От: Elena_ Россия  
Дата: 23.07.06 19:22
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Проверял. Так не работает.

А>Если точнее, то ошибка не возникает, файл создается. Но если открыть файл и посмотреть данные для созданного ряда, то в поле XValues содержится
А>
А>="=Лист1!R1C1:R5C1"
А>


А>а нужно чтобы там было


А>
А>=Лист1!R1C1:R5C1
А>


А>Короче в этом случае туда передается массив из одного элемента — строки "=Лист1!R1C1:R5C1"


Интересно, а я проверила с Вашим кодом, работает и график рисует, и значение преобразовывается в
=Лист1!$A$1:$A$5, а для оси Y — =Лист1!$B$1:$B$5

Вообще, попробуйте записать макрос в Excel, то есть сделайте Excel видимым, доведите код до этого места, перейдите в книгу, начните запись, задайте исходные данные через пользовательский интерфейс, остановите запись и посмотрите, что получится.
Пользователь — друг программиста!
Re[4]: VB.NET - Проблема при изменении диаграммы в Excel
От: Аноним  
Дата: 26.07.06 09:12
Оценка:
E_>Вообще, попробуйте записать макрос в Excel, то есть сделайте Excel видимым, доведите код до этого места, перейдите в книгу, начните запись, задайте исходные данные через пользовательский интерфейс, остановите запись и посмотрите, что получится.

Спасибо за совет. Но дело в том, что если вставить этот код в виде макроса на Excel, то все работает. Все работает как надо даже по vb6, а вот из восьмой студии на VB.NET не работает. Видимо проблема связана со словом .NET.
Re[5]: VB.NET - Проблема при изменении диаграммы в Excel
От: Elena_ Россия  
Дата: 26.07.06 17:09
Оценка:
Здравствуйте, Аноним, Вы писали:

E_>>Вообще, попробуйте записать макрос в Excel, то есть сделайте Excel видимым, доведите код до этого места, перейдите в книгу, начните запись, задайте исходные данные через пользовательский интерфейс, остановите запись и посмотрите, что получится.


А>Спасибо за совет. Но дело в том, что если вставить этот код в виде макроса на Excel, то все работает. Все работает как надо даже по vb6, а вот из восьмой студии на VB.NET не работает. Видимо проблема связана со словом .NET.


А если не код в виде макроса, а имеено только ту текстовую строку или что там запишет макрос. Я пробовала именно Ваш код, правда в VS 2003, а не 2005
Пользователь — друг программиста!
Re[6]: VB.NET - Проблема при изменении диаграммы в Excel
От: Elena_ Россия  
Дата: 26.07.06 22:29
Оценка:
Здравствуйте, Elena_, Вы писали:

Можно попробовать еще SetSourceData, которая задает все ряды сразу, если такой вариант устраивает.
Пользователь — друг программиста!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.