Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Формирование массива с возможными значениями - Мир MS Excel

Старая форма входа
  • Страница 1 из 2
  • 1
  • 2
  • »
Модератор форума: китин, _Boroda_  
Формирование массива с возможными значениями
Sashagor1982 Дата: Среда, 03.06.2015, 21:43 | Сообщение № 1
Группа: Проверенные
Ранг: Обитатель
Сообщений: 287
Репутация: -6 ±
Замечаний: 0% ±

Excel 2007
Здравствуйте уважаемые форумчане. В приложенном файле-примере два столбца данных. Необходимо сформировать массив в котором в порядке возрастания расположены элементы первого столбца, причем только по одному разу, например "122259";"122791" и т.д. при чем в массив должны попасть только те данные, во втором столбце у которых содержится "с-т" и солд.". Решение должно быть без использования циклов. Спасибо.
К сообщению приложен файл: 8518643.xls (45.5 Kb)
 
Ответить
СообщениеЗдравствуйте уважаемые форумчане. В приложенном файле-примере два столбца данных. Необходимо сформировать массив в котором в порядке возрастания расположены элементы первого столбца, причем только по одному разу, например "122259";"122791" и т.д. при чем в массив должны попасть только те данные, во втором столбце у которых содержится "с-т" и солд.". Решение должно быть без использования циклов. Спасибо.

Автор - Sashagor1982
Дата добавления - 03.06.2015 в 21:43
ikki Дата: Среда, 03.06.2015, 22:16 | Сообщение № 2
Группа: Друзья
Ранг: Старожил
Сообщений: 1906
Репутация: 504 ±
Замечаний: 0% ±

Excel 2003, 2010
Решение должно быть без использования циклов.
откуда столь категоричное пожелание?

в принципе - можно на SQL запрос написать...
вот только я не понял - строки 71 и 72 должны обе попасть или только какая-то одна? если одна - то какая именно и почему?


помощь по Excel и VBA
ikki@fxmail.ru, icq 592842413, skype alex.ikki


Сообщение отредактировал ikki - Среда, 03.06.2015, 22:19
 
Ответить
Сообщение
Решение должно быть без использования циклов.
откуда столь категоричное пожелание?

в принципе - можно на SQL запрос написать...
вот только я не понял - строки 71 и 72 должны обе попасть или только какая-то одна? если одна - то какая именно и почему?

Автор - ikki
Дата добавления - 03.06.2015 в 22:16
wild_pig Дата: Среда, 03.06.2015, 22:48 | Сообщение № 3
Группа: Проверенные
Ранг: Обитатель
Сообщений: 517
Репутация: 97 ±
Замечаний: 0% ±

2003, 2013
[offtop]
откуда столь категоричное пожелание?

Наверное, человек уже имел с ними дело и сделал для себя выводы.[/offtop]
 
Ответить
Сообщение[offtop]
откуда столь категоричное пожелание?

Наверное, человек уже имел с ними дело и сделал для себя выводы.[/offtop]

Автор - wild_pig
Дата добавления - 03.06.2015 в 22:48
Sashagor1982 Дата: Среда, 03.06.2015, 22:51 | Сообщение № 4
Группа: Проверенные
Ранг: Обитатель
Сообщений: 287
Репутация: -6 ±
Замечаний: 0% ±

Excel 2007
Они обе должны попасть, так как 132181 и 132281.
Цитата
откуда столь категоричное пожелание?

так как с циклом и кучей условий и непродуктивно и просто, хотелось бы рассмотреть другие способы решения.
 
Ответить
СообщениеОни обе должны попасть, так как 132181 и 132281.
Цитата
откуда столь категоричное пожелание?

так как с циклом и кучей условий и непродуктивно и просто, хотелось бы рассмотреть другие способы решения.

Автор - Sashagor1982
Дата добавления - 03.06.2015 в 22:51
Manyasha Дата: Среда, 03.06.2015, 22:52 | Сообщение № 5
Группа: Модераторы
Ранг: Старожил
Сообщений: 2198
Репутация: 898 ±
Замечаний: 0% ±

Excel 2010, 2016
Sashagor1982, здравствуйте. Без циклов, так без циклов :D
наверное код можно подсократить (пользовалась макрорекордером)

[p.s.]По замечанию Александра ( ikki), если значения в А одинаковые, а в В разные, то при выполнении остальных условий у меня попадут обе строки (в файле розовым выделены)[/p.s.]
К сообщению приложен файл: 8518643_1.xls (76.0 Kb)


ЯД: 410013299366744 WM: R193491431804
 
Ответить
СообщениеSashagor1982, здравствуйте. Без циклов, так без циклов :D
наверное код можно подсократить (пользовалась макрорекордером)

[p.s.]По замечанию Александра ( ikki), если значения в А одинаковые, а в В разные, то при выполнении остальных условий у меня попадут обе строки (в файле розовым выделены)[/p.s.]

Автор - Manyasha
Дата добавления - 03.06.2015 в 22:52
Sashagor1982 Дата: Среда, 03.06.2015, 23:01 | Сообщение № 6
Группа: Проверенные
Ранг: Обитатель
Сообщений: 287
Репутация: -6 ±
Замечаний: 0% ±

Excel 2007
А какой массив содержит результат?
 
Ответить
СообщениеА какой массив содержит результат?

Автор - Sashagor1982
Дата добавления - 03.06.2015 в 23:01
Manyasha Дата: Среда, 03.06.2015, 23:08 | Сообщение № 7
Группа: Модераторы
Ранг: Старожил
Сообщений: 2198
Репутация: 898 ±
Замечаний: 0% ±

Excel 2010, 2016
Sashagor1982, колонки D:E


ЯД: 410013299366744 WM: R193491431804
 
Ответить
СообщениеSashagor1982, колонки D:E

Автор - Manyasha
Дата добавления - 03.06.2015 в 23:08
ikki Дата: Среда, 03.06.2015, 23:30 | Сообщение № 8
Группа: Друзья
Ранг: Старожил
Сообщений: 1906
Репутация: 504 ±
Замечаний: 0% ±

Excel 2003, 2010
так как 132181 и 132281
сорри, сослепу не разглядел.
непродуктивно
не расшифруете?


помощь по Excel и VBA
ikki@fxmail.ru, icq 592842413, skype alex.ikki
 
Ответить
Сообщение
так как 132181 и 132281
сорри, сослепу не разглядел.
непродуктивно
не расшифруете?

Автор - ikki
Дата добавления - 03.06.2015 в 23:30
Sashagor1982 Дата: Четверг, 04.06.2015, 07:54 | Сообщение № 9
Группа: Проверенные
Ранг: Обитатель
Сообщений: 287
Репутация: -6 ±
Замечаний: 0% ±

Excel 2007
Если использовать циклы программа получится большая.. Можно как-нибудь через коллекции?
 
Ответить
СообщениеЕсли использовать циклы программа получится большая.. Можно как-нибудь через коллекции?

Автор - Sashagor1982
Дата добавления - 04.06.2015 в 07:54
Sashagor1982 Дата: Четверг, 04.06.2015, 07:56 | Сообщение № 10
Группа: Проверенные
Ранг: Обитатель
Сообщений: 287
Репутация: -6 ±
Замечаний: 0% ±

Excel 2007
Manyasha, , то есть без вывода на экран результат не получить? Можно сделать какой-нибудь массив например Rezultat, который будет содержать данные столбца D?
 
Ответить
СообщениеManyasha, , то есть без вывода на экран результат не получить? Можно сделать какой-нибудь массив например Rezultat, который будет содержать данные столбца D?

Автор - Sashagor1982
Дата добавления - 04.06.2015 в 07:56
Hugo Дата: Четверг, 04.06.2015, 10:05 | Сообщение № 11
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3255
Репутация: 707 ±
Замечаний: 0% ±

2019
Через коллекции, но циклы, циклы, циклы...
[vba]
Код
Option Explicit

Sub tt()
     Dim a(), i&, c As New Collection, x$
Dim ii&, j&, k&

     a = [a1].CurrentRegion.Value
     For i = 1 To UBound(a)
         If InStr("с-т|солд.", a(i, 2)) > 0 Then
             x = a(i, 1)
             If c.Count = 0 Then
                 c.Add x
             ElseIf c.Item(1) > x Then
                 c.Add x, Before:=1
             ElseIf c.Item(c.Count) < x Then
                 c.Add x
             Else
                 ii = 1
                 j = c.Count
                 Do While ii < j
                     k = ii + (j - ii) \ 2
                     If c.Item(k) >= x Then j = k Else ii = k + 1
                 Loop
                 If c.Item(ii) > x Then c.Add x, Before:=ii
             End If

         End If
     Next

     'тут перебор коллекции - это можно сказать массив данных, уже сортированный
     For i = 1 To c.Count
         Debug.Print c(i)
     Next
End Sub

[/vba]


excel@nxt.ru
webmoney: E265281470651 Z422237915069


Сообщение отредактировал Hugo - Четверг, 04.06.2015, 10:06
 
Ответить
СообщениеЧерез коллекции, но циклы, циклы, циклы...
[vba]
Код
Option Explicit

Sub tt()
     Dim a(), i&, c As New Collection, x$
