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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 05.02.2013, 18:18   #11
staniiislav
Форумчанин
 
Аватар для staniiislav
 
Регистрация: 16.04.2010
Сообщений: 695
По умолчанию

сейчам проверим
Единственный способ стать умнее, играть с более умным противником...
staniiislav вне форума Ответить с цитированием
Старый 05.02.2013, 18:19   #12
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Проверил:
0.296875
0.34375
3
3.609375
0.3125
0.34375

Конкатенация выиграла!
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Старый 05.02.2013, 18:25   #13
staniiislav
Форумчанин
 
Аватар для staniiislav
 
Регистрация: 16.04.2010
Сообщений: 695
По умолчанию

Цитата:
Сообщение от nilem Посмотреть сообщение
один японский перец всегда вместо этого
Код:
.Item(a(i, 1)) = a(i, 1) & "|" & a(i, 2) & "|" & a(i, 3) & "|" & a(i, 4) & "|" & a(i, 5) & "|" & a(i, 6)
пишет так
Код:
.Item(a(i, 1)) = Join(Array(a(i, 1), a(i, 2), a(i, 3), a(i, 4), a(i, 5), a(i, 6)), "|")
Стас, можете проверить? Просто для интереса. Может действительно так лучше?
так работает:
Код:
.Item(a(i, 1)) = .Item(Join(Array(a(i, 1), a(i, 2), a(i, 3), a(i, 4), a(i, 5), a(i, 6)), "|"))
но по времени вроде абсолютно одинаково... может на больших массивах будет чем-то выигрывать, хотя сомневаюсь
Единственный способ стать умнее, играть с более умным противником...
staniiislav вне форума Ответить с цитированием
Старый 05.02.2013, 18:29   #14
staniiislav
Форумчанин
 
Аватар для staniiislav
 
Регистрация: 16.04.2010
Сообщений: 695
По умолчанию

Код:
.Item(a(i, 1)) = .Item(a(i, 1) & "|" & a(i, 2) & "|" & a(i, 3) & "|" & a(i, 4) & "|" & a(i, 5) & "|" & a(i, 6))
0,031
0,032
0,016

Код:
.Item(a(i, 1)) = .Item(Join(Array(a(i, 1), a(i, 2), a(i, 3), a(i, 4), a(i, 5), a(i, 6)), "|"))
0,032
0,016
0,015
Единственный способ стать умнее, играть с более умным противником...
staniiislav вне форума Ответить с цитированием
Старый 05.02.2013, 18:41   #15
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

А если так?
Код:
Sub tt()

a = [a1:f35]
tm = Timer

For x = 1 To 1000
For i = 1 To 35
t = a(i, 1) & "|" & a(i, 2) & "|" & a(i, 3) & "|" & a(i, 4) & "|" & a(i, 5) & "|" & a(i, 6)
Next
Next
Debug.Print Timer - tm

tm = Timer
For x = 1 To 1000
For i = 1 To 35
t = Join(Array(a(i, 1), a(i, 2), a(i, 3), a(i, 4), a(i, 5), a(i, 6)), "|")
Next
Next
Debug.Print Timer - tm


End Sub
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Старый 05.02.2013, 18:53   #16
staniiislav
Форумчанин
 
Аватар для staniiislav
 
Регистрация: 16.04.2010
Сообщений: 695
По умолчанию

Цитата:
Сообщение от Hugo121 Посмотреть сообщение
А если так?
Код:
Sub tt()

a = [a1:f35]
tm = Timer

For x = 1 To 1000
For i = 1 To 35
t = a(i, 1) & "|" & a(i, 2) & "|" & a(i, 3) & "|" & a(i, 4) & "|" & a(i, 5) & "|" & a(i, 6)
Next
Next
Debug.Print Timer - tm

tm = Timer
For x = 1 To 1000
For i = 1 To 35
t = Join(Array(a(i, 1), a(i, 2), a(i, 3), a(i, 4), a(i, 5), a(i, 6)), "|")
Next
Next
Debug.Print Timer - tm


