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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 06.02.2013, 23:27   #31
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,170
По умолчанию

Хитро.
Но букв меньше не стало, а "вырви мозг" прибавилось
Ну и вообще редко когда бывает, что нужно собирать от 1 до n, да ещё подряд. Обычно нерегулярно, вразбивку и иногда путая порядок
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Старый 07.02.2013, 09:58   #32
staniiislav
Форумчанин
 
Аватар для staniiislav
 
Регистрация: 16.04.2010
Сообщений: 695
По умолчанию

Цитата:
Сообщение от nerv Посмотреть сообщение
читаемость в разы лучше + меньше букв. Тоже так делаю.

p.s.: ппц абвгдейка. сломай глаза и вырви мозг

UPD
Код:
.Item(a(i, 1)) = .Item(a(i, 1) & "|" & a(i, 2) & "|" & a(i, 3) & "|" & a(i, 4) & "|" & a(i, 5) & "|" & a(i, 6))
' -->
Key = JoinU(a, i)


Function JoinU(ByRef Data() As Variant, _
               ByVal Index As Long, _
               Optional ByVal Count As Byte = 6, _
               Optional Delimiter As String = "|") As String
    Dim Arr() As Variant
    Dim Column As Byte
    
    ReDim Arr(1 To Count)
    
    For Column = 1 To Count
        Arr(Column) = Data(Index, Column)
    Next
    
    JoinU = JOIN(Arr, Delimiter)
End Function
И как это работает? )))
Единственный способ стать умнее, играть с более умным противником...
staniiislav вне форума Ответить с цитированием
Старый 07.02.2013, 13:48   #33
strannick
Форумчанин
 
Регистрация: 21.10.2011
Сообщений: 433
По умолчанию

Цитата:
Сообщение от Hugo121 Посмотреть сообщение
Не вполне понял, зачем метка и зачем туда ходить, но не важно.
Если нужно уйти, если покрасили хоть одну, но сперва проверить все - то добавьте флаг.
Т.е.
dim flag as boolean
когда красим, то flag=true
после цикла по строке
if flag then goto metka
и не забыть вернуть где-то flag=false!
Ага, есть такое дело: flag=false перед циклом по строке, if flag then goto metka после цикла. Пробежал по всем ячейкам строки, нашел совпадения, закрасил шрифт, потом ушел на метку. Все работает. Hugo, спасибо!
Есть еще такая мысль - определять номер строки на листе Заказы, с которой нашлось совпадение. Ранее тут в отдельной теме пытался вставлять гиперссылку на совпавшую ячейку. Вариант был рабочий, но потом отказался от него в итоге. Так вот, если есть возможность в варианте работы сравнения со словарем определять хотя бы номер строки, в которой найдено совпадение, и прописывать его в какой-то ячейке напротив сравниваемой строки?
strannick вне форума Ответить с цитированием
Старый 07.02.2013, 13:58   #34
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,170
По умолчанию

Когда помещаете значение (с которым будете сравнивать) в словарь, то в Item словаря кладите номер строки (если он позже нужен).
Но если таких значений будет несколько одинаковых, то это нужно учесть - тогда в Item можно собирать массив/коллекцию этих номеров, или оставлять первый или последний номер, смотря по задаче.
Далее когда сравниваем со словарём - сразу имеем "есть/нет" и номер строки, если есть. Более того - по номеру строки сразу можно получить доступ и ко всем остальным данным того первого массива.
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Старый 07.02.2013, 14:29   #35
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,170
По умолчанию

Поясню "на кошках" - есть например список ID с фамилиями и адресами (3 столбца или сколько угодно).
Берём весь список в массив, циклом по ID заносим их в словарь как ключ, номер строки как item.
Далее когда проверяем какой-то ID по словарю - при наличии в словаре сразу можем извлечь любое нужное значение строки найденного ID.
Код:
Sub tt()
    Dim a(), oDict As Object, i&, testID As Variant

    a = Cells(1).CurrentRegion.Value    'исходный массив - первый столбец ID, второй например фамилии, далее что угодно
    Set oDict = CreateObject("scripting.dictionary")
    For i = 1 To UBound(a)    'наполняем словарь
        oDict.Item(a(i, 1)) = i
    Next

    testID = 34    'проверяем наличие например такого ID
    If oDict.exists(testID) Then
        i = oDict.Item(testID)
        MsgBox a(i, 2)    'если есть, то получаем значение фамилии
    End If

End Sub
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Старый 07.02.2013, 15:11   #36
nerv
Форумчанин
 
Аватар для nerv
 
Регистрация: 26.04.2010
Сообщений: 450
По умолчанию

Цитата:
Сообщение от Hugo121 Посмотреть сообщение
Но букв меньше не стало
я про
Код:
.Item(a(i, 1)) = a(i, 1) & "|" & a(i, 2) & "|" & a(i, 3) & "|" & a(i, 4) & "|" & a(i, 5) & "|" & a(i, 6)									104
.Item(a(i, 1)) = Join(Array(a(i, 1), a(i, 2), a(i, 3), a(i, 4), a(i, 5), a(i, 6)), "|")									87
Цитата:
Сообщение от Hugo121 Посмотреть сообщение
а "вырви мозг" прибавилось
и работать медленней стало, за счет вызова функций + доп операций. Это был пример. Все зависит от нужд и фантазии.

Цитата:
Сообщение от Hugo121 Посмотреть сообщение
Ну и вообще редко когда бывает, что нужно собирать от 1 до n, да ещё подряд. Обычно нерегулярно, вразбивку и иногда путая порядок
правильное замечание. For example:

Код:
Sub io()
    Dim Data() As Variant
    Dim Text As String
    
    Data = Range("A1:M10").Value
    
    Text = Join2(Data, 4, "|", 2, 5, 7, 1, 2, 3)
    
    MsgBox Text
End Sub


Function Join2(ByRef Data() As Variant, _
               ByVal Row As Long, _
               ByVal Delimiter As String, _
               ParamArray Columns() As Variant) As String
    Dim Index As Integer
    
    For Index = 0 To UBound(Columns)
        Columns(Index) = Data(Row, Columns(Index))
    Next
    
    Join2 = Join(Columns, Delimiter)
End Function
Цитата:
Сообщение от staniiislav Посмотреть сообщение
И как это работает? )))
что именно не понятно?
Тишина – самый громкий звук
nerv вне форума Ответить с цитированием
Старый 07.02.2013, 16:04   #37
staniiislav
Форумчанин
 
Аватар для staniiislav
 
Регистрация: 16.04.2010
Сообщений: 695
По умолчанию

Цитата:
Сообщение от nerv Посмотреть сообщение
что именно не понятно?
как функцией пользоваться. Не могли бы вы пример приложить
Единственный способ стать умнее, играть с более умным противником...
staniiislav вне форума Ответить с цитированием
Старый 07.02.2013, 18:00   #38
nerv
Форумчанин
 
Аватар для nerv
 
Регистрация: 26.04.2010
Сообщений: 450
По умолчанию

Цитата:
Сообщение от staniiislav Посмотреть сообщение
как функцией пользоваться. Не могли бы вы пример приложить
пожалуйста
Тишина – самый громкий звук
nerv вне форума Ответить с цитированием
Старый 08.02.2013, 17:21   #39
strannick
Форумчанин
 
Регистрация: 21.10.2011
Сообщений: 433
По умолчанию

Цитата:
Сообщение от Hugo121 Посмотреть сообщение
Поясню "на кошках"
Изловил дома троих, посадил писать код, вот чего наваяли по подсказке:
Код:
Sub Stroka()
Dim sh As Worksheet, sh1 As Worksheet
Dim iLastRow As Long, iLastRow1 As Long, i As Long, j As Long, k As Long
Dim a(), oDict1 As Object

    Set sh = Sheets("Лист1")
    Set sh1 = Sheets("Лист2")
    
    iLastRow1 = sh1.Cells(Rows.Count, 16).End(xlUp).Row
    
    a = sh1.Range("L2:Q" & iLastRow1).Value 'массив в словарь
    Set oDict1 = CreateObject("scripting.dictionary")
    For i = 1 To UBound(a)    'наполняем словарь
        oDict1.Item(a(i, 1)) = i
    Next

For k = 12 To 17 'цикл по сравниваемым ячейкам
j = 4 'сравниваем конкретную строку Листа1
u = sh.Cells(j, k).Value 'значение ячейки которую сравниваем
If u <> "" Then 'чтоб не выдавало совпадений по пустым
If oDict1.exists(u) Then
i = oDict1.Item(u) 'вот тут получить номер строки с Листа2 в которой совпало
'i = oDict1.Item(a(i, k))
'i = a(i, k)
'MsgBox a(i, 2)
MsgBox "Строка " & i 'а так выдает номер строки сравниваемой ячейки
End If
End If
Next
End Sub
Закоментировал "танцы с бубном". Приложил пример именно такой, как в основной таблице. Определил в коде сравниваемую строку j=4 (по основному коду она переменная). Ткните носом, где я перевернул наоборот?
Вложения
Тип файла: rar строка.rar (16.4 Кб, 8 просмотров)
strannick вне форума Ответить с цитированием
Старый 08.02.2013, 17:37   #40
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,170
По умолчанию

Ну для Гриши выпадает 4 - смотрим на второй лист - там 5. Это потому, что
a = sh1.Range("L2:Q" & iLastRow1).Value
т.е. массив начинается со второй строки.
Следовательно, если нужно знать положение в массиве - это i.
Если нужно знать положение на листе - это будет i+1.
Меня обычно положение на листе не интересует, т.к. всё сразу беру в массив и затем работаю только с ним.
В общем как и у Вас сейчас сделано.
Вот зачем Вам положение на листе?
webmoney: E265281470651 Z422237915069 R418926282008

Последний раз редактировалось Hugo121; 08.02.2013 в 17:40.
Hugo121 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сравнение двух диапазонов на предмет изменений strannick Microsoft Office Excel 2 29.11.2012 00:42
Сравнение двух диапазонов ячеек и выбор из них pavpin Microsoft Office Excel 2 05.09.2012 21:02
Сравнение 3-х диапазонов Severny Microsoft Office Excel 0 13.01.2012 12:23
Сравнение двух диапазонов и удаление совпадений Aniqa Microsoft Office Excel 5 20.07.2011 15:31
Сравнение двух диапазонов и удаление совпадений ПОСТРОЧНО (доработка) pringls Microsoft Office Excel 2 26.01.2011 16:54