Dim ii&, j&, k&

     a = [a1].CurrentRegion.Value
     For i = 1 To UBound(a)
         If InStr("с-т|солд.", a(i, 2)) > 0 Then
             x = a(i, 1)
             If c.Count = 0 Then
                 c.Add x
             ElseIf c.Item(1) > x Then
                 c.Add x, Before:=1
             ElseIf c.Item(c.Count) < x Then
                 c.Add x
             Else
                 ii = 1
                 j = c.Count
                 Do While ii < j
                     k = ii + (j - ii) \ 2
                     If c.Item(k) >= x Then j = k Else ii = k + 1
                 Loop
                 If c.Item(ii) > x Then c.Add x, Before:=ii
             End If

         End If
     Next

     'тут перебор коллекции - это можно сказать массив данных, уже сортированный
     For i = 1 To c.Count
         Debug.Print c(i)
     Next
End Sub

[/vba]

Автор - Hugo
Дата добавления - 04.06.2015 в 10:05
SLAVICK Дата: Четверг, 04.06.2015, 12:50 | Сообщение № 12
Группа: Модераторы
Ранг: Старожил
Сообщений: 2290
Репутация: 766 ±
Замечаний: 0% ±

2019
В готовых решениях я когда-то выкладывал функцию.
Заменил в ней пол строки ;)
Так?

У Вас в списке есть числа и текст как числа - если их нужно сбить в одно нужно поменять одну строку:
[vba]
Код
If Not dic.Exists(mas(i, ii)) And Not Trim(mas(i, ii)) = "" Then dic.Add mas(i, ii), i
на  
If Not dic.Exists(CStr(mas(i, ii))) And Not Trim(mas(i, ii)) = "" Then dic.Add CStr(mas(i, ii)), i
[/vba]
см. 2-й файл
К сообщению приложен файл: 8518643-1-.xlsm (37.5 Kb) · 2134987.xlsm (37.0 Kb)


Иногда все проще чем кажется с первого взгляда.

Сообщение отредактировал SLAVICK - Четверг, 04.06.2015, 13:14
 
Ответить
СообщениеВ готовых решениях я когда-то выкладывал функцию.
Заменил в ней пол строки ;)
Так?

У Вас в списке есть числа и текст как числа - если их нужно сбить в одно нужно поменять одну строку:
[vba]
Код
If Not dic.Exists(mas(i, ii)) And Not Trim(mas(i, ii)) = "" Then dic.Add mas(i, ii), i
на  
If Not dic.Exists(CStr(mas(i, ii))) And Not Trim(mas(i, ii)) = "" Then dic.Add CStr(mas(i, ii)), i
[/vba]
см. 2-й файл

Автор - SLAVICK
Дата добавления - 04.06.2015 в 12:50
AndreTM Дата: Четверг, 04.06.2015, 13:10 | Сообщение № 13
Группа: Друзья
Ранг: Старожил
Сообщений: 1762
Репутация: 500 ±
Замечаний: 0% ±

2003 & 2010
SLAVICK, да, именно - словарь здесь самый удобный вариант, поскольку имеет метод .exists
Ну а сортировку можно в конце и встроенную использовать.

Впрочем, предложенный Мариной вариант - похоже, самый оптимальный по затратам :)
Программирования-то он не требует... Ручками: включили автофильтр, отобрали строчки по второму столбцу, скопировали, сделали "Удалить дубликаты", сделали сортировку...


Skype: andre.tm.007
Donate: Qiwi: 9517375010
 
Ответить
СообщениеSLAVICK, да, именно - словарь здесь самый удобный вариант, поскольку имеет метод .exists
Ну а сортировку можно в конце и встроенную использовать.

Впрочем, предложенный Мариной вариант - похоже, самый оптимальный по затратам :)
Программирования-то он не требует... Ручками: включили автофильтр, отобрали строчки по второму столбцу, скопировали, сделали "Удалить дубликаты", сделали сортировку...

Автор - AndreTM
Дата добавления - 04.06.2015 в 13:10
SLAVICK Дата: Четверг, 04.06.2015, 13:17 | Сообщение № 14
Группа: Модераторы
Ранг: Старожил
Сообщений: 2290
Репутация: 766 ±
Замечаний: 0% ±

2019
похоже, самый оптимальный по затратам

По времени - да, но я добавил пост вот почему:

то есть без вывода на экран результат не получить? Можно сделать какой-нибудь массив например Rezultat,

На сколько я понимаю ТС нужно получить данные без вывода на лист... наверное для дальнейшей обработки. ^_^
А с функцией это легко можно сделать(ну или переделать ее немного под свои нужды)

Hugo - у Вас попадают и кода с пустыми значениями- наверное из-за ;) :
[vba]
Код
If InStr("с-т|солд.", a(i, 2)) > 0 Then
[/vba]


Иногда все проще чем кажется с первого взгляда.

Сообщение отредактировал SLAVICK - Четверг, 04.06.2015, 13:23
 
Ответить
Сообщение
похоже, самый оптимальный по затратам

По времени - да, но я добавил пост вот почему:

то есть без вывода на экран результат не получить? Можно сделать какой-нибудь массив например Rezultat,

На сколько я понимаю ТС нужно получить данные без вывода на лист... наверное для дальнейшей обработки. ^_^
А с функцией это легко можно сделать(ну или переделать ее немного под свои нужды)

Hugo - у Вас попадают и кода с пустыми значениями- наверное из-за ;) :
[vba]
Код
If InStr("с-т|солд.", a(i, 2)) > 0 Then
[/vba]

Автор - SLAVICK
Дата добавления - 04.06.2015 в 13:17
Sashagor1982 Дата: Четверг, 04.06.2015, 13:25 | Сообщение № 15
Группа: Проверенные
Ранг: Обитатель
Сообщений: 287
Репутация: -6 ±
Замечаний: 0% ±

Excel 2007
Да, именно, вывод на лист не требуется..
 
Ответить
СообщениеДа, именно, вывод на лист не требуется..

Автор - Sashagor1982
Дата добавления - 04.06.2015 в 13:25
Sashagor1982 Дата: Четверг, 04.06.2015, 13:38 | Сообщение № 16
Группа: Проверенные
Ранг: Обитатель
Сообщений: 287
Репутация: -6 ±
Замечаний: 0% ±

Excel 2007
Hugo, а результат массив "с"?
 
Ответить
СообщениеHugo, а результат массив "с"?

Автор - Sashagor1982
Дата добавления - 04.06.2015 в 13:38
Sashagor1982 Дата: Четверг, 04.06.2015, 13:59 | Сообщение № 17
Группа: Проверенные
Ранг: Обитатель
Сообщений: 287
Репутация: -6 ±
Замечаний: 0% ±

Excel 2007
Цитата
Hugo - у Вас попадают и кода с пустыми значениями- наверное из-за ;) :

[vba]
Код
If InStr("с-т|солд.", a(i, 2)) > 0 Then
[/vba]

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


Сообщение отредактировал Sashagor1982 - Четверг, 04.06.2015, 14:00
 
Ответить
Сообщение
Цитата
Hugo - у Вас попадают и кода с пустыми значениями- наверное из-за ;) :

[vba]
Код
If InStr("с-т|солд.", a(i, 2)) > 0 Then
[/vba]

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

Автор - Sashagor1982
Дата добавления - 04.06.2015 в 13:59
AndreTM Дата: Четверг, 04.06.2015, 14:06 | Сообщение № 18
Группа: Друзья
Ранг: Старожил
Сообщений: 1762
Репутация: 500 ±
Замечаний: 0% ±

2003 & 2010
Каким образом необходимо изменить код, что бы выполнялось условие задачи?

[vba]
Код
If Len(Trim(a(i, 2)) > 0 And InStr("с-т|солд.", a(i, 2)) > 0 Then
[/vba]


Skype: andre.tm.007
Donate: Qiwi: 9517375010
 
Ответить
Сообщение
Каким образом необходимо изменить код, что бы выполнялось условие задачи?

[vba]
Код
If Len(Trim(a(i, 2)) > 0 And InStr("с-т|солд.", a(i, 2)) > 0 Then
[/vba]

Автор - AndreTM
Дата добавления - 04.06.2015 в 14:06
SLAVICK Дата: Четверг, 04.06.2015, 14:10 | Сообщение № 19
Группа: Модераторы
Ранг: Старожил
Сообщений: 2290
Репутация: 766 ±
Замечаний: 0% ±

2019
Я бы написал так:
[vba]
Код
If a(i, 2) Like "с-т" Or a(i, 2) Like "солд." Then
[/vba]


Иногда все проще чем кажется с первого взгляда.
 
Ответить
СообщениеЯ бы написал так:
[vba]
Код
If a(i, 2) Like "с-т" Or a(i, 2) Like "солд." Then
[/vba]

Автор - SLAVICK
Дата добавления - 04.06.2015 в 14:10
Sashagor1982 Дата: Четверг, 04.06.2015, 14:31 | Сообщение № 20
Группа: Проверенные
Ранг: Обитатель
Сообщений: 287
Репутация: -6 ±
Замечаний: 0% ±

Excel 2007
Так в принципе работает, но циклы, циклы...
 
Ответить
СообщениеТак в принципе работает, но циклы, циклы...

Автор - Sashagor1982
Дата добавления - 04.06.2015 в 14:31
  • Страница 1 из 2
  • 1
  • 2
  • »
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2024 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!