powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Повторное использование массива
10 сообщений из 10, страница 1 из 1
Повторное использование массива
    #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
Повторное использование массива
    #39293135
Фотография i45
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IFK,

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

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

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

Что значит в конце программы массив не уничтожается. Уничтожается, программа то закончилась.
...
Рейтинг: 0 / 0
Повторное использование массива
    #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
Повторное использование массива
    #39293157
IFK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IFK
Гость
i45,

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

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

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

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

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

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


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