Гость
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Повторное использование массива / 10 сообщений из 10, страница 1 из 1
17.08.2016, 11:04
    #39293098
IFK
IFK
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Повторное использование массива
Уважаемые,

Преамбула: есть дин. массив, который заполняется данными из внешнего файла. Этот массив затем используется для перебора значений в цикле. Вопрос: как можно использовать массив для проверки нескольких значений в цикле?

Код:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
            
             If OI_arr_check = "NA" Then
                ReDim OI_table(xsh_read.UsedRange.Rows.Count - 1, 7)    => заполнение массива внешними данными
                 For i = 1 To xsh_read.UsedRange.Rows.Count - 1
                    If xsh_read.Range("D2").Offset(i, 0).Value <> "" And IsNothing(xsh_read.Range("D2").Offset(i, 0).Value) = False Then
                        OI_table(i, 0) = Trim(xsh_read.Range("D2").Offset(i, 0).Value)
                        OI_table(i, 1) = CInt(xsh_read.Range("D2").Offset(i, 1).Value)
                        OI_table(i, 2) = Trim(xsh_read.Range("D2").Offset(i, 8).Value)
                        OI_table(i, 3) = Trim(xsh_read.Range("D2").Offset(i, 3).Value)
                        OI_table(i, 4) = Trim(xsh_read.Range("D2").Offset(i, 16).Value)
                        OI_table(i, 5) = Trim(xsh_read.Range("D2").Offset(i, 17).Value)
                        OI_table(i, 6) = Trim(xsh_read.Range("D2").Offset(i, 15).Value)
                        OI_table(i, 7) = Trim(xsh_read.Range("D2").Offset(i, 11).Value)
                    End If
                Next i
               Else
                OI_arr_check = "Exist"
            End If
....

                        i = 0
                        For i = 0 To OI_table.GetUpperBound(0) Step 1  => поиск внутри заполненного массива
                            If OI_table(i, 0) = f12_mopi Then
                                message = "F"
                                vol = Trim(OI_table(i, 1))
                                categ = Trim(OI_table(i, 2))
                                grade = OI_table(i, 3)
                                extend = OI_table(i, 4)
                                net = OI_table(i, 5)
                                result = OI_table(i, 7)
                            End If
                        Next i
....



В конце работы программы массив не уничтожается. При новом старте проводится проверка на существование массива и он заново не заполняется. Проблема возникает дальше при поиске значения в массиве (второй цикл) - такое впечатление, что массив содержит пустые значения (проверял через msgbox).

Посоветуйте и подскажите, как побороть? Спасибо!
...
Рейтинг: 0 / 0
17.08.2016, 11:40
    #39293135
i45
i45
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Повторное использование массива
IFK,

Вы во втором цикле скалярным переменным присваиваете бегущие значения (если OI_table(i, 0) = f12_mopi встречается больше одного раза), которые последовательно затирают друг друга. Если OI_table(i, 0) = f12_mopi всегда встречается один раз, то почему не выходите из цикла.

Строка с i = 0 не нужна.
Повторный Trim не нужен.

Пустые значения тоже значения - что и как Вы прочитали в некоем внешнем файле - неизвестно.
...
Рейтинг: 0 / 0
17.08.2016, 11:49
    #39293148
i45
i45
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Повторное использование массива
IFK,

Что значит в конце программы массив не уничтожается. Уничтожается, программа то закончилась.
...
Рейтинг: 0 / 0
17.08.2016, 11:51
    #39293152
IFK
IFK
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Повторное использование массива
i45,

Да, это все верно: в массиве могут встречаться повторяющиеся значения, я просто убрал лишние инструкции из цикла, чтобы не перегружать. Полный цикл выглядит так =>

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
 
                        For i = 0 To OI_table.GetUpperBound(0) Step 1  => поиск внутри заполненного массива
                            If OI_table(i, 0) = f12_mopi Then
                                message = "F"
                                vol = Trim(OI_table(i, 1))
                                categ = Trim(OI_table(i, 2))
                                grade = OI_table(i, 3)
                                extend = OI_table(i, 4)
                                net = OI_table(i, 5)
                                result = OI_table(i, 7)
                            End If

                               If OI_table(i, 6) <> "" And IsNothing(OI_table(i, 6)) = False Then
                                    If case_range <> "" Then
                                        case_range = case_range & ", " & OI_table(i, 6)
                                    Else
                                       case_range = OI_table(i, 6)
                                    End If
                                End If
                        Next i



авторСтрока с i = 0 не нужна.
Повторный Trim не нужен => убрал, но это не меняет дела.

авторПустые значения тоже значения - что и как Вы прочитали в некоем внешнем файле - неизвестно. => внешний файл заполнен без пустых значений, в цикле заполнения массива есть проверка на непустые значения. Добавил выход из цикла, как только достигнута линия с пустыми значениями.

Все равно это все не решает моей проблемы. :(
...
Рейтинг: 0 / 0
17.08.2016, 11:54
    #39293157
IFK
IFK
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Повторное использование массива
i45,

Хм. Я может не совсем правильно выразился - программа не закрыта, там есть условие на выход, внутри которого затирается массив, если выбран выход из программы. Хотя Вы навели меня на мысль. Спасибо!
...
Рейтинг: 0 / 0
17.08.2016, 11:57
    #39293162
i45
i45
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Повторное использование массива
IFK,

В полном цикле значения по-прежнему затирают друг друга.
Появление пустых значений ищите в верхнем цикле с debug.assert
...
Рейтинг: 0 / 0
17.08.2016, 12:06
    #39293171
IFK
IFK
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Повторное использование массива
i45,

Так я как раз и ищу способ не перезаписывать массив в верхнем цикле. При текущем коде это получается, но сам массив при его повторной проверке во втором цикле оказывается пустой. Скорее всего Вы правы и он затирается при окончании саба. Хочу попробовать объявить массив как паблик в старте формы и посмотреть, что будет.
...
Рейтинг: 0 / 0
17.08.2016, 12:22
    #39293195
i45
i45
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Повторное использование массива
IFKi45,

Так я как раз и ищу способ не перезаписывать массив в верхнем цикле. При текущем коде это получается, но сам массив при его повторной проверке во втором цикле оказывается пустой. Скорее всего Вы правы и он затирается при окончании саба. Хочу попробовать объявить массив как паблик в старте формы и посмотреть, что будет.

Это может помочь, если не выгружать форму. Сам по себе Public расширяет зону видимости переменной, но не время ее жизни.
...
Рейтинг: 0 / 0
17.08.2016, 12:23
    #39293196
IFK
IFK
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Повторное использование массива
Поборол: ошибка была в локальном объявлении массива. Спасибо i45 - навел меня на мысль объявить массив глобально. Вместе с Redim Preserve все сработало как надо. :)
...
Рейтинг: 0 / 0
17.08.2016, 12:24
    #39293198
IFK
IFK
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Повторное использование массива
i45,

Да, форма не выгружается. :)
...
Рейтинг: 0 / 0
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Повторное использование массива / 10 сообщений из 10, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]