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

Вход

Регистрация

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

 

= Мир MS Excel/Вычисление интервалов между числами в столбце - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_  
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Вычисление интервалов между числами в столбце (Макросы/Sub)
Вычисление интервалов между числами в столбце
djon2012 Дата: Вторник, 07.03.2017, 11:06 | Сообщение № 1
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 106
Репутация: 0 ±
Замечаний: 0% ±

Excel 2010
Здравствуйте уважаемые форумчане!
Нужна ваша помощь в решении маленького вопроса, но большой проблемы (проблемы для меня естестно) …ну как это сделать ? Вот суть «глобальной проблемы» : в столбце А имеются единицы с разными интервалами между ними, мне нужно вычислить эти интервалы, и результаты записывать в столбец B. Пример из вложенного файла, интервал между А12 и А18 равняется 5 пустым ячейкам, записываем 5 в ячейку B1, интервал между А18 и А28 равняется 9 пустым ячейкам, записываем 9 в ячейку B2, интервал между А28 и А42 равняется 13 пустым ячейкам, записываем 13 в ячейку B3 и т.д. Да и еще одно, единицами с интервалами заполнен почти весь диапазон (1048000) столбца А.
Спасибо большое Всем кто откликнется на помощь, здравия Всем!!!
К сообщению приложен файл: 7129526.xlsb (77.3 Kb)


Сообщение отредактировал djon2012 - Вторник, 07.03.2017, 11:07
 
Ответить
СообщениеЗдравствуйте уважаемые форумчане!
Нужна ваша помощь в решении маленького вопроса, но большой проблемы (проблемы для меня естестно) …ну как это сделать ? Вот суть «глобальной проблемы» : в столбце А имеются единицы с разными интервалами между ними, мне нужно вычислить эти интервалы, и результаты записывать в столбец B. Пример из вложенного файла, интервал между А12 и А18 равняется 5 пустым ячейкам, записываем 5 в ячейку B1, интервал между А18 и А28 равняется 9 пустым ячейкам, записываем 9 в ячейку B2, интервал между А28 и А42 равняется 13 пустым ячейкам, записываем 13 в ячейку B3 и т.д. Да и еще одно, единицами с интервалами заполнен почти весь диапазон (1048000) столбца А.
Спасибо большое Всем кто откликнется на помощь, здравия Всем!!!

Автор - djon2012
Дата добавления - 07.03.2017 в 11:06
Nic70y Дата: Вторник, 07.03.2017, 11:34 | Сообщение № 2
Группа: Друзья
Ранг: Экселист
Сообщений: 8791
Репутация: 2293 ±
Замечаний: 0% ±

Excel 2010
обязательно VBA?
вариант формулами
1:
Код
=ПОИСКПОЗ(1;ИНДЕКС(A:A;ПОИСКПОЗ(1;A:A;)+1):A$1048576;)-1
далее:
Код
=ПОИСКПОЗ(1;ИНДЕКС(A:A;СУММ(B$1:B1)+ПОИСКПОЗ(1;A:A;)+СТРОКА()):A$1048576;)-1

хотя с таким кол-вом...
К сообщению приложен файл: 3570907.xlsb (77.7 Kb)


ЮMoney 41001841029809

Сообщение отредактировал Nic70y - Вторник, 07.03.2017, 11:36
 
Ответить
Сообщениеобязательно VBA?
вариант формулами
1:
Код
=ПОИСКПОЗ(1;ИНДЕКС(A:A;ПОИСКПОЗ(1;A:A;)+1):A$1048576;)-1
далее:
Код
=ПОИСКПОЗ(1;ИНДЕКС(A:A;СУММ(B$1:B1)+ПОИСКПОЗ(1;A:A;)+СТРОКА()):A$1048576;)-1

хотя с таким кол-вом...

Автор - Nic70y
Дата добавления - 07.03.2017 в 11:34
djon2012 Дата: Вторник, 07.03.2017, 23:12 | Сообщение № 3
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 106
Репутация: 0 ±
Замечаний: 0% ±

Excel 2010
Nic70y спасибо за формулы отлично работают, но при нужном мне количестве формул 80000-100000 штук обработка идет медленно, плюс при изменении любых ячеек даже в другой книге идет постоянный перерасчет формул а это уже бесит. А как сделать это через VBA, что бы можно было запускать обработку только когда действительно нужно. Спасибо!!!
 
Ответить
СообщениеNic70y спасибо за формулы отлично работают, но при нужном мне количестве формул 80000-100000 штук обработка идет медленно, плюс при изменении любых ячеек даже в другой книге идет постоянный перерасчет формул а это уже бесит. А как сделать это через VBA, что бы можно было запускать обработку только когда действительно нужно. Спасибо!!!

Автор - djon2012
Дата добавления - 07.03.2017 в 23:12
RAN Дата: Среда, 08.03.2017, 00:28 | Сообщение № 4
Группа: Друзья
Ранг: Экселист
Сообщений: 5660
Репутация: 1163 ±
Замечаний: 0% ±

2010
[vba]
Код
Sub Мяууу()
    Dim flag As Boolean
    Dim i&, ii&, k&
    Dim t!
    t = Timer
    Application.ScreenUpdating = False
    i = 1
    If Len(Cells(i, 1)) Then k = 1
    Do While i < Rows.Count
        If Len(Cells(i, 1).Offset(1)) Then flag = True Else flag = False
        ii = Cells(i, 1).End(xlDown).Row
        If Not flag Then
            Cells(Rows.Count, 4).End(xlUp).Offset(1) = ii - i - k
        Else
        End If
        k = 1
        i = ii
        DoEvents
    Loop
    Debug.Print Format(Timer - t, "0.0000")
End Sub
[/vba]
35 секунд
[vba]
Код
Sub мяв()
    Dim flag As Boolean
    Dim arr1, arr2
    Dim i&, j&, k&
    Dim t!
    t = Timer
    arr1 = Range("A:A").Value
    ReDim arr2(1 To UBound(arr1), 1 To 1)
    For i = 1 To UBound(arr1)
        If Len(arr1(i, 1)) = 0 Then flag = True Else flag = False
        If flag Then
            k = k + 1
        Else
            If k Then
                j = j + 1
                arr2(j, 1) = k
                k = 0
                flag = False
            End If
        End If
    Next
    Range("E2").Resize(j) = arr2
    Debug.Print Format(Timer - t, "0.0000")
End Sub
[/vba]
0,45 секунды
:)


Быть или не быть, вот в чем загвоздка!
 
Ответить
Сообщение[vba]
Код
Sub Мяууу()
    Dim flag As Boolean
    Dim i&, ii&, k&
    Dim t!
    t = Timer
    Application.ScreenUpdating = False
    i = 1
    If Len(Cells(i, 1)) Then k = 1
    Do While i < Rows.Count
        If Len(Cells(i, 1).Offset(1)) Then flag = True Else flag = False
        ii = Cells(i, 1).End(xlDown).Row
        If Not flag Then
            Cells(Rows.Count, 4).End(xlUp).Offset(1) = ii - i - k
        Else
        End If
        k = 1
        i = ii
        DoEvents
    Loop
    Debug.Print Format(Timer - t, "0.0000")
End Sub
[/vba]
35 секунд
[vba]
Код
Sub мяв()
    Dim flag As Boolean
    Dim arr1, arr2
    Dim i&, j&, k&
    Dim t!
    t = Timer
    arr1 = Range("A:A").Value
    ReDim arr2(1 To UBound(arr1), 1 To 1)
    For i = 1 To UBound(arr1)
        If Len(arr1(i, 1)) = 0 Then flag = True Else flag = False
        If flag Then
            k = k + 1
        Else
            If k Then
                j = j + 1
                arr2(j, 1) = k
                k = 0
                flag = False
            End If
        End If
    Next
    Range("E2").Resize(j) = arr2
    Debug.Print Format(Timer - t, "0.0000")
End Sub
[/vba]
0,45 секунды
:)

Автор - RAN
Дата добавления - 08.03.2017 в 00:28
djon2012 Дата: Среда, 08.03.2017, 12:23 | Сообщение № 5
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 106
Репутация: 0 ±
Замечаний: 0% ±

Excel 2010
Здравствуйте RAN!!! Большое Вам спасибо за макросы. Я протестировал скорость выполнения каждого и вот что у меня получилось. Макрос Мяyyy у вас 35 секунд у меня почему то 28 минут, макрос Мяв у вас 0,45 секунд у меня 0,56 секунд. Я просто у шоке от того, как оптимизировав макрос можно ооочень существенно выиграть в скорости его выполнения 35 сек против 0,45 сек. Еще раз благодарю за проделанную работу!!! Желаю Вам здравия и Вашей умной голове. ГЕНИАЛЬНО!!! hands hands hands
 
Ответить
СообщениеЗдравствуйте RAN!!! Большое Вам спасибо за макросы. Я протестировал скорость выполнения каждого и вот что у меня получилось. Макрос Мяyyy у вас 35 секунд у меня почему то 28 минут, макрос Мяв у вас 0,45 секунд у меня 0,56 секунд. Я просто у шоке от того, как оптимизировав макрос можно ооочень существенно выиграть в скорости его выполнения 35 сек против 0,45 сек. Еще раз благодарю за проделанную работу!!! Желаю Вам здравия и Вашей умной голове. ГЕНИАЛЬНО!!! hands hands hands

Автор - djon2012
Дата добавления - 08.03.2017 в 12:23
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Вычисление интервалов между числами в столбце (Макросы/Sub)
  • Страница 1 из 1
  • 1
Поиск:

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