Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.63/19: Рейтинг темы: голосов - 19, средняя оценка - 4.63
0 / 0 / 0
Регистрация: 02.08.2013
Сообщений: 14
1

Как загнать в массив столбцы идущие не по порядку

13.08.2013, 17:30. Показов 3769. Ответов 39
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем привет!
Столкнулся с проблемой, имеется таблица в формате excel. В ней есть n-е количетсов заполненных столбцов, как загнать в массив к примеру столбцы A,B,N,Z, при условии что они идут не по порядку и их порядок изменять нельзя.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.08.2013, 17:30
Ответы с готовыми решениями:

Как загнать текст из консоли в массив и как загнать текст из файла в массив
Как загнать текст из консоли в массив и как загнать текст из файла в массив. Как использовать...

Как загнать предложение в массив?
Как загнать предложение в массив string? Посимвольно это все понятно, а именно как чтобы каждое...

Как массив загнать в Bitmap
Люди помогите тану есть массив bits вот так созданный:%) а как его обратно в буфер загнать?:-[...

Как из ListBox загнать значение в массив?
Ребят, как из listBox загнать значение в массив?

39
6922 / 2832 / 543
Регистрация: 19.10.2012
Сообщений: 8,645
15.08.2013, 12:24 21
Author24 — интернет-сервис помощи студентам
Никаких ошибок.

Visual Basic
1
2
3
4
5
6
7
Sub tt()
    array_1 = [a1:a3]
    last = UBound(array_1)
    MsgBox last
    x = array_1(last, 1)
    MsgBox x
End Sub
0
0 / 0 / 0
Регистрация: 02.08.2013
Сообщений: 14
15.08.2013, 12:33  [ТС] 22
а если я не знаю размер массива, я собственно с этой целью и хочу определить индекс последнего элемента, для того чтобы потом записать туда новое значение. По сути, тот же справочник.
0
6922 / 2832 / 543
Регистрация: 19.10.2012
Сообщений: 8,645
15.08.2013, 12:40 23
Если ругается на UBound(array_1) - значит array_1 не массив!
Т.е. ошибка раньше. Ну или нужно в коде ставить проверку на этот казус.
0
0 / 0 / 0
Регистрация: 02.08.2013
Сообщений: 14
15.08.2013, 13:07  [ТС] 24
Если я все правильно понимаю, то размер массива (если его размерность не определена изначально) опредлятеся индексом последнего элемента. Я пытаюсь вычислить этот индекс через UBound, но ничего не выходит.

Добавлено через 3 минуты
Я объявил массив:
Visual Basic
1
Dim slovar() as Variant
затем, хочу определить его размерность:
Visual Basic
1
last = UBound(slovar)
в ответ:
subsript out of range
0
6922 / 2832 / 543
Регистрация: 19.10.2012
Сообщений: 8,645
15.08.2013, 13:13 25
Зачем определять размер того, чего ещё фактически нет?
Вообще я не теоретик, поэтому не объясню. Массив конечно уже есть (MsgBox IsArray(slovar)), но его ещё нет
0
0 / 0 / 0
Регистрация: 02.08.2013
Сообщений: 14
15.08.2013, 13:17  [ТС] 26
Ну я изначально ввожу туда 1 значение, чтобы далее как минимум размерность была равна 1, а вот дальше в зависимости от наращивания значений уже необходимо определять размерность
0
6922 / 2832 / 543
Регистрация: 19.10.2012
Сообщений: 8,645
15.08.2013, 13:27 27
Если вносите - должно вывести размер.
Можно даже не вносить - достаточно размер задать:

Visual Basic
1
2
    Dim slovar(0 To 0) As Variant
    last = UBound(slovar)
0
KoGG
15.08.2013, 13:49
  #28

Не по теме:

..... удалено

0
2618 / 548 / 109
Регистрация: 21.03.2012
Сообщений: 1,051
15.08.2013, 20:52 29
Цитата Сообщение от sky87 Посмотреть сообщение
... я занимаюсь vba всего 1,5 недели, то про понятие словаря еще не слышал...
Словарь входит в инструментарий WSH. У VB(A) имеется сходный по своей сути инструмент - коллекция. Впрочем, возможности у них несколько отличаются.
Цитата Сообщение от sky87 Посмотреть сообщение
... пытаюсь вычислить этот индекс через UBound...
Поскольку Вы используете массив типа Variant, то удобнее поступать так:
Visual Basic
1
2
3
4
5
6
7
Sub Example()
Dim arr
arr = Array()
MsgBox LBound(arr) & " >> " & UBound(arr)
ReDim arr(10)
MsgBox LBound(arr) & " >> " & UBound(arr)
End Sub
1
6922 / 2832 / 543
Регистрация: 19.10.2012
Сообщений: 8,645
15.08.2013, 21:36 30
Но это не значит, что в макросах нельзя применять словарь.
Вполне можно. Можно даже применять "коллекции Visual Basic .NET", что есть что-то вроде обычного словаря, но например с встроенной сортировкой.
А вместо
Visual Basic
1
ReDim arr(10)
я обычно пишу
Visual Basic
1
ReDim arr(1 to 10)
ибо кто его знает, какая там позже вдруг может оказаться option base. Да и с нуля отсчёт неудобный.
0
2618 / 548 / 109
Регистрация: 21.03.2012
Сообщений: 1,051
16.08.2013, 21:00 31
Цитата Сообщение от Hugo121 Посмотреть сообщение
это не значит, что в макросах нельзя применять словарь.
Речь об этом и не шла. Была лишь указана "родительская" технология обсуждаемого инструмента.
Цитата Сообщение от Hugo121 Посмотреть сообщение
... обычно пишу...
Чтобы не вводить начинающих разработчиков макросов в заблуждение, уточню, что оператору
Visual Basic
1
ReDim arr(10)
соответствует оператор
Visual Basic
1
ReDim arr(1 To 11)
Цитата Сообщение от Hugo121 Посмотреть сообщение
... с нуля отсчёт неудобный
Кому - как. Мне, например, удобнее считать с нуля.
0
6922 / 2832 / 543
Регистрация: 19.10.2012
Сообщений: 8,645
17.08.2013, 00:54 32
Почему 1 to 11? Обычно 0 to 10, но возможно 1 to 10 - если будет задано option base 1.
0
2618 / 548 / 109
Регистрация: 21.03.2012
Сообщений: 1,051
17.08.2013, 03:34 33
Цитата Сообщение от Hugo121 Посмотреть сообщение
Почему 1 to 11?...
Потому что без оператора
Visual Basic
1
Option Base 1
оператор
Visual Basic
1
ReDim arr(10)
даёт для индекса массива диапазон значений [0:10]. А оператор
Visual Basic
1
ReDim arr(1 To 10)
- диапазон значений [1:10].

Стало быть, для сохранении того же количества значений индекса при его начальном значении, равном 1, необходим оператор
Visual Basic
1
ReDim arr(1 To 11)
0
0 / 0 / 0
Регистрация: 02.08.2013
Сообщений: 14
17.08.2013, 11:39  [ТС] 34
А мне кажется, что нет разницы от 0 или от 1 =)
только при 1 нужно еще Option Base прописывать)))а это на строку больше
0
6922 / 2832 / 543
Регистрация: 19.10.2012
Сообщений: 8,645
17.08.2013, 12:07 35
Для того же количества - да.
Но когда начинающий пишет ReDim arr(10) - он скорее всего хочет получить массив из 10 значений
В любом случае надёжнее не полагаться на option base в чужих файлах (для себя конечно другое дело, но не для форума).
Другое дело wsh/vbs - там n to m не работает...
0
0 / 0 / 0
Регистрация: 02.08.2013
Сообщений: 14
17.08.2013, 12:58  [ТС] 36
кстати, вот кусок кода:
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
For n = 1 To l Step 19
                 schet = Mid(temp, n, m)
                 temp3 = Mid(schet, 13, 4)
                 Worksheets(14).Cells(i, 5) = Worksheets(14).Cells(i, 5) + 1
                 If temp3 = "весь" Then
                 Else
                     temp4 = Mid(schet, 13, 5)
                     If temp4 = "часть" Then
                         kont = Mid(temp, n, 19)
                         last = UBound(slovar)
                         For k = 0 To last
                            If slovar(k) = 0 Then
                                slovar(k) = kont
                            Else
                                If kont <> slovar(k) Then
                                    last = last + 1
                                    slovar(last) = kont
                                    Exit For
                                Else
                                End If
                            End If
                         Next k
                      Else
                      End If
                  End If
             Next n
