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

Вход

Регистрация

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

 

= Мир MS Excel/Определение последовательности дат - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_  
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Определение последовательности дат (Макросы/Sub)
Определение последовательности дат
Timber_Wolf Дата: Пятница, 16.12.2016, 09:56 | Сообщение № 1
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 107
Репутация: 2 ±
Замечаний: 0% ±

Excel 2010
Добрый день господа.
Есть задача более глобальная, но я запутался в решении правильной записи последовательности дат...
Суть вопроса:
Есть множество счетов надо привести их к читабельному виду и свести в менее массивную таблицу. Искать последовательности дат в общем списке по ИД клиента.
Но есть еще особенность счета могут быть 2 видов. Это тоже надо разделить... Все в файле.
Получается 3 условия. ИД - Вид счета - Их последовательность.
К сообщению приложен файл: 2766733.xlsx (12.0 Kb)


Сообщение отредактировал Timber_Wolf - Пятница, 16.12.2016, 10:06
 
Ответить
СообщениеДобрый день господа.
Есть задача более глобальная, но я запутался в решении правильной записи последовательности дат...
Суть вопроса:
Есть множество счетов надо привести их к читабельному виду и свести в менее массивную таблицу. Искать последовательности дат в общем списке по ИД клиента.
Но есть еще особенность счета могут быть 2 видов. Это тоже надо разделить... Все в файле.
Получается 3 условия. ИД - Вид счета - Их последовательность.

Автор - Timber_Wolf
Дата добавления - 16.12.2016 в 09:56
Timber_Wolf Дата: Пятница, 16.12.2016, 10:50 | Сообщение № 2
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 107
Репутация: 2 ±
Замечаний: 0% ±

Excel 2010
Немного поясню. Если поможет решению. Все данные ВСЕГДА отсортированы по ИД далее по Виду счета А или Б и третий уровень по дате выставления от старых к новым...
 
Ответить
СообщениеНемного поясню. Если поможет решению. Все данные ВСЕГДА отсортированы по ИД далее по Виду счета А или Б и третий уровень по дате выставления от старых к новым...

Автор - Timber_Wolf
Дата добавления - 16.12.2016 в 10:50
SLAVICK Дата: Пятница, 16.12.2016, 11:12 | Сообщение № 3
Группа: Модераторы
Ранг: Старожил
Сообщений: 2290
Репутация: 766 ±
Замечаний: 0% ±

2019
Можно сводной - единственное не все даты сразу видны (сделал от-до)- но, их можно увидеть либо клацнув два раза на интересующей ячейке, либо раскрыв +
К сообщению приложен файл: 4013242.xlsx (17.5 Kb)


Иногда все проще чем кажется с первого взгляда.
 
Ответить
СообщениеМожно сводной - единственное не все даты сразу видны (сделал от-до)- но, их можно увидеть либо клацнув два раза на интересующей ячейке, либо раскрыв +

Автор - SLAVICK
Дата добавления - 16.12.2016 в 11:12
Timber_Wolf Дата: Пятница, 16.12.2016, 11:23 | Сообщение № 4
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 107
Репутация: 2 ±
Замечаний: 0% ±

Excel 2010
SLAVICK, Спасибо но не то =)) Про сводные знаем, работали... =))
Требуется именно обработка макросом. Я же писал это часть (модуль) большого проекта. =))) Данные входят в табличном разрозненном виде, выходят отсортированные и читабельные в табличном текстовом виде.
В общем у вас минимум не выполняется условие разрыва последовательных периодов в последней строке. Последовательный период через дефис должен быть, а разрыв между последовательными периодами через запятую =))
 
Ответить
СообщениеSLAVICK, Спасибо но не то =)) Про сводные знаем, работали... =))
Требуется именно обработка макросом. Я же писал это часть (модуль) большого проекта. =))) Данные входят в табличном разрозненном виде, выходят отсортированные и читабельные в табличном текстовом виде.
В общем у вас минимум не выполняется условие разрыва последовательных периодов в последней строке. Последовательный период через дефис должен быть, а разрыв между последовательными периодами через запятую =))

Автор - Timber_Wolf
Дата добавления - 16.12.2016 в 11:23
nilem Дата: Пятница, 16.12.2016, 11:34 | Сообщение № 5
Группа: Авторы
Ранг: Старожил
Сообщений: 1613
Репутация: 563 ±
Замечаний: 0% ±

Excel 2013, 2016
Последовательный период через дефис должен быть

имеется ввиду не последовательные даты (дни), а последовательные месяцы, так?

Просто с месяцами что-то нереально. Если все ч/з запятую, то так попробуйте


Яндекс.Деньги 4100159601573

Сообщение отредактировал nilem - Пятница, 16.12.2016, 11:36
 
Ответить
Сообщение
Последовательный период через дефис должен быть

имеется ввиду не последовательные даты (дни), а последовательные месяцы, так?

Просто с месяцами что-то нереально. Если все ч/з запятую, то так попробуйте

Автор - nilem
Дата добавления - 16.12.2016 в 11:34
Timber_Wolf Дата: Пятница, 16.12.2016, 11:47 | Сообщение № 6
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 107
Репутация: 2 ±
Замечаний: 0% ±

Excel 2010
nilem, Да там обрабатываются именно последовательность в месяцах. Но просто через запятую не вариант. Приходится обрабатывать по 5-6 лет порой. Это такая портянка на выходе получится в одной ячейке.... Затем и делается что бы были разрывные и не разрывные периоды, при чем поглощались одинаковые и становились одним месяцем.
 
Ответить
Сообщениеnilem, Да там обрабатываются именно последовательность в месяцах. Но просто через запятую не вариант. Приходится обрабатывать по 5-6 лет порой. Это такая портянка на выходе получится в одной ячейке.... Затем и делается что бы были разрывные и не разрывные периоды, при чем поглощались одинаковые и становились одним месяцем.

Автор - Timber_Wolf
Дата добавления - 16.12.2016 в 11:47
Timber_Wolf Дата: Пятница, 16.12.2016, 11:54 | Сообщение № 7
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 107
Репутация: 2 ±
Замечаний: 0% ±

Excel 2010
nilem, С месяцами реально. =)) Я уже делал. Но код тормозил безбожно и вешал периодически эксель, но на выходе было именно то что нужно. И в силу кочевания с места на место я куда то потерял этот код =((( А теперь блин по памяти не могу восстановить. Да и надеюсь найти ответы работающие более оперативно чем моя прежняя разработка. =((
 
Ответить
Сообщениеnilem, С месяцами реально. =)) Я уже делал. Но код тормозил безбожно и вешал периодически эксель, но на выходе было именно то что нужно. И в силу кочевания с места на место я куда то потерял этот код =((( А теперь блин по памяти не могу восстановить. Да и надеюсь найти ответы работающие более оперативно чем моя прежняя разработка. =((

Автор - Timber_Wolf
Дата добавления - 16.12.2016 в 11:54
nilem Дата: Пятница, 16.12.2016, 12:12 | Сообщение № 8
Группа: Авторы
Ранг: Старожил
Сообщений: 1613
Репутация: 563 ±
Замечаний: 0% ±

Excel 2013, 2016
С месяцами реально. =))

похоже, да. Пробуйте

и еще функция (положите в тот же модуль)

Функция будет корректно работать (ну должна, по крайней мере) до 31.12.2100 г. )


Яндекс.Деньги 4100159601573

Сообщение отредактировал nilem - Пятница, 16.12.2016, 12:14
 
Ответить
Сообщение
С месяцами реально. =))

похоже, да. Пробуйте

и еще функция (положите в тот же модуль)

Функция будет корректно работать (ну должна, по крайней мере) до 31.12.2100 г. )

Автор - nilem
Дата добавления - 16.12.2016 в 12:12
dim34rus Дата: Пятница, 16.12.2016, 12:15 | Сообщение № 9
Группа: Пользователи
Ранг: Участник
Сообщений: 66
Репутация: 10 ±
Замечаний: 0% ±

Excel 2007 - 2013
Начнем по малому...

короче сейчас макрос выдает отсортированную, консолидированную таблицу при этом в колонке с датами строка из месяцев и годов по возрастанию.
Далее думаю над разбором данной строки...

ЗЫЖ для макроса предварительный порядок сортировки "до фонаря"
К сообщению приложен файл: Sorter.xlsm (23.0 Kb)


Извращение - это писать формулы в Word'овских таблицах.
ЯД 410014340958327
 
Ответить
СообщениеНачнем по малому...

короче сейчас макрос выдает отсортированную, консолидированную таблицу при этом в колонке с датами строка из месяцев и годов по возрастанию.
Далее думаю над разбором данной строки...

ЗЫЖ для макроса предварительный порядок сортировки "до фонаря"

Автор - dim34rus
Дата добавления - 16.12.2016 в 12:15
Timber_Wolf Дата: Пятница, 16.12.2016, 12:25 | Сообщение № 10
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 107
Репутация: 2 ±
Замечаний: 0% ±

Excel 2010
nilem, Вооо. Похоже на правду... После обеда попробую. Только у меня конечно все в массивах висит а не на листах =)))
 
Ответить
Сообщениеnilem, Вооо. Похоже на правду... После обеда попробую. Только у меня конечно все в массивах висит а не на листах =)))

Автор - Timber_Wolf
Дата добавления - 16.12.2016 в 12:25
Timber_Wolf Дата: Пятница, 16.12.2016, 12:26 | Сообщение № 11
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 107
Репутация: 2 ±
Замечаний: 0% ±

Excel 2010
dim34rus, Немного не верно. Счета Б не должны стоять перед счетами А... =))) Бухгалтерия все таки =)))
 
Ответить
Сообщениеdim34rus, Немного не верно. Счета Б не должны стоять перед счетами А... =))) Бухгалтерия все таки =)))

Автор - Timber_Wolf
Дата добавления - 16.12.2016 в 12:26
SLAVICK Дата: Пятница, 16.12.2016, 12:30 | Сообщение № 12
Группа: Модераторы
Ранг: Старожил
Сообщений: 2290
Репутация: 766 ±
Замечаний: 0% ±

2019
У меня так вышло:
[vba]
Код
Sub d()
Dim d As Object, arr(1 To 4), d1 As New Scripting.Dictionary
Set d = CreateObject("Scripting.dictionary")
    m = Range("A2").CurrentRegion.Value
    Range(Selection, Selection.End(xlDown)).Select
    For i = 2 To UBound(m)
    s = m(i, 1) & m(i, 3)
        If d1.exists(s) Then
            m1 = d1.Item(s)
            m1(2) = m1(2) + m(i, 2)
            dd = CDate(Right(m1(4), 10))
            t = DateDiff("m", dd, DateSerial(Year(m(i, 4)), Month(m(i, 4)), 1))
            Select Case True
                Case t > 1
                    m1(4) = m1(4) & "," & m(i, 4)
                Case Len(m1(4)) < 11
                    m1(4) = m1(4) & "-" & DateSerial(Year(m(i, 4)), Month(m(i, 4)), 1)
                Case Right(m1(4), 11) = "," & dd
                    m1(4) = m1(4) & "-" & DateSerial(Year(m(i, 4)), Month(m(i, 4)), 1)
                Case Else
                    m1(4) = Left(m1(4), Len(m1(4)) - 11) & "-" & DateSerial(Year(m(i, 4)), Month(m(i, 4)), 1)
            End Select
            d1(s) = m1
        Else
            For ii = 1 To 3: arr(ii) = m(i, ii): Next
            arr(4) = DateSerial(Year(m(i, 4)), Month(m(i, 4)), 1)
            d1(s) = arr
        End If
    Next
    m1 = d1.Items
    ReDim mf(1 To UBound(m1) + 1, 1 To 4)
    For i = 0 To UBound(m1)
        ss = m1(i)(4)
        For ii = 1 To Len(m1(i)(4)) Step 11
        s = Format(Mid(m1(i)(4), ii, 10), "MMMM YYYY")
        ss = Replace(ss, Mid(m1(i)(4), ii, 10), s)
        Next
        mf(i + 1, 1) = m1(i)(1): mf(i + 1, 2) = m1(i)(2): mf(i + 1, 3) = m1(i)(3): mf(i + 1, 4) = ss
    Next
    Cells(3, "n").Resize(i, 4) = mf
