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

Вход

Регистрация

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

 

= Мир MS Excel/Вывод неповторяющихся значений в отдельный столбец. - Мир MS Excel

Старая форма входа
  • Страница 1 из 2
  • 1
  • 2
  • »
Модератор форума: китин, _Boroda_  
Вывод неповторяющихся значений в отдельный столбец.
DimentR Дата: Воскресенье, 06.01.2013, 21:11 | Сообщение № 1
Группа: Пользователи
Ранг: Прохожий
Сообщений: 4
Репутация: 0 ±
Замечаний: 0% ±

Доброго времени суток всем smile
Прошу помощи. Написать небольшую програмку в екзель.
Имеются 2 больших столбца - списка названий изображений. Необходимо из первого столбца вывести названия изображений, которых нет во втором столбце. Приэтом первый столбец размером в ~6 тысяч строк, а второй в ~13 тысяч.
В Интернете я нашел примерное решение через формулу, но оно не корректно работает. Забил все значения. Прикрепляю файл с тем, что нашел и необходимыми значениями.
К сообщению приложен файл: __.7z (78.6 Kb)
 
Ответить
СообщениеДоброго времени суток всем smile
Прошу помощи. Написать небольшую програмку в екзель.
Имеются 2 больших столбца - списка названий изображений. Необходимо из первого столбца вывести названия изображений, которых нет во втором столбце. Приэтом первый столбец размером в ~6 тысяч строк, а второй в ~13 тысяч.
В Интернете я нашел примерное решение через формулу, но оно не корректно работает. Забил все значения. Прикрепляю файл с тем, что нашел и необходимыми значениями.

Автор - DimentR
Дата добавления - 06.01.2013 в 21:11
ikki Дата: Воскресенье, 06.01.2013, 21:38 | Сообщение № 2
Группа: Друзья
Ранг: Старожил
Сообщений: 1906
Репутация: 504 ±
Замечаний: 0% ±

Excel 2003, 2010
[vba]
Код
Sub t()
    Dim a, b, dic, i&
      
    a = Range([a1], [a1].End(xlDown)).Value
    b = Range([b1], [b1].End(xlDown)).Value
      
    Set dic = CreateObject("scripting.dictionary")
      
    On Error Resume Next
    For i = 1 To UBound(a): dic.Add a(i, 1), 0: Next
    For i = 1 To UBound(b): dic.Delete b(i, 1): Next
    [c1].Resize(dic.Count).Value = Application.Transpose(dic.keys)
End Sub
[/vba]


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


Сообщение отредактировал ikki - Воскресенье, 06.01.2013, 21:39
 
Ответить
Сообщение[vba]
Код
Sub t()
    Dim a, b, dic, i&
      
    a = Range([a1], [a1].End(xlDown)).Value
    b = Range([b1], [b1].End(xlDown)).Value
      
    Set dic = CreateObject("scripting.dictionary")
      
    On Error Resume Next
    For i = 1 To UBound(a): dic.Add a(i, 1), 0: Next
    For i = 1 To UBound(b): dic.Delete b(i, 1): Next
    [c1].Resize(dic.Count).Value = Application.Transpose(dic.keys)
End Sub
[/vba]

Автор - ikki
Дата добавления - 06.01.2013 в 21:38
Hugo Дата: Воскресенье, 06.01.2013, 21:51 | Сообщение № 3
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3691
Репутация: 790 ±
Замечаний: 0% ±

365
Саша, лучше так:
[vba]
Код
For i = 1 To UBound(a): dic.Item(a(i, 1)) = 0&: Next
[/vba]
Попробуй с своим кодом продублировать например третью строку листа.


webmoney: E265281470651 Z422237915069
USDT TRC20: TN8XeEF17o5KPBD9pNwYzNyruycuAc2mVD
 
Ответить
СообщениеСаша, лучше так:
[vba]
Код
For i = 1 To UBound(a): dic.Item(a(i, 1)) = 0&: Next
[/vba]
Попробуй с своим кодом продублировать например третью строку листа.