1. Определяю длину строки (в данном случае она равна 38 символам)
2. Если длина строки больше 17, то выполнение кода переходит на этот кусок
3. Вырезаю 4 символа, если они = весь, то добавляю +1 в столбец
4. Если нет, то вырезаю 5 символов, и если они = часть, то записываю 19 символов (это нормальная длина для одного номера коробки) в массив, вот тут то меня и настигла печаль, когда я пытаюсь вычислить индекс последнего заполненого элемента в массиве slovar, то у меня нифига не меняется.
0
Модератор
Эксперт MS Access
11960 / 4828 / 779
Регистрация: 07.08.2010
Сообщений: 14,138
Записей в блоге: 4
17.08.2013, 15:24 37
Суть "програмки" заключается в следующем, есть книга в которой есть 13 листов, первые 12 (это индексы месяцев по сути) содержат некоторый набор данных в 24 столбцах (из них используются только 6), а на 13 листе необходимо сделать итоговый отчет, в котором будет произведен подсчет данных по каждому месяцу. Мне нужно исключить совпадающие значения, но важно, чтобы сохранялась синхра построчно. Вот именно из-за этого я подумал о том, что один большой массив будет использовать для синхры проще, как оказалось нет.
переведя на русский язык получила на входе

мес,фио,должность,отработанные часы,суммы зарплаты по видам,итого
01,иванов,слесарь,160,11000,5000,6000,0,12000,34000
01,петров,......................

