Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.03.2018, 17:50   #11
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

в примере выше приведена функция, которая из диапазона Base выбирает ячейки соотв. маске m

Код:
Function RangeLikeMask(Base As Range, m$) As Range
  Dim c As Range
  For Each c In Base
    If c Like m Then If RangeLikeMask Is Nothing Then Set RangeLikeMask = c Else Set RangeLikeMask = Union(RangeLikeMask, c)
  Next
End Function
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума Ответить с цитированием
Старый 30.03.2018, 12:09   #12
Aleksandr H.
2 the Nation Glory
Старожил
 
Аватар для Aleksandr H.
 
Регистрация: 27.05.2014
Сообщений: 3,289
По умолчанию

Цитата:
Сообщение от Maksim_V Посмотреть сообщение
Я знаю как это сделать в цикле, но для ускорения работы, мне нужно это сделать на коллекциях или массивах, вот моя задача.

Цитата:
Сообщение от Maksim_V Посмотреть сообщение
Собственно основное решение я похоже нашел

Код:
   For Each  r In Range(Cells(11, 1), Cells(itog, 1))
        If r Like "##.##.####" Then
           If Not dic.Exists(r.Row) Then dic.Add r.Row, ""
        End If
   Next r
Как-то мутно: не хочу цикла, но буду использовать.

а целью было
Код:
Join(dic.Keys, Chr(10))
в msgbox?

То надо так замаричиваться через словари вместо складирования номеров строк в string переменной или это в образовательных целях?
Кто умер, но не забыт, тот бессмертен.
Лао-Цзы.
Aleksandr H. вне форума Ответить с цитированием
Старый 30.03.2018, 12:38   #13
Maksim_V
Пользователь
 
Регистрация: 06.07.2017
Сообщений: 21
По умолчанию

[QUOTE=Aleksandr H.;1727850]Как-то мутно: не хочу цикла, но буду использовать.

Цель конечно не Join(dic.Keys, Chr(10)), а дальнейшее применение единожды сформированного списка в куче других циклов. Выгода в том что мне не нужно будет в каждой последующей процедуре заново выбирать нужные значения по маске (делать цикл в цикле).
По крайней мере задумка такая у меня, может я и не прав, пока еще не знаю, не реализовал.
Цитата:
складирования номеров строк в string
Наверное это можно сделать проще и другими способами, но знаний не хватает, вот и пытаюсь разобраться...
Подскажите пожалуйста как это записать единожды в string, чтобы потом использовать например в цикле:
For строка_первая To строка_последняя
...
Next
Maksim_V вне форума Ответить с цитированием
Старый 30.03.2018, 13:39   #14
Aleksandr H.
2 the Nation Glory
Старожил
 
Аватар для Aleksandr H.
 
Регистрация: 27.05.2014
Сообщений: 3,289
По умолчанию

Код:
Sub foo()
    Dim dic As Object: Set dic = CreateObject("Scripting.Dictionary")
    Dim r As Range
    Dim i As Byte, a
    
    Dim v2() As String
    ReDim Preserve v2(0)
    
    Dim v3() As String
    Dim str As String
    str = ""
    
    dic.CompareMode = vbTextCompare
    For Each r In Range("A1:A10")
        If r Like "##.##.####" Then
            If Not dic.Exists(r.Row) Then
                dic.Add r.Row, ""
                
                v2(UBound(v2)) = r.Row
                ReDim Preserve v2(UBound(v2) + 1)
                
                str = str + CStr(r.Row) + ":"
            End If
        End If
    Next r
    
    a = dic.Keys
    v3 = Split(str, ":")
    Columns("C:J").Clear
    For i = 0 To dic.Count - 1
        Cells(i + 1, "C") = a(i)
        Cells(i + 1, "E") = v2(i)
        Cells(i + 1, "G") = v3(i)
    Next i
End Sub
Кто умер, но не забыт, тот бессмертен.
Лао-Цзы.
Aleksandr H. вне форума Ответить с цитированием
Старый 04.04.2018, 14:00   #15
Maksim_V
Пользователь
 
Регистрация: 06.07.2017
Сообщений: 21
По умолчанию

Цитата:
Сообщение от Aleksandr H. Посмотреть сообщение
For i = 0 To dic.Count - 1
Спасибо!
Maksim_V вне форума Ответить с цитированием
Старый 14.04.2018, 19:18   #16
Oldy7
Пользователь
 
Регистрация: 25.02.2012
Сообщений: 28
По умолчанию

Есть другой вариант - помещение в итем словаря массива, в котором будут номера строк:
Код:
Sub FillDict()
Dim dic As Object, arr&(), InArr(), a&
InArr = Selection.Value
Set dic = CreateObject("Scripting.Dictionary")
For a = 1 To UBound(InArr)
  If Not dic.exists(arr(a, 1)) Then
    ReDim arr(1 To 1): arr(1) = a: dic.Add InArr(a, 1).arr
  Else
    arr = dic.Item(InArr(a, 1)): ReDim Preserve arr(1 To UBound(arr) + 1)
    arr(UBound(arr)) = a: dic.Item(InArr(a, 1)) = arr
  End If
Next
End Sub
Oldy7 вне форума Ответить с цитированием
Старый 14.04.2018, 22:09   #17
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

А зачем в этом забугорном коде проверяется наличие значения в словаре? Ведь и так ясно, что его там нет
Вот вероятно и всё у них там так в последнее время...
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Найти номер строки и столбца максимального элемента.(PascalABCNET) FlayGlam Помощь студентам 3 04.12.2016 04:42
Номер элемента последовательности lefok Помощь студентам 1 28.11.2015 17:08
Выводить только измененные строки. Перед каждой строкой записывать номер строки в исходном тексте.используя строки и текст.файл nero4ka C++ Builder 1 13.06.2015 07:14
3. Вывести номер строки наименьшего элемента в двумерном массиве zebatic Помощь студентам 1 11.06.2010 00:14