Взаимодействие: Невозможно вызвать get_Range и не может использовать массив двумерных объектов, возвращаемый Range (). Value2? - PullRequest
2 голосов
/ 01 июня 2011

Пытаясь заменить Cells (RowIndex, ColumnIndex) .Value () вызовами по строчным ссылкам для производительности, я постоянно не могу ссылаться на результат.

Начиная с Excel Interop - Эффективность и производительность, который содержит подсказку для использования get_range, то есть

//get values
object[,] objectArray = shtName.get_Range("A1:Z100").Value2;
iFace = Convert.ToInt32(objectArray[1,1]);

//set values
object[,] objectArray = new object[3,1] {{"A"}{"B"}{"C"}};
rngName.Value2 = objectArray;

Я подумал, что не могу использовать get_Range, так как этот метод не вызывается для меня, говорит VB во время выполнения (невидимый член).

Теперь я придумал что-то вроде:

Dim Values As Object(,)
Values = Sheet.Range(Sheet.Cells(RowIndex, 1), Sheet.Cells(2, 17)).Value2
For Index As Integer = 0 To 16
  MsgBox(Values(0, Index))
Next

Однако ссылка на Values с двумя индексами измерения всегда возвращает «индекс был вне границ массива»исключение.Проверка массива с помощью отладчика показывает хороший двумерный массив, который должен иметь 17 элементов во втором измерении, поэтому Value (0,0) действительно должен быть допустимой ссылкой, но это не так:

Отладчик позволяетя могу проверить значение, я также могу перейти к Value(0,0) и увидеть правильное значение, но переоценивая только этот элемент, то есть проверка "Value (0,0)" возвращает сообщение выше.

Как я могуссылка, что возвращает мой вызов Value2?

Ответы [ 2 ]

1 голос
/ 02 июня 2011

Возможно, что-то подобное?Обратите внимание, что если вы хотите, чтобы массив имел столбец в качестве первого элемента, который вы используете, измените строку ниже, как указано:

Imports Microsoft.Office.Interop
    Module Module1
        Sub main()
            Dim appExcel As Excel.Application
            Dim wb As Excel.Workbook
            Dim ws As Excel.Worksheet
            Dim values As Object

            appExcel = GetObject(, "Excel.Application")
            wb = appExcel.Workbooks(1)
            ws = wb.Worksheets(1)
            With ws
                values = .Range(.Cells(1, 1), .Cells(2, 5)).Value2
                'if column is first element use appExcel.Worksheetfunction.Transpose(.Range(.Cells(1, 1), .Cells(2, 5)).Value2)
                For i As Int32 = LBound(values, 1) To UBound(values, 1)
                    For j As Int32 = LBound(values, 2) To UBound(values, 2)
                        System.Windows.Forms.MessageBox.Show(values(i, j))
                    Next j
                Next
            End With
        End Sub
    End Module
0 голосов
/ 01 июня 2011

Попробуйте

Dim Values As Variant
Dim shtName as Worksheet
Set shtName = <your sheet>
Values = shtName.Range("A1:Z100")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...