Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.54/37: Рейтинг темы: голосов - 37, средняя оценка - 4.54
6 / 4 / 1
Регистрация: 21.02.2013
Сообщений: 62
Excel

Не присваиваются значения массиву

26.02.2013, 08:48. Показов 7903. Ответов 26
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток всем!
Коротко о главном:
В Функции, располагающейся в ЭтаКнига необходимо присвоить данные массиву. Само присвоение не происходит. Подскажите, пожалуйста, почему это может быть? Приведу выдержки из функции
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
...
ReDim tdata(11, i * (ind - 7)) As Variant
...
For j = 6 To ind - 1
...
Range("a10").Select
While ActiveCell.Value <> ""
tdata(1, i) = ActiveCell.Value
tdata(2, i) = Range("D7").Value
tdata(3, i) = ActiveCell.Offset(0, 1)
tdata(4, i) = Cells(, j)
tdata(4, i) = Cells(, ind)
ActiveCell.Offset(1, 0).Select
i = i + 1
wend
...
Next j
...
при этом такое впечатление, что массив даже не определяется. В окне immediate на опрос массива Subscript out of range, при опросе в теле программы через MsgBox(tdata(1,i)) просто ничего не выводится, при опросе MsgBox(ActiveCell.Value) результат правильный (т.е. содержимое ячейки)
Подскажите ЧЯДНТ?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
26.02.2013, 08:48
Ответы с готовыми решениями:

При повторном создании OLEObjects не присваиваются указанные имена
Добрый день! Столкнулся с необычной проблемой, которую сам никак не могу решить. Дело в том, что...

После суммирования ячеек во всех ячейках присваиваются значение последней. Как исправить?
Sub ekz() Dim b As Integer Dim k As Integer Dim e As Integer Dim c As Integer Dim f As Integer...

Как присвоить массиву значения из ячеек и наоборот?
как присвоить массиву значения из ячеек и наоборот ?

26
6998 / 2896 / 555
Регистрация: 19.10.2012
Сообщений: 8,804
26.02.2013, 14:17
Студворк — интернет-сервис помощи студентам
Присваивание идёт, но вероятно нужно это дело повернуть на 90 градусов, т.к. массив требует выгрузки где-то так:

Visual Basic
1
ActiveCell.Resize(11, i + 1) = tdata
Но это явно не то, что требуется.
В алгоритм сбора данных вникать некогда, извините - работа... Переделывать код тем более некогда.
1
6 / 4 / 1
Регистрация: 21.02.2013
Сообщений: 62
26.02.2013, 16:44  [ТС]
Всем спасибо за помощь. Просто видно уработался... Заново переписал все, да еще с учетом замечаний и получилось:
Visual Basic
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
34
35
36
37
38
39
40
         With wsSh           
                   'Ищем последний столбец
                    ind = 1
                    While Cells(9, ind) <> "Примечание"
                        ind = ind + 1
                    Wend
                    'считаем непустые строки по столбцу А
                    i = 0
                    For k = 10 To Cells.SpecialCells(xlLastCell).Row
                        If Cells(k, 1) <> "" Then i = i + 1
                    Next k
                    'задаем размер массива
                    ReDim tdata(1 To 11, 1 To i * (ind - 6))
                    'Цикл по столбцам
                    i = 0
                    For j = 6 To ind - 1
                        For k = 10 To Cells.SpecialCells(xlLastCell).Row
                            If Cells(k, 1) <> "" Then
                                i = i + 1
                                tdata(1, i) = Cells(k, 1).Value
                                tdata(2, i) = Cells(7, 4).Value
                                tdata(3, i) = Cells(k, 2).Value
                                tdata(4, i) = Cells(k, 3).Value
                                tdata(5, i) = Cells(k, 4).Value
                                tdata(6, i) = Cells(k, 5).Value
                                tdata(7, i) = Cells(8, j).Value
                                tdata(8, i) = Cells(9, j).Value
                                tdata(9, i) = Cells(k, j).Value
                                tdata(10, i) = Cells(k, ind).Value
                            End If
                        Next k
                    Next j
                End With
                'Переносим данные из массива в лист
Worksheets(ThisWorkbook.ActiveSheet.Name).Activate
                For j = 1 To i
                    For k = 1 To 10
                        Cells(j + 1, k) = tdata(k, j)
                    Next k
                Next j
Все работает как надо. Если есть советы по совершенствованию - буду очень благодарен
0
 Аватар для KoGG
