vb.net Object(,) Индекс массива не найдет (0,0), даже если это массив 11x37

первый раз спрашиваю здесь. Заранее благодарим за любую помощь, которую вы можете оказать.

Я пытаюсь прочитать кучу данных из электронной таблицы, нарезать их, а затем закинуть в базу данных. Я бы предпочел не делать вещи таким образом, но это основная реальность работы с типами бухгалтеров. К счастью, эти отчеты в виде электронных таблиц очень последовательны. Во всяком случае, я использую LINQ для SQL для обработки объекта для ссылки, и я использую Microsoft.Office.Interop для включения моего Excel.

Я читаю каталог, полный .xls, и для каждого из них я открываю файл, получаю пару конкретных данных из некоторых конкретных ячеек, а затем получаю диапазон ячеек для выбора значений.

Private Sub ProcessAFile(ByVal f As FileInfo)
    thisFile = openApp.Workbooks.Open(f.fullName)
    thisMonth = Split(thisChart.Range("D6").Value, "-").Last.Trim
    thisFY = thisChart.Range("L7").Value
    thisWorkArea = thisChart.Range("A14", "L51").Value2
    openApp.Workbooks.Close()
...

thisWorkArea была затемнена как глобальная:

    Dim thisWorkArea As Object(,)

Я получаю как строки, так и целые числа в моем диапазоне между A14 и L51, поэтому здесь имеет смысл сделать его массивом Object. Я не хочу просматривать каждую строку и выбирать диапазоны в Excel, я хочу просто прочитать ее один раз, а затем закрыть.

Итак, я получаю следующее исключение:

Исключение System.IndexOutOfRangeException было необработанным. Сообщение = Индекс находился за пределами массива.

в этой функции:

Private Sub fillCurrMonth()
    Dim theseRows As Integer() = {0, 2, 3, 5}

    For Each i In theseRows
        Dim thisMonth As New Month
        'make sure category is in Database

        thisMonth.Dept = thisDeptName
        thisMonth.FY = thisFY
        thisMonth.Category = thisWorkArea(i, 0)
...

«Месяц» выше относится к объекту LINQ. Ничего особенного.

В этой последней строке я ловлю исключение. В моих часах я обнаружил, что thisWorkArea имеет длину 456 и (0,0) -> "Стационарное"{String}

Так почему я получаю это исключение? Я отдаю это в ваши опытные руки. Я все еще новичок в vb.net, поэтому, возможно, я просто упускаю что-то фундаментальное.


person rev_s    schedule 06.09.2011    source источник
comment
Может показаться, что вы устанавливаете для thisWorkArea значение ячейки при вызове thisWorkArea = thisChart.Range(A14, L51).Value2 В отладчике после выполнения этой строки, если вы наведете курсор на thisWorkArea, что появится? Опция строго включена?   -  person Chris Dunaway    schedule 06.09.2011
comment
В отладчике при наведении курсора на thisWorkArea появляется подсказка с {Length=456} рядом с именем. Если я нажму плюс, он даст мне ожидаемые значения электронной таблицы с их координатами, например. (0,0) Стационарное лечение. Я не знаком с параметром Option Strict On, но посмотрю, что это значит.   -  person rev_s    schedule 06.09.2011
comment
Я включил Option Strict, убедился, что все напечатано так, как должно быть, и здесь я получаю точно такую ​​же ошибку. Тем не менее, хорошо получить еще один совет vb - спасибо Крису Данауэю.   -  person rev_s    schedule 06.09.2011
comment
Я узнал от кого-то на работе, что с этими массивами, заполненными из Excel, часы сообщают, что они имеют нулевую базу, хотя на самом деле они 1-базовые. Это очень странно, но я учел это, и теперь это работает. Странный!   -  person rev_s    schedule 06.09.2011


Ответы (1)


Excel использует индексы, основанные на 1. Это связано с тем, что VB используется в качестве языка программирования в приложении, который традиционно использует индексы, основанные на 1.

Вы обнаружите, что Excel вернул массив, определенный как thisWorkArea(1 To 11, 1 To 37) As Object

person Hand-E-Food    schedule 06.09.2011
comment
На самом деле VBA может использовать любую базу (например, Dim a(-7 to -3) как допустимый вариант). Это свойство Value объекта Range, которое возвращает массив на основе 1. - person chris neilsen; 07.09.2011