Страницы: 1 2 След.
RSS
VBA Работа с диапазоном
 
iRowLast = ActiveSheet.UsedRange.Row + ActiveSheet.UsedRange.Rows.Count - 1  
Range(A1:iRowLast).Select    
 
 
Имеется столбец с данными начинающийся с А1 и заканчивающийся А10 (последние значение может быть разным (iRowLast), как можно выделить диапазон с данными с помощью кода VBA (Range("A1:A10").Select)?  
 
как правильно выделить диапазон Range(A1:iRowLast).Select
 
наверно так Range("A1:A" & iRowLast).Select
 
Для чего все - это нужно (может есть способ проще).  
У меня есть таблица "Сделки", один из столбцов таблицы имеет название "Бумага сокращенно" с помощью кода VBA я буду выводить из этого столбца уникальный значения и мне нужно определить первую и последнию строку  с данными, чтобы код работал только выделенном массиве.
 
Для вашего задания выделять диапазон (.Select) совсем не нужно.  
 
Приложите небольшой пример и скажите, что нужно сделать
 
{quote}{login=}{date=14.12.2011 09:34}{thema=}{post}Для вашего задания выделять диапазон (.Select) совсем не нужно.  
Приложите небольшой пример и скажите, что нужно сделать{/post}{/quote}
 
{quote}{login=}{date=14.12.2011 09:34}{thema=}{post}Для вашего задания выделять диапазон (.Select) совсем не нужно.  
Приложите небольшой пример и скажите, что нужно сделать{/post}{/quote}  
 
Select - это для наглядности, правильно ли я задаю массив, чтобы потом эти данные подставить в сам код VBA для вытаскивания уникальных значений...  
Логика моя правильная?)
 
Можно и так  Range("A4:A" & Range("A5").End(xlDown).Row)  - что тут усложняется.
 
Я предлагаю так - не надо Transpose.  
Как определить диапазон - тоже есть. Не как всегда :)  
 
 
Private Sub GetUniqueValueH()  
   With ThisWorkbook.Worksheets(1)  
        Dim a(), i&, ii&  
        a = .UsedRange.Columns(1).Value  
        ReDim b(1 To UBound(a), 1 To 1)  
        With CreateObject("Scripting.Dictionary")  
             For i = 2 To UBound(a)  
                 iText$ = a(i, 1)  
                 If Not .Exists(iText$) Then .Add iText$, iText$  
                 ii = ii + 1  
                 b(ii, 1) = a(i, 1)  
             Next  
        End With  
        With .Range("C5").Resize(ii)  
             .EntireColumn.Clear  
             .Value = b  
        End With  
   End With  
End Sub
 
\вариант с коллекией  
 
Sub io()  
Dim z$(), v, i&, x As New Collection  
With ActiveSheet  
   On Error Resume Next  
   ReDim z(1 To .UsedRange.Rows.Count, 1 To 1)  
   For Each v In Range(.[a4], .Cells(.Rows.Count, 1).End(xlUp)).Value
       If v <> "" Then  
           If x.Item(v) = "" Then  
               i = i + 1: z(i, 1) = v: x.Add v, v  
           End If  
       End If  
   Next  
   .[e5].Resize(i) = z()
End With  
End Sub
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук


https://github.com/nervgh
 
Разобрался, чтобы выделить столбец в таблице сделал так Range("TableDeal[Название столбца в таблице]").
 
Теперь с выделенным диапазоном можно работать ...
 
Hugo, по-моему, нужно писать так  
 
               If Not .Exists(iText$) Then  
                   .Add iText$, iText$  
                   ii = ii + 1  
                   b(ii, 1) = a(i, 1)  
               End If  
 
Иначе мы просто заполняем массив b всеми значениями массива а и просто выводим такой же полный список в столбец С. А нужно заполнять только не повторяющимися (для чего собственно и Словарь используется в макросе)  
 
Для афтора весь твой код такой  
 
Private Sub GetUniqueValueH()  
   With ThisWorkbook.Worksheets(1)  
       Dim a(), i&, ii&  
       a = .UsedRange.Columns(1).Value  
       ReDim b(1 To UBound(a), 1 To 1)  
       With CreateObject("Scripting.Dictionary")  
           For i = 2 To UBound(a)  
               iText$ = a(i, 1)  
               If Not .Exists(iText$) Then  
                   .Add iText$, iText$  
                   ii = ii + 1  
                   b(ii, 1) = a(i, 1)  
               End If  
           Next  
       End With  
       With .Range("C4").Resize(UBound(a))  
           .EntireColumn.Clear  
           .Value = b  
       End With  
   End With  
End Sub
 
Автор, вот ещё один вариант, основываясь на коде от Hugo. Только с определением последней строки в столбце А  
 
Private Sub GetUniqueValueH()  
   With ThisWorkbook.Worksheets(1)  
       Dim a(), i&, ii&  
       a = .Range("A4:A" & .Cells(Rows.Count, "A").End(xlUp).Row).Value  
       ReDim b(1 To UBound(a), 1 To 1)  
       With CreateObject("Scripting.Dictionary")  
           For i = 2 To UBound(a)  
               iText$ = a(i, 1)  
               If Not .Exists(iText$) Then  
                   .Add iText$, iText$  
                   ii = ii + 1  
                   b(ii, 1) = a(i, 1)  
               End If  
           Next  
       End With  
       With .Range("C4").Resize(UBound(a))  
           .EntireColumn.Clear  
           .Value = b  
       End With  
   End With  
End Sub
 
Получился такой окончательный вариант.    
 
 With Worksheets("TableDeal")  
        Dim iSource As Range, iCell As Range  
        Set iSource = .Range("TableDeal[Бумага сокращенно]")
   With CreateObject("Scripting.Dictionary")  
        For Each iCell In iSource  
            iText$ = CStr(iCell.Value)  
            If Not .Exists(iText$) Then .Add iText$, iText$  
        Next  
        iItems = Application.Transpose(.Items)  
   End With  
   With Worksheets("Report").Range("A1").Resize(UBound(iItems))  
        .EntireColumn.Clear  
        .Value = iItems  
   End With  
 End With  
End Sub  
 
Может что лишние убрать?  
<EM><STRONG>Файл удален</STRONG> - велик размер - [<STRONG>МОДЕРАТОРЫ</STRONG>]</EM>
 
{quote}{login=KIA}{date=14.12.2011 10:32}{thema=}{post}Автор, вот ещё один вариант, основываясь на коде от Hugo. Только с определением последней строки в столбце А  
{/post}{/quote}  
 
Интересная реализация. Спасибо за хорошие идеи.
 
1) Лучше (быстрее) то, что предложил Hugo, а дополнил я.  
2) в вашем коде есть необъявленные переменные, а именно: iText, iItems()  
3) в вашем коде так же попадает пустая строка и вы её переносите на лист Report. Чтобы такого не было нужно в коде дописать проверку на длину текста  
Например, так  
 
               If Len(iText) Then  
                   If Not .Exists(iText$) Then .Add iText$, iText$  
               End If  
 
Но быстрый вариант тот, который предложил Hugo. Вы обращаетесь к каждой ячейке Диапазона iSource, это достаточно медленный вариант работы макроса. А Hugo сразу берёт весь диапазон в массив и работает уже с массивом данных
 
KIA, а Вы еще ради интереса с моим сравните и отпишитесь о результатах ; )
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук


https://github.com/nervgh
 
{quote}{login=KIA}{date=14.12.2011 10:46}{thema=}{post}1) Лучше (быстрее) то, что предложил Hugo, а дополнил я.  
{/post}{/quote}  
Спасибо за разъяснения, возьму вариант  Hugo с вашими дополнениями в работу.  
А есть какие нибудь функции, которые выводят время выполнения процедуры, чтобы себя проверить, что эффективней работает ?
 
Nerv, да, Саш, у тебя вообще всё отлично ))  
 
merdek, поищите по форуму слово Timer
 
откуда меня все знают) ^_^
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук


https://github.com/nervgh
 
KIA, о тебе ходят легенды ))  
 
P.S. Просто я знаю всех на этом форуме, т.к. сижу на нём с 2005 года, в те далёкие времена тут ещё не было модераторов, Юрия, The_Prist и т.д. )))
 
{quote}{login=KIA}{date=14.12.2011 10:27}{thema=}{post}Hugo, по-моему, нужно писать так  
{/post}{/quote}  
Да, поторопился, ошибка вышла :( Так было у автора - недоработал в этом месте...  
Спасибо, что заметили :)
 
{quote}{login=KIA}{date=14.12.2011 11:16}{thema=}{post}Просто я знаю всех на этом форуме, т.к. сижу на нём с 2005 года{/post}{/quote}Вижу первое сообщение на форуме, датированное августом 2007 года.
 
KIA, а вот тут  
With .Range("C4").Resize(UBound(a))  
.EntireColumn.Clear  
.Value = b  
End With  
 
лучше всёж выгружать Resize(ii) - чтоб лишнюю пустоту не перемещать. Микросекунды, но всёж, только вот предварительную очистку нужно посмотреть - что она там зачистит.  
Но впрочем в варианте автора она тоже очищала только по количеству вытянутых уникальных.  
 
merdek - перебор ячеек напрямую будет намного медленнее перебора массива, да там ещё и Transpose время возьмёт. А тут сразу получаем выходной массив, который можно выгружать на лист.
 
Юрий, я ещё тогда (в 2005) с ником не определился )), впрочем, как и сейчас ))
 
Я не про Ваш ник - я вообще про первый вопрос на форуме :-) Автор - Семен.  
Наверное, что-то Вы перепутали. Или пропали темы за два года.
 
Игорь, по поводу  
 
With .Range("C4").Resize(UBound(a))  
 
т.к. я писал код после тестирования твоего, то я уже увидел, что код выгружает все 147 значений, и если наложить корректный результат - 27 строк, то не отличить, где заканчивается корректный и где начинается повторы. Конечно, логично выгружать на чистый лист (чистый столбец) "чистый" массив, а вот если в том столбце могут быть другие данные, то лучше его максимально очистить, поэтому я поставил размер "грязного" массива. Грубо говоря, я сделал зачищу "от дурака". Т.к. если автор тестирует те коды, которые мы ему кидаем, то чей-то код может дать 40 значений, а потом он потестирует мой и не увидит разницы, т.к. 27 первых значений будут моими, а с 28 по 40 будут чужими. Когда пишешь для себя - тут ты прав, а для чужих, лучше перестраховаться. А то потом придётся объяснять, что реально код работает, просто ты не очистил столбец С перед запуском моего кода.
 
возможно, что пропали, я помню при мне грохался форум несколько раз. Разные атаки хакеров были, тогда ещё и защиты от спама не было. Это потом Николай уже переехал на более стабильный хостинг. А я помню со старым хостингом форум лежал по неделе (может чуть меньше)
 
Тоже помню эти времена: порнухой заваливали :-) Сейчас глянул - сам я появился в декабре 2007-го.    
"Как быстро время летит - только недавно в бане мылись, а уже год прошёл" (с)
 
И не говори, Юр.  
 
P.S. Pavel55 )
 
Догадывался, но сомневался :-)
Страницы: 1 2 След.
Наверх