02,иванов(другой),электрик,120,10000,500,2000,0,0,12500
02,иванов,слесарь,60,10000,2000,3000,1000,2000,18000

03,иванов,слесарь,уволился

получить
фио,должн,отработанное время и итого по месяцам
---------,01в,01и,02в,02и
иванов,слесарь,160,34000,60,18000,-,-
иванов(другой),электрик,-,-,120,12500,160,32000

=================
насколько сильно я ошиблась в логике задачи
не обязательно выкладывать реальные таблицы

всегда есть
---ооо рага и ковыты
--столы стулья
--количество-цена-сумма-ндс
0
0 / 0 / 0
Регистрация: 02.08.2013
Сообщений: 14
17.08.2013, 18:08  [ТС] 38
эммм....я даж не знаю что сказать)
я ничего не понял из вашего сообщения =) Видимо я также выразился.

Добавлено через 9 минут
примерный вариант таблицы следующий:

Город \ № коробки \ Человек \ Наименование наполнителя коробки
Иркутск \ 1234-часть \ Вася \ абв
Мурманск\ 3245-весь \ Антон \ гра
Москва \ 4829 - часть, 3829-часть \ Денис \ дла

это лист 1 (что является месяцем январь)
далее должны следовать еще 11 месяцев и последняя сводная таблица, где должны быть те же столбцы, только вместо № коробки должно быть просто перечисление сколько через данный город, конкретным человеком было провезено наполнителя, кол-во индексировать исходя из повторений по этим трем столбцам.

вот как-то так

я не могу сделать так называемый справочник, только хочу его сделать как массив, нет пока что времени изучать синтаксис справочника ((
0
6922 / 2832 / 543
Регистрация: 19.10.2012
Сообщений: 8,645
18.08.2013, 12:52 39
Мне кажется, что эта проблема не проблема, на словаре всё решается легко и просто.
Но т.к. коммерческая тайна и файла нет - нет и решения
0
11508 / 3794 / 681
Регистрация: 13.02.2009
Сообщений: 11,197
18.08.2013, 13:08 40
к сожалению не могу приложить сам файл из-за ком тайны
За это время уже бы заменил все "секретные" буквы и цифры на любые наборы символов, оставил по пару десятков строк (с максимально возможными вариантами записей) и выложил пример.
0
18.08.2013, 13:08
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.08.2013, 13:08
Помогаю со студенческими работами здесь

Как из стека int-ы загнать в массив?
массив определен за асемблерской вставкой

Как загнать массив записей в процедуру?
Как загнать массив записей в процедуру? Препод задал задачу по добавлению и изменению массива...

Как загнать в массив строку текста по буквам?
помогите пожалуйста кто-нибудь очень нада

Создал многомерный массив как загнать в Комбобокс
'создаём массив многомерный, данные массива String DIM Массив(1 TO 20, 1 TO 70) AS STRING...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru