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

Вход

Регистрация

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

 

= Мир MS Excel/Посчитать количество уникальных значений по двум столбцам. - Страница 2 - Мир MS Excel

Регистрация · Логин: · Пароль: · · Забыли пароль?
Страница 2 из 2«12
Модератор форума: _Boroda_, Pelena, Manyasha, SLAVICK 
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Посчитать количество уникальных значений по двум столбцам. (Макросы/Sub)
Посчитать количество уникальных значений по двум столбцам.
StoTisteg Дата: Воскресенье, 13.03.2016, 20:35 | Сообщение № 21
Группа: Авторы
Ранг: Ветеран
Сообщений: 541
Репутация: 45 ±
Замечаний: 0% ±

Excel 2010
Народ, вы забыли, что файлов много ;)


Проверь всё. ThisWorkbook.Save. On Error Resume Next.
 
Ответить
СообщениеНарод, вы забыли, что файлов много ;)

Автор - StoTisteg
Дата добавления - 13.03.2016 в 20:35
Pelena Дата: Воскресенье, 13.03.2016, 20:37 | Сообщение № 22
Группа: Модераторы
Ранг: Экселист
Сообщений: 9842
Репутация: 2252 ±
Замечаний: 0% ±

Excel 2010 & Mac Excel 2011
Обходим ошибку (увеличила до 1000 строк)
Код
=СУММ(ЕСЛИОШИБКА(1/СЧЁТЕСЛИМН(Лист1!$C$3:$C$1000;Лист1!$C$3:$C$1000;Лист1!$K$3:$K$1000;Лист1!$K$3:$K$1000;Лист1!$P$3:$P$1000;Лист1!$P$3:$P$1000);0)*(Лист1!$K$3:$K$1000=A2)*(Лист1!$P$3:$P$1000="Выполнено"))


вы забыли, что файлов много

Никто не запрещает Вам предложить свой вариант


"Черт возьми, Холмс! Но как??!!"
ЯД 41001765434816
 
Ответить
СообщениеОбходим ошибку (увеличила до 1000 строк)
Код
=СУММ(ЕСЛИОШИБКА(1/СЧЁТЕСЛИМН(Лист1!$C$3:$C$1000;Лист1!$C$3:$C$1000;Лист1!$K$3:$K$1000;Лист1!$K$3:$K$1000;Лист1!$P$3:$P$1000;Лист1!$P$3:$P$1000);0)*(Лист1!$K$3:$K$1000=A2)*(Лист1!$P$3:$P$1000="Выполнено"))


вы забыли, что файлов много

Никто не запрещает Вам предложить свой вариант

Автор - Pelena
Дата добавления - 13.03.2016 в 20:37
Leksa Дата: Воскресенье, 13.03.2016, 20:39 | Сообщение № 23
Группа: Пользователи
Ранг: Новичок
Сообщений: 28
Репутация: 0 ±
Замечаний: 0% ±

Excel 2013
Pelena, вопрос - как доработать формулу чтоб считала правильно если в № или ФИО или Статусе пустая ячейка?
[moder]См. формулу выше[/moder]
 
Ответить
СообщениеPelena, вопрос - как доработать формулу чтоб считала правильно если в № или ФИО или Статусе пустая ячейка?
[moder]См. формулу выше[/moder]

Автор - Leksa
Дата добавления - 13.03.2016 в 20:39
StoTisteg Дата: Воскресенье, 13.03.2016, 20:40 | Сообщение № 24
Группа: Авторы
Ранг: Ветеран
Сообщений: 541
Репутация: 45 ±
Замечаний: 0% ±

Excel 2010
"мсье знает толк в извращениях" лучше, чем я

Мсье знает толк в кучах файлов и кривых руках пользователей ;)


Проверь всё. ThisWorkbook.Save. On Error Resume Next.
 
Ответить
Сообщение
"мсье знает толк в извращениях" лучше, чем я

Мсье знает толк в кучах файлов и кривых руках пользователей ;)

Автор - StoTisteg
Дата добавления - 13.03.2016 в 20:40
KuklP Дата: Воскресенье, 13.03.2016, 21:11 | Сообщение № 25
Группа: Проверенные
Ранг: Старожил
Сообщений: 1994
Репутация: 435 ±
Замечаний: 0% ±

Правда изврат.
К сообщению приложен файл: 6945402.xlsm(41Kb)


Ну, с НДС и мы чего-то стoим! kuklp@mail.ru
WM Z206653985942, R334086032478, U238399322728
 
Ответить
СообщениеПравда изврат.

Автор - KuklP
Дата добавления - 13.03.2016 в 21:11
StoTisteg Дата: Воскресенье, 13.03.2016, 21:59 | Сообщение № 26
Группа: Авторы
Ранг: Ветеран
Сообщений: 541
Репутация: 45 ±
Замечаний: 0% ±

Excel 2010
Правда изврат.

Не беспокойтесь, меня Вам не переплюнуть :p
[vba]
Код
Sub Считать()

    Dim СписокФайлов() As String
    Dim i, j, Rws, Clm, ЧислоФайлов As Integer
    
    Application.DisplayAlerts = False
    MsgBox prompt:="Укажите файлы для обработки"
    With Application.FileDialog(msoFileDialogOpen)
        .AllowMultiSelect = True
        .Show
        If .SelectedItems.Count = 0 Then Exit Sub
        ЧислоФайлов = .SelectedItems.Count
        ReDim СписокФайлов(1 To ЧислоФайлов)
        For i = 1 To ЧислоФайлов
            СписокФайлов(i) = .SelectedItems(i)
        Next i
    End With
    For i = 1 To ЧислоФайлов
        If InStr(1, LCase(СписокФайлов(i)), ".xls", vbTextCompare) > 0 Then
            Workbooks.Open Filename:=СписокФайлов(i)
            If Trim(Worksheets(1).Cells(1, 1).Value) = "n\n" Then
                Do While Err.Number = 0
                    Err.Clear
                    On Error Resume Next
                    Worksheets(Sheets.Count).Delete
                Loop
                Worksheets.Add after:=Worksheets(1)
                Cells(1, 1).Value = "Ответственный"
                Cells(1, 2).Value = "Выполнено"
                Cells(1, 3).Value = "Осталось"
                Worksheets.Add after:=Worksheets(2)
                Worksheets(1).Cells.Copy Destination:=Cells
                Range(Cells(1, 1), Cells(Cells(Rows.Count, 1).End(xlUp).Row, ActiveSheet.UsedRange.Columns.Count)).RemoveDuplicates Columns:=11, Header:=xlYes
                With Worksheets(2)
                    For j = 2 To Cells(Rows.Count, 1).End(xlUp).Row
                        If Trim(Cells(j, 11).Value) <> "" Then .Cells(.Cells(Rows.Count, 1).End(xlUp).Row + 1, 1).Value = Cells(j, 11).Value
                    Next j
                End With
                Cells.Clear
                Worksheets(1).Cells.Copy Destination:=Cells
                Range(Cells(1, 1), Cells(Cells(Rows.Count, 1).End(xlUp).Row, ActiveSheet.UsedRange.Columns.Count)).RemoveDuplicates Columns:=Array(3, 11), Header:=xlYes
                Rws = Cells(Rows.Count, 1).End(xlUp).Row
                Clm = ActiveSheet.UsedRange.Columns.Count
                Cells(1, Clm + 2).Value = "Выполнено"
                Cells(1, Clm + 3).Value = "Не выполнено"
                Range(Cells(2, Clm + 2), Cells(Rws, Clm + 2)).FormulaR1C1 = "=COUNTIFS(R2C11:R" & Rws & "C11,RC[" & 9 - Clm & "],R2C16:R" & Rws & "C16,""Выполнено"")"
                Range(Cells(2, Clm + 3), Cells(Rws, Clm + 3)).FormulaR1C1 = "=COUNTIFS(R2C11:R" & Rws & "C11,RC[" & 9 - Clm & "],R2C16:R" & Rws & "C16,""<>Выполнено"")"
                Columns(Clm + 2).Copy
                Columns(Clm + 2).PasteSpecial Paste:=xlPasteValues
                Columns(Clm + 3).Copy
                Columns(Clm + 3).PasteSpecial Paste:=xlPasteValues
                Range(Cells(1, 1), Cells(Rws, Clm + 3)).RemoveDuplicates Columns:=11, Header:=xlYes
                With Worksheets(2)
                    For j = 2 To Cells(Rows.Count, 1).End(xlUp).Row
                        If Trim(Cells(j, 11).Value) <> "" Then
                            .Cells(.Cells(Rows.Count, 2).End(xlUp).Row + 1, 2).Value = Cells(j, Clm + 2).Value
                            .Cells(.Cells(Rows.Count, 3).End(xlUp).Row + 1, 3).Value = Cells(j, Clm + 3).Value
                        End If
                    Next j
                End With
                Worksheets(3).Delete
                ActiveWorkbook.Save
            End If
            ActiveWorkbook.Close
        End If
    Next i
    Application.DisplayAlerts = True

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


Проверь всё. ThisWorkbook.Save. On Error Resume Next.
 
Ответить
Сообщение
Правда изврат.

Не беспокойтесь, меня Вам не переплюнуть :p
[vba]
Код
Sub Считать()

    Dim СписокФайлов() As String
    Dim i, j, Rws, Clm, ЧислоФайлов As Integer
    
    Application.DisplayAlerts = False
    MsgBox prompt:="Укажите файлы для обработки"
    With Application.FileDialog(msoFileDialogOpen)
        .AllowMultiSelect = True
        .Show
        If .SelectedItems.Count = 0 Then Exit Sub
        ЧислоФайлов = .SelectedItems.Count
        ReDim СписокФайлов(1 To ЧислоФайлов)
        For i = 1 To ЧислоФайлов
            СписокФайлов(i) = .SelectedItems(i)
        Next i
    End With
    For i = 1 To ЧислоФайлов
        If InStr(1, LCase(СписокФайлов(i)), ".xls", vbTextCompare) > 0 Then
            Workbooks.Open Filename:=СписокФайлов(i)
            If Trim(Worksheets(1).Cells(1, 1).Value) = "n\n" Then
                Do While Err.Number = 0
                    Err.Clear
                    On Error Resume Next
                    Worksheets(Sheets.Count).Delete
                Loop
                Worksheets.Add after:=Worksheets(1)
                Cells(1, 1).Value = "Ответственный"
                Cells(1, 2).Value = "Выполнено"
                Cells(1, 3).Value = "Осталось"
                Worksheets.Add after:=Worksheets(2)
                Worksheets(1).Cells.Copy Destination:=Cells
                Range(Cells(1, 1), Cells(Cells(Rows.Count, 1).End(xlUp).Row, ActiveSheet.UsedRange.Columns.Count)).RemoveDuplicates Columns:=11, Header:=xlYes
                With Worksheets(2)
                    For j = 2 To Cells(Rows.Count, 1).End(xlUp).Row
                        If Trim(Cells(j, 11).Value) <> "" Then .Cells(.Cells(Rows.Count, 1).End(xlUp).Row + 1, 1).Value = Cells(j, 11).Value
                    Next j
                End With
                Cells.Clear
                Worksheets(1).Cells.Copy Destination:=Cells
                Range(Cells(1, 1), Cells(Cells(Rows.Count, 1).End(xlUp).Row, ActiveSheet.UsedRange.Columns.Count)).RemoveDuplicates Columns:=Array(3, 11), Header:=xlYes
                Rws = Cells(Rows.Count, 1).End(xlUp).Row
                Clm = ActiveSheet.UsedRange.Columns.Count
                Cells(1, Clm + 2).Value = "Выполнено"
                Cells(1, Clm + 3).Value = "Не выполнено"
                Range(Cells(2, Clm + 2), Cells(Rws, Clm + 2)).FormulaR1C1 = "=COUNTIFS(R2C11:R" & Rws & "C11,RC[" & 9 - Clm & "],R2C16:R" & Rws & "C16,""Выполнено"")"
                Range(Cells(2, Clm + 3), Cells(Rws, Clm + 3)).FormulaR1C1 = "=COUNTIFS(R2C11:R" & Rws & "C11,RC[" & 9 - Clm & "],R2C16:R" & Rws & "C16,""<>Выполнено"")"
                Columns(Clm + 2).Copy
                Columns(Clm + 2).PasteSpecial Paste:=xlPasteValues
                Columns(Clm + 3).Copy
                Columns(Clm + 3).PasteSpecial Paste:=xlPasteValues
                Range(Cells(1, 1), Cells(Rws, Clm + 3)).RemoveDuplicates Columns:=11, Header:=xlYes
                With Worksheets(2)
                    For j = 2 To Cells(Rows.Count, 1).End(xlUp).Row
                        If Trim(Cells(j, 11).Value) <> "" Then
                            .Cells(.Cells(Rows.Count, 2).End(xlUp).Row + 1, 2).Value = Cells(j, Clm + 2).Value
                            .Cells(.Cells(Rows.Count, 3).End(xlUp).Row + 1, 3).Value = Cells(j, Clm + 3).Value
                        End If
                    Next j
                End With
                Worksheets(3).Delete
                ActiveWorkbook.Save
            End If
            ActiveWorkbook.Close
        End If
    Next i
    Application.DisplayAlerts = True

End Sub
[/vba]

Автор - StoTisteg
Дата добавления - 13.03.2016 в 21:59
Hugo Дата: Воскресенье, 13.03.2016, 22:22 | Сообщение № 27
Группа: Друзья
Ранг: Участник клуба
Сообщений: 2653
Репутация: 597 ±
Замечаний: 0% ±

Можно ведь проще:
[vba]
Код

Public Sub obrabotka()
    Dim a, b, c, x&, t$, tt$, i&, dc1 As Object, dc2 As Object, k
    Set dc1 = CreateObject("scripting.dictionary")
    Set dc2 = CreateObject("scripting.dictionary")
    Application.ScreenUpdating = False

    'если файлов много - тут добавить открытие очередного файла
    With Sheets(1)
        x = .Cells(.Rows.Count, 1).End(xlUp).Row
        a = .Range("C3:C" & x).Value: b = .Range("K3:K" & x).Value: c = .Range("P3:P" & x).Value
    End With
    For i = 1 To UBound(a)
        t = a(i, 1) & "|" & b(i, 1): tt = t & "|" & (c(i, 1) = "Выполнено")
        dc1.Item(tt) = dc1.Item(tt) + 1: dc2.Item(t) = 0&
    Next
    'если файлов много - тут добавить закрытие очередного файла

    i = 1
    For Each k In dc2.keys
        i = i + 1: Sheets(2).Cells(i, 1).Resize(1, 3) = Array(k, dc1.Item(k & "|" & (1 = 1)), dc1.Item(k & "|" & (1 = 0)))
    Next
    Application.ScreenUpdating = True
End Sub
[/vba]


excel@nxt.ru
webmoney: E265281470651 R418926282008 Z422237915069


Сообщение отредактировал Hugo - Воскресенье, 13.03.2016, 22:39
 
Ответить
СообщениеМожно ведь проще:
[vba]
Код

Public Sub obrabotka()
    Dim a, b, c, x&, t$, tt$, i&, dc1 As Object, dc2 As Object, k
    Set dc1 = CreateObject("scripting.dictionary")
    Set dc2 = CreateObject("scripting.dictionary")
    Application.ScreenUpdating = False

    'если файлов много - тут добавить открытие очередного файла
    With Sheets(1)
        x = .Cells(.Rows.Count, 1).End(xlUp).Row
        a = .Range("C3:C" & x).Value: b = .Range("K3:K" & x).Value: c = .Range("P3:P" & x).Value
    End With
    For i = 1 To UBound(a)
        t = a(i, 1) & "|" & b(i, 1): tt = t & "|" & (c(i, 1) = "Выполнено")
        dc1.Item(tt) = dc1.Item(tt) + 1: dc2.Item(t) = 0&
    Next
    'если файлов много - тут добавить закрытие очередного файла

    i = 1
    For Each k In dc2.keys
        i = i + 1: Sheets(2).Cells(i, 1).Resize(1, 3) = Array(k, dc1.Item(k & "|" & (1 = 1)), dc1.Item(k & "|" & (1 = 0)))
    Next
    Application.ScreenUpdating = True
End Sub
[/vba]

Автор - Hugo
Дата добавления - 13.03.2016 в 22:22
KuklP Дата: Воскресенье, 13.03.2016, 22:24 | Сообщение № 28
Группа: Проверенные
Ранг: Старожил
Сообщений: 1994
Репутация: 435 ±
Замечаний: 0% ±

Do While Err.Number = 0
Err.Clear
строка Err.Clear не имеет смысла. В случае ошибки до нее не дойдет ход.


Ну, с НДС и мы чего-то стoим! kuklp@mail.ru
WM Z206653985942, R334086032478, U238399322728
 
Ответить
Сообщение
Do While Err.Number = 0
Err.Clear
строка Err.Clear не имеет смысла. В случае ошибки до нее не дойдет ход.

Автор - KuklP
Дата добавления - 13.03.2016 в 22:24
StoTisteg Дата: Воскресенье, 13.03.2016, 22:36 | Сообщение № 29
Группа: Авторы
Ранг: Ветеран
Сообщений: 541
Репутация: 45 ±
Замечаний: 0% ±

Excel 2010
Перестраховка ещё никому не вредила :)


Проверь всё. ThisWorkbook.Save. On Error Resume Next.
 
Ответить
СообщениеПерестраховка ещё никому не вредила :)

Автор - StoTisteg
Дата добавления - 13.03.2016 в 22:36
Leksa Дата: Понедельник, 14.03.2016, 09:34 | Сообщение № 30
Группа: Пользователи
Ранг: Новичок
Сообщений: 28
Репутация: 0 ±
Замечаний: 0% ±

Excel 2013
StoTisteg, на файле пример отрабатывает идеально, на файле где 192 строки система зависает и спасает только диспетчер. это не лечиться?
 
Ответить
СообщениеStoTisteg, на файле пример отрабатывает идеально, на файле где 192 строки система зависает и спасает только диспетчер. это не лечиться?

Автор - Leksa
Дата добавления - 14.03.2016 в 09:34
Leksa Дата: Понедельник, 14.03.2016, 09:36 | Сообщение № 31
Группа: Пользователи
Ранг: Новичок
Сообщений: 28
Репутация: 0 ±
Замечаний: 0% ±

Excel 2013
Pelena, на файле в 192 строки в поле Выполнено считает то что надо, а во втором столбце не корректно то на 1 больше то на 1 меньше и у одного пользователя аж в 3 задачи разница.
 
Ответить
СообщениеPelena, на файле в 192 строки в поле Выполнено считает то что надо, а во втором столбце не корректно то на 1 больше то на 1 меньше и у одного пользователя аж в 3 задачи разница.

Автор - Leksa
Дата добавления - 14.03.2016 в 09:36
Pelena Дата: Понедельник, 14.03.2016, 09:40 | Сообщение № 32
Группа: Модераторы
Ранг: Экселист
Сообщений: 9842
Репутация: 2252 ±
Замечаний: 0% ±

Excel 2010 & Mac Excel 2011
не корректно

Показывайте в файле


"Черт возьми, Холмс! Но как??!!"
ЯД 41001765434816
 
Ответить
Сообщение
не корректно

Показывайте в файле

Автор - Pelena
Дата добавления - 14.03.2016 в 09:40
KuklP Дата: Понедельник, 14.03.2016, 09:52 | Сообщение № 33
Группа: Проверенные
Ранг: Старожил
Сообщений: 1994
Репутация: 435 ±
Замечаний: 0% ±

Leksa, вы вариант в № 25 смотрели?


Ну, с НДС и мы чего-то стoим! kuklp@mail.ru
WM Z206653985942, R334086032478, U238399322728
 
Ответить
СообщениеLeksa, вы вариант в № 25 смотрели?

Автор - KuklP
Дата добавления - 14.03.2016 в 09:52
Leksa Дата: Понедельник, 14.03.2016, 11:53 | Сообщение № 34
Группа: Пользователи
Ранг: Новичок
Сообщений: 28
Репутация: 0 ±
Замечаний: 0% ±

Excel 2013
Pelena, не могу понять почему такая разница в отчете и считает ли он строку если № = пусто?
К сообщению приложен файл: 6801956.xlsx(42Kb)
 
Ответить
СообщениеPelena, не могу понять почему такая разница в отчете и считает ли он строку если № = пусто?

Автор - Leksa
Дата добавления - 14.03.2016 в 11:53
Leksa Дата: Понедельник, 14.03.2016, 11:55 | Сообщение № 35
Группа: Пользователи
Ранг: Новичок
Сообщений: 28
Репутация: 0 ±
Замечаний: 0% ±

Excel 2013
KuklP, да посмотрела формирует столбцы, но хотелось бы знать количество уникальных не выполненных задач.
 
Ответить
СообщениеKuklP, да посмотрела формирует столбцы, но хотелось бы знать количество уникальных не выполненных задач.

Автор - Leksa
Дата добавления - 14.03.2016 в 11:55
KuklP Дата: Понедельник, 14.03.2016, 12:03 | Сообщение № 36
Группа: Проверенные
Ранг: Старожил
Сообщений: 1994
Репутация: 435 ±
Замечаний: 0% ±

но хотелось бы знать количество
В смысле? А что там в 3-й столбец выводится по-Вашему? Впрочем, без разницы. Я трачу на Вас время, а потом еще должен клещами из Вас ответы вытягивать - это свинство. Бывайте.


Ну, с НДС и мы чего-то стoим! kuklp@mail.ru
WM Z206653985942, R334086032478, U238399322728
 
Ответить
Сообщение
но хотелось бы знать количество
В смысле? А что там в 3-й столбец выводится по-Вашему? Впрочем, без разницы. Я трачу на Вас время, а потом еще должен клещами из Вас ответы вытягивать - это свинство. Бывайте.

Автор - KuklP
Дата добавления - 14.03.2016 в 12:03
Leksa Дата: Понедельник, 14.03.2016, 12:26 | Сообщение № 37
Группа: Пользователи
Ранг: Новичок
Сообщений: 28
Репутация: 0 ±
Замечаний: 0% ±

Excel 2013
KuklP, вот примерно так работает у меня ваш макрос - я честно пытаюсь понять почему у меня так а не как Вас - поэтому реагирую не ежесекундно.
я понимаю, что скорее всего у вас сегодня плохое настроение и Вы решили назвать это свинством.
К сообщению приложен файл: 12.xlsm(51Kb)
 
Ответить
СообщениеKuklP, вот примерно так работает у меня ваш макрос - я честно пытаюсь понять почему у меня так а не как Вас - поэтому реагирую не ежесекундно.
я понимаю, что скорее всего у вас сегодня плохое настроение и Вы решили назвать это свинством.

Автор - Leksa
Дата добавления - 14.03.2016 в 12:26
Hugo Дата: Понедельник, 14.03.2016, 14:07 | Сообщение № 38
Группа: Друзья
Ранг: Участник клуба
Сообщений: 2653
Репутация: 597 ±
Замечаний: 0% ±

Потому что пример другой, в нём не заполнен первый столбец.


excel@nxt.ru
webmoney: E265281470651 R418926282008 Z422237915069
 
Ответить
СообщениеПотому что пример другой, в нём не заполнен первый столбец.

Автор - Hugo
Дата добавления - 14.03.2016 в 14:07
Pelena Дата: Понедельник, 14.03.2016, 15:08 | Сообщение № 39
Группа: Модераторы
Ранг: Экселист
Сообщений: 9842
Репутация: 2252 ±
Замечаний: 0% ±

Excel 2010 & Mac Excel 2011
разница в отчете

С доп. столбцом
К сообщению приложен файл: 4484374.xlsx(44Kb)


"Черт возьми, Холмс! Но как??!!"
ЯД 41001765434816
 
Ответить
Сообщение
разница в отчете

С доп. столбцом

Автор - Pelena
Дата добавления - 14.03.2016 в 15:08
Leksa Дата: Понедельник, 14.03.2016, 19:45 | Сообщение № 40
Группа: Пользователи
Ранг: Новичок
Сообщений: 28
Репутация: 0 ±
Замечаний: 0% ±

Excel 2013
Pelena, огромное спасибо! теперь работает! буду осваивать формулы массива)))
 
Ответить
СообщениеPelena, огромное спасибо! теперь работает! буду осваивать формулы массива)))

Автор - Leksa
Дата добавления - 14.03.2016 в 19:45
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Посчитать количество уникальных значений по двум столбцам. (Макросы/Sub)
Страница 2 из 2«12
Поиск:

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