Автор - Hugo
Дата добавления - 06.01.2013 в 21:51
ikki Дата: Воскресенье, 06.01.2013, 21:54 | Сообщение № 4
Группа: Друзья
Ранг: Старожил
Сообщений: 1906
Репутация: 504 ±
Замечаний: 0% ±

Excel 2003, 2010
Цитата (Hugo)
Попробуй с своим кодом продублировать например третью строку листа.

Игорь, а чем лучше?
у меня On Error Resume Next включен, есличё
мой код будет работать некорректно?
или медленней?


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


Сообщение отредактировал ikki - Воскресенье, 06.01.2013, 21:56
 
Ответить
Сообщение
Цитата (Hugo)
Попробуй с своим кодом продублировать например третью строку листа.

Игорь, а чем лучше?
у меня On Error Resume Next включен, есличё
мой код будет работать некорректно?
или медленней?

Автор - ikki
Дата добавления - 06.01.2013 в 21:54
Hugo Дата: Воскресенье, 06.01.2013, 21:56 | Сообщение № 5
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3691
Репутация: 790 ±
Замечаний: 0% ±

365
Так попробуй smile
Я проверил - он при попытке добавить уже существующее значение переходит по ошибке на For i = 1 To UBound(b)
А мой просто заменяет Item на новый 0 smile


webmoney: E265281470651 Z422237915069
USDT TRC20: TN8XeEF17o5KPBD9pNwYzNyruycuAc2mVD
 
Ответить
СообщениеТак попробуй smile
Я проверил - он при попытке добавить уже существующее значение переходит по ошибке на For i = 1 To UBound(b)
А мой просто заменяет Item на новый 0 smile

Автор - Hugo
Дата добавления - 06.01.2013 в 21:56
DimentR Дата: Воскресенье, 06.01.2013, 21:59 | Сообщение № 6
Группа: Пользователи
Ранг: Прохожий
Сообщений: 4
Репутация: 0 ±
Замечаний: 0% ±

Цитата (ikki)
Sub t()
Dim a, b, dic, i&

a = Range([a1], [a1].End(xlDown)).Value
b = Range([b1], [b1].End(xlDown)).Value

Set dic = CreateObject("scripting.dictionary")

On Error Resume Next
For i = 1 To UBound(a): dic.Add a(i, 1), 0: Next
For i = 1 To UBound(b): dic.Delete b(i, 1): Next
[c1].Resize(dic.Count).Value = Application.Transpose(dic.keys)
End Sub

Спасибо за ответ, но Ваш макрос не дал нужного результата.
А именно... первые три тысячи строк скопировались из первого столбца во второй. Это, пожалуй, единственное что произошло)
Может быть я что-то не так делаю. Не знаю.


Сообщение отредактировал DimentR - Воскресенье, 06.01.2013, 22:01
 
Ответить
Сообщение
Цитата (ikki)
Sub t()
Dim a, b, dic, i&

a = Range([a1], [a1].End(xlDown)).Value
b = Range([b1], [b1].End(xlDown)).Value

Set dic = CreateObject("scripting.dictionary")

On Error Resume Next
For i = 1 To UBound(a): dic.Add a(i, 1), 0: Next
For i = 1 To UBound(b): dic.Delete b(i, 1): Next
[c1].Resize(dic.Count).Value = Application.Transpose(dic.keys)
End Sub

Спасибо за ответ, но Ваш макрос не дал нужного результата.
А именно... первые три тысячи строк скопировались из первого столбца во второй. Это, пожалуй, единственное что произошло)
Может быть я что-то не так делаю. Не знаю.

Автор - DimentR
Дата добавления - 06.01.2013 в 21:59
ikki Дата: Воскресенье, 06.01.2013, 22:01 | Сообщение № 7
Группа: Друзья
Ранг: Старожил
Сообщений: 1906
Репутация: 504 ±
Замечаний: 0% ±

Excel 2003, 2010
попробовал. angry
офигеть.

причем, если записать так:
[vba]
Код
For i = 1 To UBound(a)
   dic.Add a(i, 1), 0
Next
[/vba]
то нормально отрабатывает.

это как же тогда работает Resume Next??? (риторический вопрос, ага sad )


помощь по Excel и VBA
ikki@fxmail.ru, icq 592842413, skype alex.ikki
 
Ответить
Сообщениепопробовал. angry
офигеть.

причем, если записать так:
[vba]
Код
For i = 1 To UBound(a)
   dic.Add a(i, 1), 0
Next
[/vba]
то нормально отрабатывает.

это как же тогда работает Resume Next??? (риторический вопрос, ага sad )

Автор - ikki
Дата добавления - 06.01.2013 в 22:01
ikki Дата: Воскресенье, 06.01.2013, 22:02 | Сообщение № 8
Группа: Друзья
Ранг: Старожил
Сообщений: 1906
Репутация: 504 ±
Замечаний: 0% ±

Excel 2003, 2010
DimentR, пару минут подождите wink


помощь по Excel и VBA
ikki@fxmail.ru, icq 592842413, skype alex.ikki
 
Ответить
СообщениеDimentR, пару минут подождите wink

Автор - ikki
Дата добавления - 06.01.2013 в 22:02
ikki Дата: Воскресенье, 06.01.2013, 22:05 | Сообщение № 9
Группа: Друзья
Ранг: Старожил
Сообщений: 1906
Репутация: 504 ±
Замечаний: 0% ±

Excel 2003, 2010
с учетом очень важного замечания Hugo:

[vba]
Код
Sub t()
      Dim a, b, dic, i&
        
      a = Range([a1], [a1].End(xlDown)).Value
      b = Range([b1], [b1].End(xlDown)).Value
        
      Set dic = CreateObject("scripting.dictionary")
        
      On Error Resume Next
      For i = 1 To UBound(a): dic.Item(a(i, 1)) = 0&: Next
      For i = 1 To UBound(b): dic.Delete b(i, 1): Next
      [c1].Resize(dic.Count).Value = Application.Transpose(dic.keys)
End Sub
[/vba]

пс. на ваших данных - всего на три строчки короче списка в ст. А.
вернее - на две. одно повторяющееся значение я добавлял для теста.


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


Сообщение отредактировал ikki - Воскресенье, 06.01.2013, 22:10
 
Ответить
Сообщениес учетом очень важного замечания Hugo:

[vba]
Код
Sub t()
      Dim a, b, dic, i&
        
      a = Range([a1], [a1].End(xlDown)).Value
      b = Range([b1], [b1].End(xlDown)).Value
        
      Set dic = CreateObject("scripting.dictionary")
        
      On Error Resume Next
      For i = 1 To UBound(a): dic.Item(a(i, 1)) = 0&: Next
      For i = 1 To UBound(b): dic.Delete b(i, 1): Next
      [c1].Resize(dic.Count).Value = Application.Transpose(dic.keys)
End Sub
[/vba]

пс. на ваших данных - всего на три строчки короче списка в ст. А.
вернее - на две. одно повторяющееся значение я добавлял для теста.

Автор - ikki
Дата добавления - 06.01.2013 в 22:05
DimentR Дата: Воскресенье, 06.01.2013, 22:10 | Сообщение № 10
Группа: Пользователи
Ранг: Прохожий
Сообщений: 4
Репутация: 0 ±
Замечаний: 0% ±

Спасибо за старание, но я все равно не понимаю (по незнанию) что именно делает Ваш макрос. Он меняет что-то во втором столбце. Все.
Возможно сделать так, что бы значения выводились в третий столбец?
 
Ответить
СообщениеСпасибо за старание, но я все равно не понимаю (по незнанию) что именно делает Ваш макрос. Он меняет что-то во втором столбце. Все.
Возможно сделать так, что бы значения выводились в третий столбец?

Автор - DimentR
Дата добавления - 06.01.2013 в 22:10
ikki Дата: Воскресенье, 06.01.2013, 22:15 | Сообщение № 11
Группа: Друзья
Ранг: Старожил
Сообщений: 1906
Репутация: 504 ±
Замечаний: 0% ±

Excel 2003, 2010
они и выводятся в третий.
только неправильные.
метод Delete не срабатывает.

эх, хотелось компактно-элегантно.
а получилась ерунда.

прошу прощения.


помощь по Excel и VBA
ikki@fxmail.ru, icq 592842413, skype alex.ikki
 
Ответить
Сообщениеони и выводятся в третий.
только неправильные.
метод Delete не срабатывает.

эх, хотелось компактно-элегантно.
а получилась ерунда.

прошу прощения.

Автор - ikki
Дата добавления - 06.01.2013 в 22:15
Hugo Дата: Воскресенье, 06.01.2013, 22:16 | Сообщение № 12
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3691
Репутация: 790 ±
Замечаний: 0% ±

365
Я как сторона незаинтересованная могу сказать - этот код из первого и второго столбцов только берёт данные, никак их не меняя.
Результат выгружается в столбец C.


webmoney: E265281470651 Z422237915069
USDT TRC20: TN8XeEF17o5KPBD9pNwYzNyruycuAc2mVD
 
Ответить
СообщениеЯ как сторона незаинтересованная могу сказать - этот код из первого и второго столбцов только берёт данные, никак их не меняя.
Результат выгружается в столбец C.

Автор - Hugo
Дата добавления - 06.01.2013 в 22:16
Hugo Дата: Воскресенье, 06.01.2013, 22:19 | Сообщение № 13
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3691
Репутация: 790 ±
Замечаний: 0% ±

365
На Delete не обратил внимания sad
Не работает Delete - замените:
[vba]
Код
For i = 1 To UBound(b): dic.Remove b(i, 1): Next
[/vba]
А вообще я обычно отбираю нужное в другой массив. Конечно кода чуть больше, и не так элегантно, зато без Application.Transpose() smile


webmoney: E265281470651 Z422237915069
USDT TRC20: TN8XeEF17o5KPBD9pNwYzNyruycuAc2mVD
 
Ответить
СообщениеНа Delete не обратил внимания sad
Не работает Delete - замените:
[vba]
Код
For i = 1 To UBound(b): dic.Remove b(i, 1): Next
[/vba]
А вообще я обычно отбираю нужное в другой массив. Конечно кода чуть больше, и не так элегантно, зато без Application.Transpose() smile

Автор - Hugo
Дата добавления - 06.01.2013 в 22:19
ikki Дата: Воскресенье, 06.01.2013, 22:20 | Сообщение № 14
Группа: Друзья
Ранг: Старожил
Сообщений: 1906
Репутация: 504 ±
Замечаний: 0% ±

Excel 2003, 2010
[vba]
Код
Sub t()
   Dim a, b, c, dic, n&, i&, j&
    
   a = Range([a1], [a1].End(xlDown)).Value
   b = Range([b1], [b1].End(xlDown)).Value
   n = IIf(UBound(a) > UBound(b), UBound(a), UBound(b))
   ReDim c(1 To n, 1 To 1)
    
   Set dic = CreateObject("scripting.dictionary")
    
   On Error Resume Next
   For i = 1 To UBound(b)
     dic.Item(b(i, 1)) = 0&
   Next
   For i = 1 To UBound(a)
     If Not dic.exists(a(i, 1)) Then j = j + 1: c(j, 1) = a(i, 1)
   Next
   [c1].Resize(j).Value = c
End Sub
[/vba]


помощь по Excel и VBA
ikki@fxmail.ru, icq 592842413, skype alex.ikki
 
Ответить
Сообщение[vba]
Код
Sub t()
   Dim a, b, c, dic, n&, i&, j&
    
   a = Range([a1], [a1].End(xlDown)).Value
   b = Range([b1], [b1].End(xlDown)).Value
   n = IIf(UBound(a) > UBound(b), UBound(a), UBound(b))
   ReDim c(1 To n, 1 To 1)
    
   Set dic = CreateObject("scripting.dictionary")
    
   On Error Resume Next
   For i = 1 To UBound(b)
     dic.Item(b(i, 1)) = 0&
   Next
   For i = 1 To UBound(a)
     If Not dic.exists(a(i, 1)) Then j = j + 1: c(j, 1) = a(i, 1)
   Next
   [c1].Resize(j).Value = c
End Sub
[/vba]

Автор - ikki
Дата добавления - 06.01.2013 в 22:20
ikki Дата: Воскресенье, 06.01.2013, 22:23 | Сообщение № 15
Группа: Друзья
Ранг: Старожил
Сообщений: 1906
Репутация: 504 ±
Замечаний: 0% ±

Excel 2003, 2010
Цитата (Hugo)
А вообще я обычно отбираю нужное в другой массив.

умгу, я тоже так делаю.
код выше - именно такой.

но, говорю ж - "захотелось странного".
какие-то подводные камни у этого Delete. точнее - что-то я в нём недопонял.

понял.
sad ещё точнее - нет такого метода у словаря. есть Remove. а на Delete каждый раз срабатывал On Error.
расстроился я.


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


Сообщение отредактировал ikki - Воскресенье, 06.01.2013, 22:28
 
Ответить
Сообщение
Цитата (Hugo)
А вообще я обычно отбираю нужное в другой массив.

умгу, я тоже так делаю.
код выше - именно такой.

но, говорю ж - "захотелось странного".
какие-то подводные камни у этого Delete. точнее - что-то я в нём недопонял.

понял.
sad ещё точнее - нет такого метода у словаря. есть Remove. а на Delete каждый раз срабатывал On Error.
расстроился я.

Автор - ikki
Дата добавления - 06.01.2013 в 22:23
DimentR Дата: Понедельник, 07.01.2013, 15:39 | Сообщение № 16
Группа: Пользователи
Ранг: Прохожий
Сообщений: 4
Репутация: 0 ±
Замечаний: 0% ±

Цитата (ikki)
Sub t()
Dim a, b, c, dic, n&, i&, j&

a = Range([a1], [a1].End(xlDown)).Value
b = Range([b1], [b1].End(xlDown)).Value
n = IIf(UBound(a) > UBound(b), UBound(a), UBound(b))
ReDim c(1 To n, 1 To 1)

Set dic = CreateObject("scripting.dictionary")

On Error Resume Next
For i = 1 To UBound(b)
dic.Item(b(i, 1)) = 0&
Next
For i = 1 To UBound(a)
If Not dic.exists(a(i, 1)) Then j = j + 1: c(j, 1) = a(i, 1)
Next
[c1].Resize(j).Value = c
End Sub


Спасибо огромное, ребят! Все так, как надо, как я и просил. Еще раз спасибо! Очень помогли!
 
Ответить
Сообщение
Цитата (ikki)
Sub t()
Dim a, b, c, dic, n&, i&, j&

a = Range([a1], [a1].End(xlDown)).Value
b = Range([b1], [b1].End(xlDown)).Value
n = IIf(UBound(a) > UBound(b), UBound(a), UBound(b))
ReDim c(1 To n, 1 To 1)

Set dic = CreateObject("scripting.dictionary")

On Error Resume Next
For i = 1 To UBound(b)
dic.Item(b(i, 1)) = 0&
Next
For i = 1 To UBound(a)
If Not dic.exists(a(i, 1)) Then j = j + 1: c(j, 1) = a(i, 1)
Next
[c1].Resize(j).Value = c
End Sub


Спасибо огромное, ребят! Все так, как надо, как я и просил. Еще раз спасибо! Очень помогли!

Автор - DimentR
Дата добавления - 07.01.2013 в 15:39
Gustav Дата: Понедельник, 07.01.2013, 17:22 | Сообщение № 17
Группа: Админы
Ранг: Участник клуба
Сообщений: 2797
Репутация: 1161 ±
Замечаний: ±

начинал с Excel 4.0, видел 2.1
Чисто вдогонку не премину при удобном наглядном случае вспомнить об альтернативной мощи SQL:

[vba]
Код
Sub selectData()
               
     Dim rst As Object
     Set rst = CreateObject("ADODB.Recordset")
           
     rst.Open _
     "SELECT a.F1 FROM [Лист1$] AS a LEFT JOIN [Лист1$] AS b ON a.F1 = b.F2 " & _
     "WHERE a.F1 Is Not Null AND b.F2 Is Null" _
     , _
     "Provider=Microsoft.ACE.OLEDB.12.0;" & _
     "Data Source=" & ThisWorkbook.FullName & ";" & _
     "Extended Properties='Excel 12.0;HDR=No'"
                   
     [Лист1!E1].CopyFromRecordset rst
           
End Sub
[/vba]
Результат - в колонке E.


МОИ: Ник, Tip box: 41001663842605
 
Ответить
СообщениеЧисто вдогонку не премину при удобном наглядном случае вспомнить об альтернативной мощи SQL:

[vba]
Код
Sub selectData()
               
     Dim rst As Object
     Set rst = CreateObject("ADODB.Recordset")
           
     rst.Open _
     "SELECT a.F1 FROM [Лист1$] AS a LEFT JOIN [Лист1$] AS b ON a.F1 = b.F2 " & _
     "WHERE a.F1 Is Not Null AND b.F2 Is Null" _
     , _
     "Provider=Microsoft.ACE.OLEDB.12.0;" & _
     "Data Source=" & ThisWorkbook.FullName & ";" & _
     "Extended Properties='Excel 12.0;HDR=No'"
                   
     [Лист1!E1].CopyFromRecordset rst
           
End Sub
[/vba]
Результат - в колонке E.

Автор - Gustav
Дата добавления - 07.01.2013 в 17:22
ikki Дата: Понедельник, 07.01.2013, 19:35 | Сообщение № 18
Группа: Друзья
Ранг: Старожил
Сообщений: 1906
Репутация: 504 ±
Замечаний: 0% ±

Excel 2003, 2010
Цитата (Gustav)
Чисто вдогонку не премину при удобном наглядном случае вспомнить об альтернативной мощи SQL

хороший пример.
а по времени? smile


помощь по Excel и VBA
ikki@fxmail.ru, icq 592842413, skype alex.ikki
 
Ответить
Сообщение
Цитата (Gustav)
Чисто вдогонку не премину при удобном наглядном случае вспомнить об альтернативной мощи SQL

хороший пример.
а по времени? smile

Автор - ikki
Дата добавления - 07.01.2013 в 19:35
Gustav Дата: Понедельник, 07.01.2013, 20:20 | Сообщение № 19
Группа: Админы
Ранг: Участник клуба
Сообщений: 2797
Репутация: 1161 ±
Замечаний: ±

начинал с Excel 4.0, видел 2.1
По времени у меня получается: SQL - 0,42-0,45 сек, словарь - 0,06-0,08 сек.
Так что, если для кого-то критично, то конечно словарь - он в 6-7 раз быстрее biggrin

Мне же SQL дороже концептуальнее - даже если бы он был 2-3 секунды, я бы ждал... терпеливо! smile


МОИ: Ник, Tip box: 41001663842605
 
Ответить
СообщениеПо времени у меня получается: SQL - 0,42-0,45 сек, словарь - 0,06-0,08 сек.
Так что, если для кого-то критично, то конечно словарь - он в 6-7 раз быстрее biggrin

Мне же SQL дороже концептуальнее - даже если бы он был 2-3 секунды, я бы ждал... терпеливо! smile

Автор - Gustav
Дата добавления - 07.01.2013 в 20:20
ikki Дата: Понедельник, 07.01.2013, 21:44 | Сообщение № 20
Группа: Друзья
Ранг: Старожил
Сообщений: 1906
Репутация: 504 ±
Замечаний: 0% ±

Excel 2003, 2010
поэкспериментировал чуток...
у меня Ex'2003, переписал так:

[vba]
Код

Sub selectData()
      Dim rst As Object, t&, cnStr$
       t = GetTickCount
        
      Set rst = CreateObject("ADODB.Recordset")
      cnStr = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
          "Data Source=" & ThisWorkbook.FullName & ";" & _
          "Extended Properties='Excel 8.0;HDR=No'"
      rst.Open _
          "SELECT a.F1 FROM [Лист1$] AS a LEFT JOIN [Лист1$] AS b ON a.F1 = b.F2 " & _
          "WHERE a.F1 Is Not Null AND b.F2 Is Null", cnStr
      [Лист1!f1].CopyFromRecordset rst
      Debug.Print GetTickCount - t
End Sub
[/vba]

по времени результаты аналогичные

попробовал "укоротить" диапазоны, изменив
[vba]
Код

      ...
      Dim lrA&, lrB&
        
      lrA = Cells(Rows.Count, 1).End(xlUp).Row
      lrB = Cells(Rows.Count, 2).End(xlUp).Row
      ...
      rst.Open _
          "SELECT a.F1 FROM [Лист1$A1:A" & lrA & "] AS a LEFT JOIN [Лист1$B1:B" & lrB & "] AS b ON a.F1 = b.F1 " & _
          "WHERE a.F1 Is Not Null AND b.F1 Is Null", cnStr
[/vba]
никакого ускорения не заметил.

и - главный вопрос biggrin
я бы (по незнанию) написал запрос примерно так:
[vba]
Код

     rst.Open _
         "SELECT a.F1 FROM [Лист1$A1:A" & lrA & "] AS a " & _
         "WHERE a.F1 NOT IN (SELECT b.F1 FROM [Лист1$B1:B" & lrB & "] AS b)", cnStr
[/vba]

такой запрос компилируется и запускается, но результата я не дождался sad
Gustav, проконсультируйте, плиз: это вообще неправильный путь или "просто" неоптимальный (мягко говоря)?


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


Сообщение отредактировал ikki - Понедельник, 07.01.2013, 21:45
 
Ответить
Сообщениепоэкспериментировал чуток...
у меня Ex'2003, переписал так:

[vba]
Код

Sub selectData()
      Dim rst As Object, t&, cnStr$
       t = GetTickCount
        
      Set rst = CreateObject("ADODB.Recordset")
      cnStr = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
          "Data Source=" & ThisWorkbook.FullName & ";" & _
          "Extended Properties='Excel 8.0;HDR=No'"
      rst.Open _
          "SELECT a.F1 FROM [Лист1$] AS a LEFT JOIN [Лист1$] AS b ON a.F1 = b.F2 " & _
          "WHERE a.F1 Is Not Null AND b.F2 Is Null", cnStr
      [Лист1!f1].CopyFromRecordset rst
      Debug.Print GetTickCount - t
End Sub
[/vba]

по времени результаты аналогичные

попробовал "укоротить" диапазоны, изменив
[vba]
Код

      ...
      Dim lrA&, lrB&
        
      lrA = Cells(Rows.Count, 1).End(xlUp).Row
      lrB = Cells(Rows.Count, 2).End(xlUp).Row
      ...
      rst.Open _
          "SELECT a.F1 FROM [Лист1$A1:A" & lrA & "] AS a LEFT JOIN [Лист1$B1:B" & lrB & "] AS b ON a.F1 = b.F1 " & _
          "WHERE a.F1 Is Not Null AND b.F1 Is Null", cnStr
[/vba]
никакого ускорения не заметил.

и - главный вопрос biggrin
я бы (по незнанию) написал запрос примерно так:
[vba]
Код

     rst.Open _
         "SELECT a.F1 FROM [Лист1$A1:A" & lrA & "] AS a " & _
         "WHERE a.F1 NOT IN (SELECT b.F1 FROM [Лист1$B1:B" & lrB & "] AS b)", cnStr
[/vba]

такой запрос компилируется и запускается, но результата я не дождался sad
Gustav, проконсультируйте, плиз: это вообще неправильный путь или "просто" неоптимальный (мягко говоря)?

Автор - ikki
Дата добавления - 07.01.2013 в 21:44
  • Страница 1 из 2
  • 1
  • 2
  • »
Поиск:

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