End Sub
[/vba]
К сообщению приложен файл: ddd-1-.xlsm (25.1 Kb)


Иногда все проще чем кажется с первого взгляда.
 
Ответить
СообщениеУ меня так вышло:
[vba]
Код
Sub d()
Dim d As Object, arr(1 To 4), d1 As New Scripting.Dictionary
Set d = CreateObject("Scripting.dictionary")
    m = Range("A2").CurrentRegion.Value
    Range(Selection, Selection.End(xlDown)).Select
    For i = 2 To UBound(m)
    s = m(i, 1) & m(i, 3)
        If d1.exists(s) Then
            m1 = d1.Item(s)
            m1(2) = m1(2) + m(i, 2)
            dd = CDate(Right(m1(4), 10))
            t = DateDiff("m", dd, DateSerial(Year(m(i, 4)), Month(m(i, 4)), 1))
            Select Case True
                Case t > 1
                    m1(4) = m1(4) & "," & m(i, 4)
                Case Len(m1(4)) < 11
                    m1(4) = m1(4) & "-" & DateSerial(Year(m(i, 4)), Month(m(i, 4)), 1)
                Case Right(m1(4), 11) = "," & dd
                    m1(4) = m1(4) & "-" & DateSerial(Year(m(i, 4)), Month(m(i, 4)), 1)
                Case Else
                    m1(4) = Left(m1(4), Len(m1(4)) - 11) & "-" & DateSerial(Year(m(i, 4)), Month(m(i, 4)), 1)
            End Select
            d1(s) = m1
        Else
            For ii = 1 To 3: arr(ii) = m(i, ii): Next
            arr(4) = DateSerial(Year(m(i, 4)), Month(m(i, 4)), 1)
            d1(s) = arr
        End If
    Next
    m1 = d1.Items
    ReDim mf(1 To UBound(m1) + 1, 1 To 4)
    For i = 0 To UBound(m1)
        ss = m1(i)(4)
        For ii = 1 To Len(m1(i)(4)) Step 11
        s = Format(Mid(m1(i)(4), ii, 10), "MMMM YYYY")
        ss = Replace(ss, Mid(m1(i)(4), ii, 10), s)
        Next
        mf(i + 1, 1) = m1(i)(1): mf(i + 1, 2) = m1(i)(2): mf(i + 1, 3) = m1(i)(3): mf(i + 1, 4) = ss
    Next
    Cells(3, "n").Resize(i, 4) = mf
End Sub
[/vba]

Автор - SLAVICK
Дата добавления - 16.12.2016 в 12:30
dim34rus Дата: Пятница, 16.12.2016, 13:17 | Сообщение № 13
Группа: Пользователи
Ранг: Участник
Сообщений: 66
Репутация: 10 ±
Замечаний: 0% ±

Excel 2007 - 2013
Заработало.

Мой предыдущий пост - фтопку
Перечитал задание о том, что все отсортировано многоуровневой сортировкой и вот оно прозрение :-)
[vba]
Код
Sub SSorter1()
Dim i, k, k_First

i = 3 'Стартовая строка
k_First = ActiveCell.SpecialCells(xlLastCell).Row + 2 'Первая строка сводной таблицы
   
k = k_First
aa = "" 'Здесь храним текст окончания диапазона
With ActiveSheet
  While .Cells(i, 1).Value <> ""
    
    If (.Cells(i, 1).Value = .Cells(k, 1).Value) And (.Cells(i, 3).Value = .Cells(k, 3).Value) Then
      'Если обрабатываем имеющуюся строку
       .Cells(k, 2).Value = (.Cells(k, 2).Value) + (.Cells(i, 2).Value)
       
       NewDate = (Year(.Cells(i, 4).Value) - 2000) * 12 + Month(.Cells(i, 4).Value)
       
       If NewDate - 1 = OldDate Then
          aa = " - " & Format(.Cells(i, 4).Value, "MMMM YYYY")
       Else
          If NewDate <> OldDate Then
          
            If Len(aa) > 1 Then
                .Cells(k, 4).Value = .Cells(k, 4).Value & aa
                aa = ""
            End If
          
            .Cells(k, 4).Value = .Cells(k, 4).Value & ", " & Format(.Cells(i, 4).Value, "MMMM YYYY")
           End If
       End If
       OldDate = NewDate
    Else
      'Новая сводная строка
       If .Cells(k, 1).Value <> "" Then
          If Len(aa) > 1 Then
            .Cells(k, 4).Value = .Cells(k, 4).Value & aa
            aa = ""
          End If
          k = k + 1
       End If
       .Cells(k, 1).Value = .Cells(i, 1).Value
       .Cells(k, 3).Value = .Cells(i, 3).Value
       .Cells(k, 2).Value = .Cells(i, 2).Value
       .Cells(k, 4).Value = "" & Format(.Cells(i, 4).Value, "MMMM YYYY")
       OldDate = (Year(.Cells(i, 4).Value) - 2000) * 12 + Month(.Cells(i, 4).Value)
    End If
    
    i = i + 1
  Wend
          
  If Len(aa) > 1 Then
       .Cells(k, 4).Value = .Cells(k, 4).Value & aa
       aa = ""
  End If
End With
End Sub

[/vba]
К сообщению приложен файл: 5648837.xlsm (20.7 Kb)


Извращение - это писать формулы в Word'овских таблицах.
ЯД 410014340958327
 
Ответить
СообщениеЗаработало.

Мой предыдущий пост - фтопку
Перечитал задание о том, что все отсортировано многоуровневой сортировкой и вот оно прозрение :-)
[vba]
Код
Sub SSorter1()
Dim i, k, k_First

i = 3 'Стартовая строка
k_First = ActiveCell.SpecialCells(xlLastCell).Row + 2 'Первая строка сводной таблицы
   
k = k_First
aa = "" 'Здесь храним текст окончания диапазона
With ActiveSheet
  While .Cells(i, 1).Value <> ""
    
    If (.Cells(i, 1).Value = .Cells(k, 1).Value) And (.Cells(i, 3).Value = .Cells(k, 3).Value) Then
      'Если обрабатываем имеющуюся строку
       .Cells(k, 2).Value = (.Cells(k, 2).Value) + (.Cells(i, 2).Value)
       
       NewDate = (Year(.Cells(i, 4).Value) - 2000) * 12 + Month(.Cells(i, 4).Value)
       
       If NewDate - 1 = OldDate Then
          aa = " - " & Format(.Cells(i, 4).Value, "MMMM YYYY")
       Else
          If NewDate <> OldDate Then
          
            If Len(aa) > 1 Then
                .Cells(k, 4).Value = .Cells(k, 4).Value & aa
                aa = ""
            End If
          
            .Cells(k, 4).Value = .Cells(k, 4).Value & ", " & Format(.Cells(i, 4).Value, "MMMM YYYY")
           End If
       End If
       OldDate = NewDate
    Else
      'Новая сводная строка
       If .Cells(k, 1).Value <> "" Then
          If Len(aa) > 1 Then
            .Cells(k, 4).Value = .Cells(k, 4).Value & aa
            aa = ""
          End If
          k = k + 1
       End If
       .Cells(k, 1).Value = .Cells(i, 1).Value
       .Cells(k, 3).Value = .Cells(i, 3).Value
       .Cells(k, 2).Value = .Cells(i, 2).Value
       .Cells(k, 4).Value = "" & Format(.Cells(i, 4).Value, "MMMM YYYY")
       OldDate = (Year(.Cells(i, 4).Value) - 2000) * 12 + Month(.Cells(i, 4).Value)
    End If
    
    i = i + 1
  Wend
          
  If Len(aa) > 1 Then
       .Cells(k, 4).Value = .Cells(k, 4).Value & aa
       aa = ""
  End If
End With
End Sub

[/vba]

Автор - dim34rus
Дата добавления - 16.12.2016 в 13:17
Timber_Wolf Дата: Пятница, 16.12.2016, 13:44 | Сообщение № 14
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 107
Репутация: 2 ±
Замечаний: 0% ±

Excel 2010
SLAVICK, nilem, Отлично работающие варианты. =))) Спасибо =))) Но тесты на реальных данных и объемах покажут ху из ху =)))

dim34rus, Тоже работает =) Но маленькое но... Т.к. это модуль программы то там все передается через массивы =))) С листами не работаем =)
 
Ответить
СообщениеSLAVICK, nilem, Отлично работающие варианты. =))) Спасибо =))) Но тесты на реальных данных и объемах покажут ху из ху =)))

dim34rus, Тоже работает =) Но маленькое но... Т.к. это модуль программы то там все передается через массивы =))) С листами не работаем =)

Автор - Timber_Wolf
Дата добавления - 16.12.2016 в 13:44
dim34rus Дата: Пятница, 16.12.2016, 13:59 | Сообщение № 15
Группа: Пользователи
Ранг: Участник
Сообщений: 66
Репутация: 10 ±
Замечаний: 0% ±

Excel 2007 - 2013
все передается через массивы


Поменял Cells(x, y) на <имя массива > ( x,y) И в принципе усе


Извращение - это писать формулы в Word'овских таблицах.
ЯД 410014340958327


Сообщение отредактировал dim34rus - Пятница, 16.12.2016, 14:00
 
Ответить
Сообщение
все передается через массивы


Поменял Cells(x, y) на <имя массива > ( x,y) И в принципе усе

Автор - dim34rus
Дата добавления - 16.12.2016 в 13:59
Timber_Wolf Дата: Пятница, 16.12.2016, 14:38 | Сообщение № 16
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 107
Репутация: 2 ±
Замечаний: 0% ±

Excel 2010
Блин. А к реальным данным прикрутить не могу =)) Путаюсь в кодах предоставленных =)) Там не совсем так столбцы располагаются =(
 
Ответить
СообщениеБлин. А к реальным данным прикрутить не могу =)) Путаюсь в кодах предоставленных =)) Там не совсем так столбцы располагаются =(

Автор - Timber_Wolf
Дата добавления - 16.12.2016 в 14:38
dim34rus Дата: Пятница, 16.12.2016, 15:58 | Сообщение № 17
Группа: Пользователи
Ранг: Участник
Сообщений: 66
Репутация: 10 ±
Замечаний: 0% ±

Excel 2007 - 2013
В Ехеле адресация: Cells(Row,Column)
Да и как у Вас в одном массиве разнородные данные. Может быть у вас массив структур? и на VBA ли?


Извращение - это писать формулы в Word'овских таблицах.
ЯД 410014340958327


Сообщение отредактировал dim34rus - Пятница, 16.12.2016, 16:02
 
Ответить
СообщениеВ Ехеле адресация: Cells(Row,Column)
Да и как у Вас в одном массиве разнородные данные. Может быть у вас массив структур? и на VBA ли?

Автор - dim34rus
Дата добавления - 16.12.2016 в 15:58
Timber_Wolf Дата: Пятница, 16.12.2016, 16:22 | Сообщение № 18
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 107
Репутация: 2 ±
Замечаний: 0% ±

Excel 2010
dim34rus, Изначально данные берутся с листа в массив методом например таким [vba]
Код
Исходник = Range("A2").CurrentRegion.Value
[/vba]
И берутся они любого рода =) Цифры. текст Далее куча обработок по массиву аля Исходник(x,y)... =)
То что VBA это точно =)
 
Ответить
Сообщениеdim34rus, Изначально данные берутся с листа в массив методом например таким [vba]
Код
Исходник = Range("A2").CurrentRegion.Value
[/vba]
И берутся они любого рода =) Цифры. текст Далее куча обработок по массиву аля Исходник(x,y)... =)
То что VBA это точно =)

Автор - Timber_Wolf
Дата добавления - 16.12.2016 в 16:22
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Определение последовательности дат (Макросы/Sub)
  • Страница 1 из 1
  • 1
Поиск:

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