5730 / 1633 / 419
Регистрация: 23.12.2010
Сообщений: 2,455
Записей в блоге: 1
26.02.2013, 17:41
Конструкция
Visual Basic
1
2
3
4
5
6
7
8
With wsSh
      'Ищем последний столбец
      ind = 1
      While Cells(9, ind) <> "Примечание"
          ind = ind + 1
      Wend
      '...
End With
- работает вовсе не листом wsSh, а со случайным активным листом открытого файла.
Пропущена точка перед Cells .
Правильная запись:
Visual Basic
1
2
3
4
5
6
7
8
With wsSh
      'Ищем последний столбец
      ind = 1
      While .Cells(9, ind) <> "Примечание"
          ind = ind + 1
      Wend
      '...
End With
Активация ячейки тоже происходит не на нужном листе.
В коде полно аналогичных ошибок и логических неувязок.

Добавлено через 1 минуту
Если код работает - просто повезло, что файл открылся с нужным активным листом.
1
6998 / 2896 / 555
Регистрация: 19.10.2012
Сообщений: 8,804
26.02.2013, 18:07
Вот и я о том же - когда не ориентируешься на активный лист и всякие селекты, то просто вынужден всюду явно прописывать/отслеживать объекты, к которым обращаешься.
А тут в примере выше это With wsSh...end with вообще не используется, точек нет нигде
А это
Visual Basic
1
Worksheets(ThisWorkbook.ActiveSheet.Name).Activate
вообще непонятно в отрыве от контекста - это в какой книге происходит? Вообще конструкция рабочая, проверил. Но шаткая
1
6 / 4 / 1
Регистрация: 21.02.2013
Сообщений: 62
26.02.2013, 22:09  [ТС]
KoGG,
Hugo121,
Неувязок полно, согласен. Точки действительно пропустил. Хоть и все работает, но поправил - так правильно.
Это выдержка из кода... Выше идет перебор из кучи книг, кучи листов выбираются нужные данные и все это дело по очереди закрывается (это про wsSH) Т.е. книги открываются заведомо с первого листа и просматриваются все листы на предмет нужной информации.
Еще советы есть?))
В любом случае Огромное спасибо Вам!

Цитата Сообщение от Hugo121 Посмотреть сообщение
Worksheets(ThisWorkbook.ActiveSheet.Name ).Activate
просто уже замучался с этим всем и прописал активацию таким образом (ведь до этой строки источник уже закрыт, а имена листов приемника динамические, то есть создаются с именем по умолчанию)
0
6998 / 2896 / 555
Регистрация: 19.10.2012
Сообщений: 8,804
27.02.2013, 00:35
Так это иначе делается - когда создали лист, то берёте в переменную ссылку на этот объект, далее используете ссылку.
Ну или в переменную имя этого листа - но с ссылкой лучше, и не ошибётесь файлом.
Например:

Visual Basic
1
2
3
4
5
6
7
8
Sub test()
    Dim nsh As Object
    With ThisWorkbook
        .Sheets.Add After:=.Sheets(.Sheets.Count)
        Set nsh = .Sheets(.Sheets.Count)
    End With
    MsgBox nsh.Name
End Sub
1
6 / 4 / 1
Регистрация: 21.02.2013
Сообщений: 62
27.02.2013, 13:25  [ТС]
Спасибо, поправил. Действительно так получилось, что сохранялись документы с активным нужным листом. Иначе вываливалась ошибка 400. Теперь все хорошо.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
27.02.2013, 13:25

Как при выборе значения из ComboBox1 выдать значения в ComboBox2, свойственные только для значения из ComboBox1
Подскажите пожалуйста вот еще что: Как организовать работу двух ComboBox, так чтобы при выборе...

Описать процедуру ShiftLeft3(A, B, C), выполняющую левый циклический сдвиг: значение A переходит в C, значение C — в B, значение В-в А
Описать функцию ShiftLeft3(A, B, C), выполняющую левый циклический сдвиг: значение A переходит в C,...

Сформировать одномерный массив Х, значения элементов которого являются минимальные значения элементов строк массива Н(5х5)
Сформировать одномерный массив Х ,значения элементов которого являются минимальные значения...

По массиву А получить массив В, присвоив его k элементу значение true, если выполнено указанное ниже условие и значение false
По массиву А получить массив В, присвоив его k элементу значение true, если выполнено указанное...

Организуйте массив. Выведите на дисплей значения и индексы элементов, модуль значения которых меньше 10
РАБОТА С ОДНОМЕРНЫМИ МАССИВАМИ ДАНО: Организуйте массив. Выведите на дисплей значения и...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
27
Ответ Создать тему
Новые блоги и статьи
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru