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

Вход

Регистрация

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

 

= Мир MS Excel/Удаление строк с пустыми ячейками - Страница 2 - Мир MS Excel

Старая форма входа
  • Страница 2 из 3
  • «
  • 1
  • 2
  • 3
  • »
Модератор форума: китин, _Boroda_  
Удаление строк с пустыми ячейками
Rioran Дата: Среда, 25.06.2014, 13:14 | Сообщение № 21
Группа: Авторы
Ранг: Ветеран
Сообщений: 903
Репутация: 290 ±
Замечаний: 0% ±

Excel 2013
RAN, ох уж мне эти мяу-макросы, покоя не дают, будоражат ум =) Как работает строка ниже? Согласно моему шаблону, если сказал "если", будь добр использовать логическое сравнение. Шаблон рвать будем?))

[vba]
Код
If Len(Cells(i, 1)) Then
[/vba]

Для офиса младше 2007 [a65535] заменить на [A1048576].

SkyPro, точно надо увеличивать количество строк для более ранних офисов?


Роман, Москва, voronov_rv@mail.ru
Яндекс-Деньги: 41001312674279
 
Ответить
СообщениеRAN, ох уж мне эти мяу-макросы, покоя не дают, будоражат ум =) Как работает строка ниже? Согласно моему шаблону, если сказал "если", будь добр использовать логическое сравнение. Шаблон рвать будем?))

[vba]
Код
If Len(Cells(i, 1)) Then
[/vba]

Для офиса младше 2007 [a65535] заменить на [A1048576].

SkyPro, точно надо увеличивать количество строк для более ранних офисов?

Автор - Rioran
Дата добавления - 25.06.2014 в 13:14
SkyPro Дата: Среда, 25.06.2014, 13:22 | Сообщение № 22
Группа: Друзья
Ранг: Старожил
Сообщений: 1206
Репутация: 255 ±
Замечаний: 0% ±

2010
If Len(Cells(i, 1)) Then

Len("текст") даст либо положительное значение, что ВБА воспримет как True, либо 0, что воспримется, как False.
Та же запись может выглядеть вот так:
[vba]
Код
If Len(cells(i,1))>0 then
[/vba]

SkyPro, точно надо увеличивать количество строк для более ранних офисов?

Если в файле строк не больше 65 тысяч, то нет :)


skypro1111@gmail.com

Сообщение отредактировал SkyPro - Среда, 25.06.2014, 13:25
 
Ответить
Сообщение
If Len(Cells(i, 1)) Then

Len("текст") даст либо положительное значение, что ВБА воспримет как True, либо 0, что воспримется, как False.
Та же запись может выглядеть вот так:
[vba]
Код
If Len(cells(i,1))>0 then
[/vba]

SkyPro, точно надо увеличивать количество строк для более ранних офисов?

Если в файле строк не больше 65 тысяч, то нет :)

Автор - SkyPro
Дата добавления - 25.06.2014 в 13:22
Rioran Дата: Среда, 25.06.2014, 13:50 | Сообщение № 23
Группа: Авторы
Ранг: Ветеран
Сообщений: 903
Репутация: 290 ±
Замечаний: 0% ±

Excel 2013
SkyPro, пресвятая булева алгебра, из этого можно сделать целую кучу полезных выводов и применений...

Сделаем, как бы по школьному не звучало, проверочную работу.

[vba]
Код
Sub Autumn()

Dim X As Boolean

X = True: MsgBox X 'Shows "True"
X = False: MsgBox X 'Shows "False"
X = -1: MsgBox X 'Shows "True"
X = 0: MsgBox X 'Shows "False"
X = 1: MsgBox X 'Shows "True"

X = True: MsgBox X + X + X 'Shows -3

End Sub
[/vba]
Спасибо, теперь понял, как работает решение RAN и Ваше. Кроме одного момента - Union?


Роман, Москва, voronov_rv@mail.ru
Яндекс-Деньги: 41001312674279


Сообщение отредактировал Rioran - Среда, 25.06.2014, 13:51
 
Ответить
СообщениеSkyPro, пресвятая булева алгебра, из этого можно сделать целую кучу полезных выводов и применений...

Сделаем, как бы по школьному не звучало, проверочную работу.

[vba]
Код
Sub Autumn()

Dim X As Boolean

X = True: MsgBox X 'Shows "True"
X = False: MsgBox X 'Shows "False"
X = -1: MsgBox X 'Shows "True"
X = 0: MsgBox X 'Shows "False"
X = 1: MsgBox X 'Shows "True"

X = True: MsgBox X + X + X 'Shows -3

End Sub
[/vba]
Спасибо, теперь понял, как работает решение RAN и Ваше. Кроме одного момента - Union?

Автор - Rioran
Дата добавления - 25.06.2014 в 13:50
SkyPro Дата: Среда, 25.06.2014, 13:55 | Сообщение № 24
Группа: Друзья
Ранг: Старожил
Сообщений: 1206
Репутация: 255 ±
Замечаний: 0% ±

2010

обьединение диапазонов.


skypro1111@gmail.com
 
Ответить
Сообщение
обьединение диапазонов.

Автор - SkyPro
Дата добавления - 25.06.2014 в 13:55
Rioran Дата: Среда, 25.06.2014, 14:12 | Сообщение № 25
Группа: Авторы
Ранг: Ветеран
Сообщений: 903
Репутация: 290 ±
Замечаний: 0% ±

Excel 2013
SkyPro, я правильно понимаю, что Ваши макросы сначала собирают все пустые строки столбца в массивы, а потом происходит убой одним выстрелом?


Роман, Москва, voronov_rv@mail.ru
Яндекс-Деньги: 41001312674279
 
Ответить
СообщениеSkyPro, я правильно понимаю, что Ваши макросы сначала собирают все пустые строки столбца в массивы, а потом происходит убой одним выстрелом?

Автор - Rioran
Дата добавления - 25.06.2014 в 14:12
SkyPro Дата: Среда, 25.06.2014, 14:16 | Сообщение № 26
Группа: Друзья
Ранг: Старожил
Сообщений: 1206
Репутация: 255 ±
Замечаний: 0% ±

2010
Забирает в массив весь столбец (до последней заполненной ячейки). Сделано для ускорения на больших диапазонах.
Проходит по всему массиву и собирает все пустые ячейки в один диапазон, после чего "одним выстрелом" удаляет.


skypro1111@gmail.com
 
Ответить
СообщениеЗабирает в массив весь столбец (до последней заполненной ячейки). Сделано для ускорения на больших диапазонах.
Проходит по всему массиву и собирает все пустые ячейки в один диапазон, после чего "одним выстрелом" удаляет.

Автор - SkyPro
Дата добавления - 25.06.2014 в 14:16
ikki Дата: Среда, 25.06.2014, 16:11 | Сообщение № 27
Группа: Друзья
Ранг: Старожил
Сообщений: 1906
Репутация: 504 ±
Замечаний: 0% ±

Excel 2003, 2010
ограничение для Union по кол-ву несвязных диапазонов - то же самое, что и для SpecialCells.
кстати, оно достаточно большое. 8192, если быть точным.

модифицировать код для SpecialCells с учетом ограничения не так уж и сложно.
в любом случае, это будет многократно быстрее, чем тысячи Union'ов и уж, тем более, построчного удаления.


помощь по Excel и VBA
ikki@fxmail.ru, icq 592842413, skype alex.ikki
 
Ответить
Сообщениеограничение для Union по кол-ву несвязных диапазонов - то же самое, что и для SpecialCells.
кстати, оно достаточно большое. 8192, если быть точным.

модифицировать код для SpecialCells с учетом ограничения не так уж и сложно.
в любом случае, это будет многократно быстрее, чем тысячи Union'ов и уж, тем более, построчного удаления.

Автор - ikki
Дата добавления - 25.06.2014 в 16:11
SkyPro Дата: Среда, 25.06.2014, 16:12 | Сообщение № 28
Группа: Друзья
Ранг: Старожил
Сообщений: 1206
Репутация: 255 ±
Замечаний: 0% ±

2010
ограничение для Union

Спасибо, не знал.


skypro1111@gmail.com
 
Ответить
Сообщение
ограничение для Union

Спасибо, не знал.

Автор - SkyPro
Дата добавления - 25.06.2014 в 16:12
Rioran Дата: Среда, 25.06.2014, 16:40 | Сообщение № 29
Группа: Авторы
Ранг: Ветеран
Сообщений: 903
Репутация: 290 ±
Замечаний: 0% ±

Excel 2013
RAN, в твоём макросе мой 2010-й ругается на строку, мол, объект ему подавай:

[vba]
Код
If r Is Nothing Then
[/vba]


Роман, Москва, voronov_rv@mail.ru
Яндекс-Деньги: 41001312674279


Сообщение отредактировал Rioran - Среда, 25.06.2014, 16:40
 
Ответить
СообщениеRAN, в твоём макросе мой 2010-й ругается на строку, мол, объект ему подавай:

[vba]
Код
If r Is Nothing Then
[/vba]

Автор - Rioran
Дата добавления - 25.06.2014 в 16:40
Rioran Дата: Среда, 25.06.2014, 16:59 | Сообщение № 30
Группа: Авторы
Ранг: Ветеран
Сообщений: 903
Репутация: 290 ±
Замечаний: 0% ±

Excel 2013
Провёл "краш-тест" предложенных в теме кодов.

Каждый раз создавался столбец из 5000 ячеек, где каждая вторая ячейка пустая, остальные с единичками.

Лучший код предложил Ikki - уработал всё за секунду.

Код SkyPro отработал за 9 секунд, но отключение обновления экрана никак не отразилось на производительности в лучшую сторону.

Мой код из поста № 7, вдохновлённый некоторыми мыслями Ikki, отработал за 16 секунд, но "убийство" обновлений экрана сократило работу до 2-х секунд.

Пробовал запустить код SkyPro на 20'000 ячеек с половиной к удалению, но почувствовал себя так, словно запустил бесконечный цикл =) Прервал операцию. Интересно, почему так произошло... Если Union ограничен, то должно было выдать ошибку. Можете тоже потестить коды, генератор ячеек ниже:

[vba]
Код
Dim X As Long

For X = 1 To 5000
      If X * 0.5 <> Int(X * 0.5) Then Cells(X, 1).Value = 1 Else Cells(X, 1).Value = ""
Next X

End Sub
[/vba]


Роман, Москва, voronov_rv@mail.ru
Яндекс-Деньги: 41001312674279


Сообщение отредактировал Rioran - Среда, 25.06.2014, 17:12
 
Ответить
СообщениеПровёл "краш-тест" предложенных в теме кодов.

Каждый раз создавался столбец из 5000 ячеек, где каждая вторая ячейка пустая, остальные с единичками.

Лучший код предложил Ikki - уработал всё за секунду.

Код SkyPro отработал за 9 секунд, но отключение обновления экрана никак не отразилось на производительности в лучшую сторону.

Мой код из поста № 7, вдохновлённый некоторыми мыслями Ikki, отработал за 16 секунд, но "убийство" обновлений экрана сократило работу до 2-х секунд.

Пробовал запустить код SkyPro на 20'000 ячеек с половиной к удалению, но почувствовал себя так, словно запустил бесконечный цикл =) Прервал операцию. Интересно, почему так произошло... Если Union ограничен, то должно было выдать ошибку. Можете тоже потестить коды, генератор ячеек ниже:

[vba]
Код
Dim X As Long

For X = 1 To 5000
      If X * 0.5 <> Int(X * 0.5) Then Cells(X, 1).Value = 1 Else Cells(X, 1).Value = ""
Next X

End Sub
[/vba]

Автор - Rioran
Дата добавления - 25.06.2014 в 16:59
nilem Дата: Четверг, 26.06.2014, 09:49 | Сообщение № 31
Группа: Авторы
Ранг: Старожил
Сообщений: 1613
Репутация: 563 ±
Замечаний: 0% ±

Excel 2013, 2016
еще вариант (из этого)
[vba]
Код
Sub ertert()
On Error Resume Next
Application.ScreenUpdating = False
With Range("A1", Cells(Rows.Count, 1).End(xlUp))
      .Sort Key1:=.Cells(1), Order1:=xlAscending
      .SpecialCells(4).EntireRow.Delete
      .Parent.UsedRange
End With
Application.ScreenUpdating = True
End Sub
[/vba]


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

Сообщение отредактировал nilem - Четверг, 26.06.2014, 09:51
 
Ответить
Сообщениееще вариант (из этого)
[vba]
Код
Sub ertert()
On Error Resume Next
Application.ScreenUpdating = False
With Range("A1", Cells(Rows.Count, 1).End(xlUp))
      .Sort Key1:=.Cells(1), Order1:=xlAscending
      .SpecialCells(4).EntireRow.Delete
      .Parent.UsedRange
End With
Application.ScreenUpdating = True
End Sub
[/vba]

Автор - nilem
Дата добавления - 26.06.2014 в 09:49
ikki Дата: Четверг, 26.06.2014, 11:24 | Сообщение № 32
Группа: Друзья
Ранг: Старожил
Сообщений: 1906
Репутация: 504 ±
Замечаний: 0% ±

Excel 2003, 2010
обещанная модификация макроса с учетом:
- ограничений по кол-ву несвязных диапазонов;
- "подлого" свойства SpecialCells, упомянутого Алексеем (Alex_ST).

[vba]
Код
Sub delrow()
     Const nBlock = 10
     On Error Resume Next
     With Sheets(1)
         lr = .Cells(.Rows.Count, 1).End(xlUp).Row: i = lr + 1: n = nBlock
         Do While i > 2
             If i > nBlock + 1 Then i = i - nBlock Else n = i - 2: i = 2
             If n = 1 Then
                 If Len(.Cells(i, 1)) = 0 Then .Rows(i).Delete
             Else
                 .Cells(i, 1).Resize(n).SpecialCells(4).EntireRow.Delete
             End If
         Loop
     End With
End Sub
[/vba]

значение nBlock нужно изменить.
с учетом худшего варианта (пустые ячейки располагаются через одну) - не более 16384


помощь по Excel и VBA
ikki@fxmail.ru, icq 592842413, skype alex.ikki
 
Ответить
Сообщениеобещанная модификация макроса с учетом:
- ограничений по кол-ву несвязных диапазонов;
- "подлого" свойства SpecialCells, упомянутого Алексеем (Alex_ST).

[vba]
Код
Sub delrow()
     Const nBlock = 10
     On Error Resume Next
     With Sheets(1)
         lr = .Cells(.Rows.Count, 1).End(xlUp).Row: i = lr + 1: n = nBlock
         Do While i > 2
             If i > nBlock + 1 Then i = i - nBlock Else n = i - 2: i = 2
             If n = 1 Then
                 If Len(.Cells(i, 1)) = 0 Then .Rows(i).Delete
             Else
                 .Cells(i, 1).Resize(n).SpecialCells(4).EntireRow.Delete
             End If
         Loop
     End With
End Sub
[/vba]

значение nBlock нужно изменить.
с учетом худшего варианта (пустые ячейки располагаются через одну) - не более 16384

Автор - ikki
Дата добавления - 26.06.2014 в 11:24
Rioran Дата: Четверг, 26.06.2014, 13:15 | Сообщение № 33
Группа: Авторы
Ранг: Ветеран
Сообщений: 903
Репутация: 290 ±
Замечаний: 0% ±

Excel 2013
ikki, опиши, пожалуйста, на словах логику - что делает твой алгоритм и на что нужно менять значение nBlock?


Роман, Москва, voronov_rv@mail.ru
Яндекс-Деньги: 41001312674279
 
Ответить
Сообщениеikki, опиши, пожалуйста, на словах логику - что делает твой алгоритм и на что нужно менять значение nBlock?

Автор - Rioran
Дата добавления - 26.06.2014 в 13:15
Rioran Дата: Четверг, 26.06.2014, 13:21 | Сообщение № 34
Группа: Авторы
Ранг: Ветеран
Сообщений: 903
Репутация: 290 ±
Замечаний: 0% ±

Excel 2013
nilem, интересный пример, но код вносит коррективы в организацию данных, что не всегда welcome.


Роман, Москва, voronov_rv@mail.ru
Яндекс-Деньги: 41001312674279
 
Ответить
Сообщениеnilem, интересный пример, но код вносит коррективы в организацию данных, что не всегда welcome.

Автор - Rioran
Дата добавления - 26.06.2014 в 13:21
ikki Дата: Четверг, 26.06.2014, 13:23 | Сообщение № 35
Группа: Друзья
Ранг: Старожил
Сообщений: 1906
Репутация: 504 ±
Замечаний: 0% ±

Excel 2003, 2010
удаляет строки (в соответствии с постановкой задачи в текущей теме).
блоками.
в каждом блоке сначала проверяет - не равен ли его размер единице и тогда просто проверяет значение в ячейке
если больше единицы - в текущем блоке пользуемся SpecialCells(4) и, если пустые ячейки найдутся, удаляем для них строки целиком
если не найдутся - сработает обработка ошибок и мы просто перейдём к следующему блоку.

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


помощь по Excel и VBA
ikki@fxmail.ru, icq 592842413, skype alex.ikki
 
Ответить
Сообщениеудаляет строки (в соответствии с постановкой задачи в текущей теме).
блоками.
в каждом блоке сначала проверяет - не равен ли его размер единице и тогда просто проверяет значение в ячейке
если больше единицы - в текущем блоке пользуемся SpecialCells(4) и, если пустые ячейки найдутся, удаляем для них строки целиком
если не найдутся - сработает обработка ошибок и мы просто перейдём к следующему блоку.

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

Автор - ikki
Дата добавления - 26.06.2014 в 13:23
ikki Дата: Суббота, 28.06.2014, 02:18 | Сообщение № 36
Группа: Друзья
Ранг: Старожил
Сообщений: 1906
Репутация: 504 ±
Замечаний: 0% ±

Excel 2003, 2010
ограничение для Union по кол-ву несвязных диапазонов - то же самое, что и для SpecialCells. кстати, оно достаточно большое. 8192, если быть точным.
на официальном сайте разработчика для версии 2013 написано:
Цитата
Количество независимых ячеек, которые можно выделить 2 147 483 648 ячеек
кто может проверить?


помощь по Excel и VBA
ikki@fxmail.ru, icq 592842413, skype alex.ikki
 
Ответить
Сообщение
ограничение для Union по кол-ву несвязных диапазонов - то же самое, что и для SpecialCells. кстати, оно достаточно большое. 8192, если быть точным.
на официальном сайте разработчика для версии 2013 написано:
Цитата
Количество независимых ячеек, которые можно выделить 2 147 483 648 ячеек
кто может проверить?

Автор - ikki
Дата добавления - 28.06.2014 в 02:18
force Дата: Воскресенье, 31.08.2014, 13:24 | Сообщение № 37
Группа: Пользователи
Ранг: Новичок
Сообщений: 42
Репутация: 1 ±
Замечаний: 0% ±

Excel 2010
SkyPro, отличный вариант, универсальный... thumb

[vba]
Код
Sub deleteEmptyRows()
Dim x, i&, delRa As Range
x = Range("A1:A" & [a65535].End(xlUp).Row).Value
      For i = 1 To UBound(x)
          If x(i, 1) = "" Then
              If delRa Is Nothing Then
                  Set delRa = Cells(i, 1)
              Else
                  Set delRa = Union(Cells(i, 1), delRa)
              End If
          End If
      Next
If Not delRa Is Nothing Then delRa.EntireRow.Delete
End Sub
[/vba]

То что я искал.


Сообщение отредактировал force - Воскресенье, 31.08.2014, 13:29
 
Ответить
СообщениеSkyPro, отличный вариант, универсальный... thumb

[vba]
Код
Sub deleteEmptyRows()
Dim x, i&, delRa As Range
x = Range("A1:A" & [a65535].End(xlUp).Row).Value
      For i = 1 To UBound(x)
          If x(i, 1) = "" Then
              If delRa Is Nothing Then
                  Set delRa = Cells(i, 1)
              Else
                  Set delRa = Union(Cells(i, 1), delRa)
              End If
          End If
      Next
If Not delRa Is Nothing Then delRa.EntireRow.Delete
End Sub
[/vba]

То что я искал.

Автор - force
Дата добавления - 31.08.2014 в 13:24
Rioran Дата: Понедельник, 01.09.2014, 10:30 | Сообщение № 38
Группа: Авторы
Ранг: Ветеран
Сообщений: 903
Репутация: 290 ±
Замечаний: 0% ±

Excel 2013
x = Range("A1:A" & [a65535].End(xlUp).Row).Value

[offtop]Что за расизм по отношению к другим версиям Excel? =)[/offtop]


Роман, Москва, voronov_rv@mail.ru
Яндекс-Деньги: 41001312674279
 
Ответить
Сообщение
x = Range("A1:A" & [a65535].End(xlUp).Row).Value

[offtop]Что за расизм по отношению к другим версиям Excel? =)[/offtop]

Автор - Rioran
Дата добавления - 01.09.2014 в 10:30
Alex_ST Дата: Вторник, 02.09.2014, 09:19 | Сообщение № 39
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3211
Репутация: 609 ±
Замечаний: 0% ±

2003
Что за расизм по отношению к другим версиям Excel? =)
Ну, тогда замените [vba]
Код
[a65535]
[/vba] на [vba]
Код
Range("A" & Rows.Count)
[/vba]



С уважением,
Алексей
MS Excel 2003 - the best!!!
 
Ответить
Сообщение
Что за расизм по отношению к другим версиям Excel? =)
Ну, тогда замените [vba]
Код
[a65535]
[/vba] на [vba]
Код
Range("A" & Rows.Count)
[/vba]

Автор - Alex_ST
Дата добавления - 02.09.2014 в 09:19
Railord Дата: Вторник, 28.10.2014, 22:44 | Сообщение № 40
Группа: Пользователи
Ранг: Новичок
Сообщений: 45
Репутация: 0 ±
Замечаний: 0% ±

Excel 2010
Вечер добрый форумчане!
Хотел адаптировать код из сообщения №20 под свои нужды, но не понял, что происходит в цикле:
[vba]
Код
For i = 1 To UBound(x)
          If x(i, 1) = "" Then
              If delRa Is Nothing Then
                  Set delRa = Cells(i, 1)
              Else
                  Set delRa = Union(Cells(i, 1), delRa)
              End If
          End If
      Next
If Not delRa Is Nothing Then delRa.EntireRow.Delete
End Sub
[/vba]
А именно - delRa ведь пустой и после первого прохождения цикла он заполняется диапазоном из "x" - ведь так? а потом, что происходит после Else? Union как он срабатывает? почему не записать сразу после Then [vba]
Код
Set delRa = Union(Cells(i, 1), Cells(i, 1))
[/vba]
Разве"Union(Cells(i, 1), delRa)" не равно "Union(Cells(i, 1), Cells(i, 1))"


Nil novi sub luna, так что - век живи, век учись!)

Сообщение отредактировал Railord - Вторник, 28.10.2014, 22:46
 
Ответить
СообщениеВечер добрый форумчане!
Хотел адаптировать код из сообщения №20 под свои нужды, но не понял, что происходит в цикле:
[vba]
Код
For i = 1 To UBound(x)
          If x(i, 1) = "" Then
              If delRa Is Nothing Then
                  Set delRa = Cells(i, 1)
              Else
                  Set delRa = Union(Cells(i, 1), delRa)
              End If
          End If
      Next
If Not delRa Is Nothing Then delRa.EntireRow.Delete
End Sub
[/vba]
А именно - delRa ведь пустой и после первого прохождения цикла он заполняется диапазоном из "x" - ведь так? а потом, что происходит после Else? Union как он срабатывает? почему не записать сразу после Then [vba]
Код
Set delRa = Union(Cells(i, 1), Cells(i, 1))
[/vba]
Разве"Union(Cells(i, 1), delRa)" не равно "Union(Cells(i, 1), Cells(i, 1))"

Автор - Railord
Дата добавления - 28.10.2014 в 22:44
  • Страница 2 из 3
  • «
  • 1
  • 2
  • 3
  • »
Поиск:

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