End Sub
на чу-чу, но выигрует
Код:
t = Join(Array(a(i, 1), a(i, 2), a(i, 3), a(i, 4), a(i, 5), a(i, 6)), "|")
Единственный способ стать умнее, играть с более умным противником...
staniiislav вне форума Ответить с цитированием
Старый 05.02.2013, 18:54   #17
staniiislav
Форумчанин
 
Аватар для staniiislav
 
Регистрация: 16.04.2010
Сообщений: 695
По умолчанию

вот еще примерчик:

Код:
Option Explicit
Private Declare Function GetTickCount Lib "kernel32" () As Long

Sub pokraska()
Dim a, b, i&, n&, u, sh As Worksheet, t
t = GetTickCount
Set sh = Sheets("Заказы")
    a = Range("F1:K" & Cells(Rows.Count, 1).End(xlUp).Row).Value
With CreateObject("Scripting.Dictionary")
    For i = 2 To UBound(a)
        '.Item(a(i, 1)) = .Item(a(i, 1) & "|" & a(i, 2) & "|" & a(i, 3) & "|" & a(i, 4) & "|" & a(i, 5) & "|" & a(i, 6))
        .Item(a(i, 1)) = .Item(Join(Array(a(i, 1), a(i, 2), a(i, 3), a(i, 4), a(i, 5), a(i, 6)), "|"))
    Next i

    a = sh.Range("F1:K" & sh.Cells(Rows.Count, 1).End(xlUp).Row).Value
    
    ReDim b(1 To UBound(a), 1 To 1)
    For i = 2 To UBound(a)
    u = a(i, 1) & "|" & a(i, 2) & "|" & a(i, 3) & "|" & a(i, 4) & "|" & a(i, 5) & "|" & a(i, 6)
        If .Exists(u) Then b(i, 1) = 1 ': sh.Range(sh.Cells(i, 1), sh.Cells(i, 11)).Interior.ColorIndex = 37
    Next i
End With
sh.Range("L1").Resize(UBound(b), 1).Value = b
sh.Range("L1:L" & UBound(b)).SpecialCells(xlCellTypeConstants, 1).EntireRow.Interior.ColorIndex = 37
sh.Range("L1:L" & UBound(b)).ClearContents
Debug.Print (GetTickCount - t) / 1000
End Sub
Вопрос, как SpecialCells можно использовать для выделенного диапазона, чтобы избавится от EntireRow?
Единственный способ стать умнее, играть с более умным противником...
staniiislav вне форума Ответить с цитированием
Старый 05.02.2013, 19:03   #18
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Так зачем избавляться? Не красит весь нужный диапазон? Или красит замного?
В файле не проверял, но если нужно ограничить - пробуйте intersect(нужный диапазон, specialcells...entirerow)
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Старый 05.02.2013, 19:05   #19
SAS888
Старожил
 
Аватар для SAS888
 
Регистрация: 05.12.2007
Сообщений: 4,180
По умолчанию

Цитата:
...как SpecialCells можно использовать для выделенного диапазона, чтобы избавится от EntireRow?
Использовать
Код:
 Intersect(Selection, ...)...
Чем шире угол зрения, тем он тупее.
SAS888 вне форума Ответить с цитированием
Старый 05.02.2013, 19:16   #20
nilem
Форумчанин
 
Регистрация: 25.04.2010
Сообщений: 616
По умолчанию

тоже попробовал с Join(Array(...
все-таки просто конкатенация чуть-чуть, но быстрее
и вот с этим так и не понял
Код:
.Item(a(i, 1)) = .Item(a(i, 1) & "|" & a(i, 2) & "|" & a(i, 3) & "|" & a(i, 4) & "|" & a(i, 5) & "|" & a(i, 6))
мне кажется, правильнее (и немного быстрее) так
Код:
.Item(a(i, 1) & "|" & a(i, 2) & "|" & a(i, 3) & "|" & a(i, 4) & "|" & a(i, 5) & "|" & a(i, 6)) = Empty
А еще здесь можно использовать CopyMemory. Так ведь?
Когда начнем изучать?

Последний раз редактировалось nilem; 05.02.2013 в 19:19.
nilem вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 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