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

Подбор массива из базы по совпадению

06.07.2012, 00:31. Показов 1621. Ответов 14
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем здравствуйте.

Ситуация такая: есть ячейка с условием. Есть список этих условий. И есть некая база данных с таблицами.

Ширина таблиц всегда одинакова. Длинна таблиц не определена и не зависит друг от друга. Кол-во условий совпадает с колличеством таблиц. Кол-во условий не определено.

Список хотелось бы представить одномерным массивом, а базу данных двухмерным массивом(или набором двухмерных массивов).

Вопрос: как сделать так, чтобы можно было задать неопределенное колличество массивов. Или так, чтобы в итоге вырезалась часть из одного массива. (Mass(N1 To N2, N3) не хочет работать)

Как оно выглядит в каменном веке приложено ниже.
Вложения
Тип файла: xls Пример2.xls (33.0 Кб, 17 просмотров)
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.07.2012, 00:31
Ответы с готовыми решениями:

Выборка из базы по совпадению
Таблица содержит: Автомоторс Ремонт авто Все для автомобилей Выбираю из бд по %авто%,...

Группировка и сложение значений двумерного массива по совпадению двух значений
Всем добрый день! Голову сломал, смиренно прошу помощи. Есть двумерный массив, задача:...

Опытный подбор элементов массива
Ребят, помогите написать программу, сумма элементов массива с четными индексами, опытным путём...

Keywords-Club (Склад Ключевых Слов, Подбор Ключевых Слов, Бесплатные Базы Кеев)
По просьбе одноклубников и по причине запрета регистрации, на этом замечательном форуме, размещаю...

14
2618 / 548 / 109
Регистрация: 21.03.2012
Сообщений: 1,051
06.07.2012, 01:12 2
1. Зачем представлять данные в виде массивов, если они и так уже расположены в массивах ячеек рабочего листа?
2. Что именно означает выражение "вырезалась часть из одного массива"? Зачем её "вырезать"?
3. Какова, вообще, конечная цель всех манипуляций?
0
0 / 0 / 0
Регистрация: 06.07.2012
Сообщений: 10
06.07.2012, 01:48  [ТС] 3
1. Рабочих листов будет много, на одном из них будет база данных по вариациям ограждающий конструкций, а на другом расчет.
2. В том варианте который я написал, каждая таблица представленна 1м массивом, что не очень удобно, если их будет 10+. так как их ширина одинакова, можно задать 1 общий массив, и делать его на равные части. вот только я не знаю как это сделать((
3. Цель - компактная формула, которую можно будет использовать в ВПР, и далее подставлять в расчетные формулы. (=ВПР(C14;chg(C12;C5;H2:J7;C6;K2:M8;C7;N2:P6);2;ЛОЖЬ)) Ячейка D14
0
призрак
3262 / 890 / 119
Регистрация: 11.05.2012
Сообщений: 1,702
Записей в блоге: 2
06.07.2012, 08:17 4
вариант с именованными диапазонами
Вложения
Тип файла: xls впр_с_именами.xls (33.0 Кб, 9 просмотров)
0
369 / 78 / 6
Регистрация: 23.05.2012
Сообщений: 232
06.07.2012, 09:20 5
Может быть я неправильно понял задание, но
Цитата Сообщение от Коруин Посмотреть сообщение
Рабочих листов будет много, на одном из них будет база данных по вариациям ограждающий конструкций, а на другом расчет.
можно понять так, что вам бы хотелось разные типы конструкций держать на отдельных листах?
и на отдельном листе делать выборку по типу конструкции и ее наименованию?
Тогда посмотрите - может подойдет мой вариант, или на какие то идеи натолкнет...
Или разъясните людям, далеким от строительства - что вы имели ввиду
Только там в формуле надо еще организовать проверку на недоступность значения, потому что если вы выберите "Люк" в типе 1 или 3 то вам вернет !Н/Д - потому как там нет такой позиции.
Но это штатно делается.
Вложения
Тип файла: xls Пример.xls (36.0 Кб, 7 просмотров)
0
2618 / 548 / 109
Регистрация: 21.03.2012
Сообщений: 1,051
06.07.2012, 09:28 6
Коруин, советую использовать вариант, подобный тому, что предложил ikki. Думается, что указанный способ полностью покрывает Ваши потребности. К тому же, он очень прост.

Цитата Сообщение от Коруин Посмотреть сообщение
... можно задать 1 общий массив, и делать его на равные части...
Во-первых, здесь нужен не двумерный массив, а трёхмерный (индекс таблицы, индекс строки в таблице, индекс ячейки строки в таблице). Во-вторых, работать с произвольным фрагментом массива (пусть даже непрерывным) как с единым целым невозможно. Допустима лишь поэлементная адресация.
Можно, конечно, организовать "вложенные" массивы или воспользоваться коллекциями, но для решения подобной задачи такой подход, по-моему, сложноват.
0
0 / 0 / 0
Регистрация: 06.07.2012
Сообщений: 10
06.07.2012, 11:15  [ТС] 7
Всем большое спасибо за ответы.
Да, вариант ikki подходит, спасибо)

Нет, все типы конструкций хранятся на одном листе, в строчку или в столбец, не важно. Если выбрать люк, а его там нету, то должно выскакивать Н/Д, аналогично, если в списке ДВ1, а ты ввёл ДВ.

По поводу одномерного массива.
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Function Xo(C As Variant, ByRef L As Variant, ByRef Bd As Variant) As Variant
Dim i As Integer, j As Integer, K As Integer, M As Integer, F As Integer
Dim Vari, Base_D, Mass()
Base_D = Bd
Vari = L
i = UBound(L, 1)
j = UBound(Bd, 1)
For K = 1 To i
    If CStr(Vari) = C Then
        For F = 1 To 3
            For M = 1 To j
            Mass(j, 1) = Base_D(j, i)
            Next
        i = i + 1
        Next
    End If
Next
Xo = Mass
End Function
Вот неработает оно только.
0
призрак
3262 / 890 / 119
Регистрация: 11.05.2012
Сообщений: 1,702
Записей в блоге: 2
06.07.2012, 11:20 8
а что вы хотите добиться этим кодом?
0
0 / 0 / 0
Регистрация: 06.07.2012
Сообщений: 10
06.07.2012, 11:35  [ТС] 9
Хочу чтоб из 1 массива выделялась нужная мне часть.
-узнаём строчку, в которая совпадает с целевым значением.
-вставляем в новый массив все строчки, из диапазона столбиков: (от 3i до 3i+2) (для таблицы шириной 3)

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Function Xo(C As Variant, ByRef L As Variant, ByRef Bd As Variant) As Variant
Dim i As Integer, j As Integer, K As Integer, M As Integer, F As Integer, s as integer
Dim Vari, Base_D, Mass()
Base_D = Bd
Vari = L
i = UBound(L, 1)
j = UBound(Bd, 1)
For K = 1 To i
    If CStr(Vari) = C Then
    s=3i
        For F = 1 To 3
            For M = 1 To j
            Mass(j, 1) = Base_D(j,si)
            Next
        s=s+1
        Next
    End If
Next
Xo = Mass
End Function
поправочка
0
призрак
3262 / 890 / 119
Регистрация: 11.05.2012
Сообщений: 1,702
Записей в блоге: 2
06.07.2012, 11:40 10
"поправочка" работает?
если нет - выложите файл с примером вызова вашей функции
0
0 / 0 / 0
Регистрация: 06.07.2012
Сообщений: 10
06.07.2012, 11:47  [ТС] 11
нет, ничего не работает((
Вложения
Тип файла: xls Пример2.xls (36.0 Кб, 9 просмотров)
0
призрак
3262 / 890 / 119
Регистрация: 11.05.2012
Сообщений: 1,702
Записей в блоге: 2
06.07.2012, 12:11 12
да оно и не компилируется даже
Visual Basic
10
s=3i
что вы этим хотели сказать?

Добавлено через 5 минут
Visual Basic
1
2
3
4
5
6
Function Xo(t As Range, Bd As Range)
  Dim c As Range
  Set c = Bd.Rows(1).Find(what:=t.Value, LookIn:=xlValues, lookat:=xlWhole)
  If c Is Nothing Then Exit Function
  Set Xo = Range(c.Offset(1), c.End(xlDown)).Resize(, 3)
End Function
Добавлено через 2 минуты
вызов (из яч. D14)
Код
=ВПР(C14;xo($C$12;$H$2:$P$2);2;0)
Добавлено через 9 минут
пс. а вообще, я, честно говоря, не очень понимаю ваше стремление обязательно чего-нибудь "намакросить"
эта задача достаточно просто решается с помощью встроенных функций Excel, что делает такое решение универсальным.
а переносимость решения с использованием UDF еще надо обеспечивать.
0
0 / 0 / 0
Регистрация: 06.07.2012
Сообщений: 10
06.07.2012, 12:23  [ТС] 13
ikki, большое спасибо, понятия не имею как, но оно работает именно так, как нужно))

А чтобы поменять ширину таблицы, нужно в строке 5 изменить Resize(, 3)?
0
призрак
3262 / 890 / 119
Регистрация: 11.05.2012
Сообщений: 1,702
Записей в блоге: 2
06.07.2012, 12:34 14
работает так:
строка 3 - находит c - ячейку с нужным значением (напр., "Тип 3", t.Value) в указанном диапазоне ($H$2:$P$2)
строка 4 - проверяет, если такая ячейка не найдена, то выходим из функции
строка 5 - возвращаем результат - ссылку на диапазон. диапазон определяем как начинающийся на одну строку ниже от найденной ячейки (c.Offset(1)), заканчивающейся самой последней заполненной ячейкой вниз от найденной (c.End(xlDown)) и расширенный до 3 столбцов (Resize(, 3))

фух... надеюсь, понятно объяснил
1
0 / 0 / 0
Регистрация: 06.07.2012
Сообщений: 10
06.07.2012, 12:42  [ТС] 15
Более чем, ещё раз спасибо)
0
06.07.2012, 12:42
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.07.2012, 12:42
Помогаю со студенческими работами здесь

Случайный индекс из массива. Подбор на основе индекса элемента из справочника.
Хочу получить из массива случайный индекс, далее подобрать на основе индекса элемент из...

ВПР по частичному совпадению
Ребята, всем привет. Нужна помощь. В таблице около 200 тыс. строк, попробую на примере 2х. Есть...

Поиск по совпадению в VBA_EXCEL
Как организовать в Excel поиск по совпадению, как стандартном поиске Excel, а не по полному...

Фильтр по частичному совпадению
Всем доброго времени суток! Требуется как всегда помощь, пытался сделать по примеру с форума...


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

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