Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Excel VBA (часть 3)

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213

Открыть новую тему     Написать ответ в эту тему

ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

 
 
Обсуждаем вопросы только по Excel VBA
(программирование макросов, скриптов, пользовательских функций и т.п.).
Приветствуются ссылки на ресурсы и справочную литературу по теме.
 
Вопросы по работе с MS Excel, не относящиеся к программированию, задаем в теме Excel FAQ

 
Обратите внимание, этот топик для помощи в изучении и использовании VBA. Посему запросы типа "Напишите мне такой-то макрос, я VBA не знаю и знать не хочу" не приветствуются.
Древняя мудрость: "Накорми голодного рыбой и он погибнет, научи его ловить рыбу и ты спасешь его."(R)
 
Предыдущие ветки топика: Часть 1, Часть 2
 
Информация общего характера:
  • Список соответствия имен функций в английской и русской версиях Excel
  • Описание Microsoft Excel File Format (eng.)
     
    Рекомендации:
    Если у Вас есть проблема, не решаемая стандартными средствами Excel (об этом можно уточнить здесь) или требующая автоматизации, попробуйте для начала записать макрос самим Excel через меню Сервис (Tools) - Макрос (Macro) - Начать запись (Record New Macro). Подробнее здесь. В большинстве случаев получившийся код (Сервис-Макрос-Макросы-Изменить) Вас не удовлетворит, но подскажет, какие объекты-методы-свойства использовать.  
    Другой Ваш помощник - Просмотр объектов (Object Browser). Ну и встроення помощь (F1), естественно.
     
    Если Вы в тупике, покажите Ваш код (или часть кода) здесь.  Если вылазит ошибка, цитируйте ее полностью. Если код слишком большой, используйте тeг [more].
    Используйте отладчик - Breakpoints (F9), Watches (Shift-F9), Steps (F8 и др.) Сильно облегчает поиск ошибок.

     
    Рекомендуется к прочтению:
  • Первые шаги с Excel VBA
  • Excel VBA: Приёмы программирования
  • WinApi. Лекция из курса "Основы офисного программирования и язык VBA" (для продвинутых)
  • Daily Dose of Excel (eng.) - тематический блог: советы по работе с Excel и прочие материалы
  • Excel Macros & Excel VBA Code Tips, Tricks (eng.) - советы, трюки и уловки
  • Mr. Excel (forum) (eng.) - весьма оживленный форум по Excel&VBA.
  • Приемы, хитрости, трюки и нюансы работы в Microsoft Excel - сайт "Планета Excel", целиком посвященный Excel и всему, что с ним связано.
  • Microsoft Excel: Таблицы и VBA. Справочник. Вопросы и Ответы. Советы. Примеры.  
     
    Родственные топики:
  • Вопросы по работе с MS Excel - Excel FAQ - часть 1, часть 2, часть 3
  • Технические проблемы с MS Office 2003 или Office XP.
  • Word VBA все вопросы по Word VBA туда
  • Access все вопросы по программированию в Access туда
  • Книжульки по VBA - книги по программированию с использованием VBA
     
    Конкретные вопросы:
    Форма-заставка
    Как запустить макрос при изменении положения курсора или значения ячейки
  • Пример 1
  • Пример 2
  • Пример 3 (проверка области)
  • Пример 4
  • Пример 5
    Зацикливание в функции Change или SelectionChange
     
    Ранжирование без пробелов (макрос включает функции сортировки массива и удаления дубликатов, работает и в Excel 2007)
  • под Office 97
     
    Добавление в главное меню своего пункта, ассоциированного с макросом
    Создание ярлыка на рабочем столе
    Снятие защиты листа при забытом пароле
    Смена раскладки клавиатуры
    Скролл формы колесом прокрутки мыши
    Оптимизация кода по быстродействию использованием массивов
    Найти "чужое" окно и нажать в нем кнопку (вписать текст в текстовое поле)
    Работа с UNICODE-символами в VBA: запись, чтение из ячейки, перевод в ASС и обратно
    Как программно подключить дополнительные библиотеки (например, "Microsoft Scripting Runtime" или "Microsoft ActiveX Data Objects 2.8 Library) через References
     
    Перечень основных ColorIndex'ов из MSDN
     

    Смежные темы:
    Программы » Microsoft Office 2019 & 365 | 2016 | 2013 | 2010 | 2007 | 2003
    Программы » OneNote | Outlook 2013 & 2016 & 2019 | Outlook 2010 | Microsoft Mathematics & Math Solver
    Программы » Word FAQ | Excel FAQ | Access FAQ
    Прикладное программирование » Word VBA | Access VBA  
    Андеграунд » Microsoft Office 2019 | 2016 | 2013 | 2010 | 2007 | 2003
    Андеграунд » OneNote | Visio | SharePoint Server | Project Server | Exchange Server
    Андеграунд » Надстройки (add-ins) и коммерческие макросы Excel
    Андеграунд » Самостоятельная сборка дистрибутивов Оffice 2007/2010/2013/2016 | MUI для Office 2007

  • Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 10:16 11-01-2010 | Исправлено: ALeXkRU, 16:42 03-08-2021
    SAS888

    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    urodliv

    Цитата:
    Есть куча однотипных файлов. Из определённых ячеек тягаю данные и составляю из них список

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

    Всего записей: 398 | Зарегистр. 31-10-2007 | Отправлено: 07:44 06-03-2011
    urodliv



    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

    Цитата:
    то Вашу задачу можно решить и вовсе не открывая файлы-источники.

    Во-во! Это было бы самым лучшим вариантом. Ибо на одну из граблей я уже наступил.

    Цитата:
    Если кроме пути и имени книг (я так понял, что они находятся в Вашем списке)

    Не, списка как такового нет. Есть файловое дерево каталогов. Вот обходя его и составляется список.
    Цитата:
    известны имена листов, из которых нужно получить данные

    Известны абсолютно достоверно: во всех файлах из 37000 штук они называются "Лист 1". Как это не оригинально...

    Цитата:
    а также адреса требуемых ячеек

    Тут загвоздка. В файлах до 2006 года они в одних ячейках, а после - смещены на две строки вниз. Но если файлы обрабатывать не скопом, а частями, то можно считать, то адреса ячеек тоже известны.
     
     
    Добавлено:
    JekG
    Джек, Вам за подсказку большое спасибо.


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

    Всего записей: 6689 | Зарегистр. 29-04-2009 | Отправлено: 19:31 06-03-2011
    Kalifaks



    BANNED
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Если кому интересно, мне помогли таким элегантным решением:

    Код:
     
    Dim shF As String, shL As String
    shF = Worksheets(2).Name
    shL = Worksheets(Worksheets.Count).Name
    Лист1.[a1].Formula = "=sum(" & shF & ":" & shL & "!A1)"
     

    Всего записей: 33 | Зарегистр. 25-09-2010 | Отправлено: 23:01 06-03-2011
    SAS888

    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    urodliv
    К сожалению, без примера файлов точный ответ дать невозможно.
    Предлагаемый пример, извлечет из всех файлов, находящихся в указанной папке значения из ячейки "A5" листа "Лист1" и поместит их последовательно в столбец "A" активного листа.
    Доработайте "под себя". Организуйте циклы по требуемым файлам и ячейкам. Также, укажите куда помещать полученные из закрытых файлов значения. Надеюсь, что данного пример будет достаточно. Возникнут трудности - обращайтесь.

    Код:
    Sub Main()
        Dim p As String, f As String, s As String, arg As String
        Application.ScreenUpdating = False: [A:A].ClearContents
        p = "C:\Temp\"  'Путь к папке с файлами
        s = "Лист1"     'Имя листа
        f = Dir(p & "*xls")
        Do While f <> ""
            arg = "'" & p & "[" & f & "]" & s & "'!" & [A5].Range("A1").Address(, , xlR1C1)
            Cells(Rows.Count, 1).End(xlUp).Offset(1) = ExecuteExcel4Macro(arg): f = Dir
        Loop
    End Sub

    Всего записей: 398 | Зарегистр. 31-10-2007 | Отправлено: 09:46 07-03-2011
    surgutfred



    Full Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Подскажите такой вопрос.
    Выгрузка отчета из Грандсметы в EXCEL. Числа выгружаются в формате "Общий" да еще и с пробелами. Типа этого "232 737,00" . Соответственно дальше эти цифры в расчете не участвуют (из-за пробелов). Я конечно знаю как убрать пробелы replace вопрос не в этом.
    Я сделал обработку, когда я могу привязаться к таблице и знаю где эти цифры. Так пользователь теперь хочет универсальную обработку. Что бы открыл файл нажал макрос и все цифры в нужном формате. Т.е. цифры в любом месте файла. Как отделить зерна от плевел? Цифры от текста? Если все ячейки в общем формате, а цифры с пробелами. Я если я напущу просто везде убирать пробелы - текст покоцается. Есть варианты? Или бесполезно?
    таблица примерно такая
     
     
    Так, вроде начало получаться с использованием isnumeric, пошел копать....

    Всего записей: 589 | Зарегистр. 21-08-2001 | Отправлено: 12:10 10-03-2011 | Исправлено: surgutfred, 12:33 10-03-2011
    SAS888

    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    surgutfred
    Я, конечно, понимаю, что перебирая и анализируя каждую ячейку UsedRange, можно сделать все, что требуется. Но, это долгий и неблагодарный путь. Можно поступить так:
    1. Запомнить весь UsedRange.
    2. Убрать все пробелы.
    3. Определить ячейки, которые после всего этого будут содержать числовые константы.
    4. Восстановить "первоначальный" вид UsedRange.
    5. Убрать все пробелы в определенном нами диапазоне.
    6. Установить формат всех ячеек как "Общий".
     
    По-моему, так будет существенно быстрее и рациональнее. Макрос не будет содержать ни единого цикла и будет выглядеть примерно так (для активного листа):

    Код:
    Sub Main()
        Dim x As Range, y As Range, a(): Application.ScreenUpdating = False
        Set x = ActiveSheet.UsedRange: a = x.Value: x.Replace " ", ""
        Set y = x.SpecialCells(xlCellTypeConstants, xlNumbers)
        x.Value = a: y.Replace " ", "": x.NumberFormat = "General"
    End Sub  

    Всего записей: 398 | Зарегистр. 31-10-2007 | Отправлено: 13:36 10-03-2011 | Исправлено: SAS888, 13:39 10-03-2011
    surgutfred



    Full Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору

    Цитата:
    По-моему, так будет существенно быстрее и рациональнее. Макрос не будет содержать ни единого цикла и будет выглядеть примерно так (для активного листа):
     
    Код:
    Sub Main()
        Dim x As Range, y As Range, a(): Application.ScreenUpdating = False
        Set x = ActiveSheet.UsedRange: a = x.Value: x.Replace " ", ""
        Set y = x.SpecialCells(xlCellTypeConstants, xlNumbers)
        x.Value = a: y.Replace " ", "": x.NumberFormat = "General"
    End Sub  
     

    Что то у меня ничего не происходит после применения данного кода, как было все с пробелами так и осталось.
    Вот к примеру файл с таблицей
    В качестве отслеживания изменений пусть ячейка G40
     

    Цитата:
    6. Установить формат всех ячеек как "Общий".

    Не надо устанавливать в конце общий, он изначально общий стоит.

    Всего записей: 589 | Зарегистр. 21-08-2001 | Отправлено: 14:06 10-03-2011
    asbo

    BANNED
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    surgutfred
    Странно, что часть чисел с пробелами, часть нет...  
    А что Вы собираетесь делать с ячейками, где по две цифири? Типа E28:J28?  
    А с такими зверями, как E174? E81?  
    Тут надо решать вопрос на стадии экспорта из ГС в Excel, если таковое возможно. Т.е. убрать все красивости из форматирования чисел.  
     
    Добавлено:
    Если бы не поставленные выше вопросы, то простым перебором ячеек по критерию наличия в них символов, отличных от цифирь и разделителей (запятая, точка, апостроф, пробел) отделить зерна от плевел, в зернах убрать пробелы и апострофы, заменив запятую (или что там может быть) на системный десятичный разделитель. А в примере ведь - то запятая, то точка....  
     
    Приговор: надо смотреть в сторону настройки экспорта из ГС.

    Всего записей: 1805 | Зарегистр. 03-10-2006 | Отправлено: 15:07 10-03-2011 | Исправлено: asbo, 15:21 10-03-2011
    TuvanMAN

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Привет всем!!!
     
    Помогите ребята доделать лабу!!! Мозги ваще кипят!!!
    Есть исходный пример лабы и есть моя!!!
    Осталось всего там половина, вот по части VBA никак не допер (извините за выражение)!
    Хотя бы советы!
     
    пример
    доработка

    Всего записей: 23 | Зарегистр. 28-09-2010 | Отправлено: 17:50 10-03-2011 | Исправлено: TuvanMAN, 17:53 10-03-2011
    KF121



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    TuvanMAN
    Свормулируйте четко что именно не получается. какова задача.

    Всего записей: 170 | Зарегистр. 24-05-2006 | Отправлено: 18:30 10-03-2011
    TuvanMAN

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    KF121
     
    задача сделать точно также как в примере!!!
    не получается:
    - как кнопочку запуск VBA приложения сделать, ну чтобы выходила юсерформа
    - как на юсерформе сделать странички или вкладки! ну на пример все есть!!!

    Всего записей: 23 | Зарегистр. 28-09-2010 | Отправлено: 18:46 10-03-2011
    KF121



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    В обработчике кнопочки написать  
    Userform1.Show, ну или как у вас там форма называется. чтобы закрыть форму, делаем кнопочку на форме со следующим кодом
    Unload Me

    Всего записей: 170 | Зарегистр. 24-05-2006 | Отправлено: 19:13 10-03-2011
    SAS888

    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    surgutfred
    Предложенный мной макрос, по Вашей просьбе, убирает пробелы во всех ячейках, в которых отсутствуют буквы и возвращает в эти ячейки полученные числовые значения.
    На самом же деле, как выяснилось из Вашего примера, задача не в этом.
    Сформулируйте точные требования:  
    1. Что делать с ячейками, содержащими по 2 числа?
    2. Что принимать за разделитель целой и дробной части?
    3. Что делать с ячейками, которые содержат значения типа  
    "___________________________345495,786" ?

    Всего записей: 398 | Зарегистр. 31-10-2007 | Отправлено: 05:42 11-03-2011
    surgutfred



    Full Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору

    Цитата:
    Приговор: надо смотреть в сторону настройки экспорта из ГС.  

    Я бы с удовольствием, но там надо просто рисовать свой шаблон выгрузки, разбираться с их формулами и т.д. И этим мне конечно придется заняться, но тут организационные моменты(для работы с ГС нужон ключ, а он денежку хорошую стоить, и асушнику "жирно" отдельный ключ покупать)
     

    Цитата:
    Сформулируйте точные требования:  

    Если бы мне юзер сформулировал что хочет
    А так сказал "Хочу нажать кнопку и ляпота! "
    Вообще я скажем так хотел просто некий принцип обработки получить, а эти "нюансы" уж потом напильником бы доработал....
     
    Перебором нарисовал(опять же пока без нюансов), хорошо что файлы не большие, но конечно понимаю, что это не есть гуд. Лаконичный вариант от SAS888 меня конечно больше прельщает, осталось его разжевать для себя, и "натянуть" на свои примеры.
     
    Буду ковырять...
     

    Всего записей: 589 | Зарегистр. 21-08-2001 | Отправлено: 06:33 11-03-2011
    SAS888

    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    surgutfred

    Цитата:
    ...осталось его разжевать для себя...

    Т.е. Вы все-таки знаете, что Вам нужно, но не хотите говорить?
    А мой вариант Вам не подойдет. Во-первых, у Вас в ячейках с цифрами, в отличие от ячеек с текстом не обычный пробел, а неразрывный. Поэтому весь мой макрос можно заменить одной строкой:
    Код:
    ActiveSheet.UsedRange.Replace Chr(160), ""

    Во-вторых, из-за большого количества объединенных ячеек, а также, большого количества ячеек, содержащих по два значения, разделенных символом переноса строки, без обработки свойств ячейки не обойтись. Поэтому, все равно понадобиться перебирать все ячейки в цикле.
    Если бы Вы ответили, что нужно делать с ячейками в которых по 2 значения, то давно уже получили бы ответ.

    Всего записей: 398 | Зарегистр. 31-10-2007 | Отправлено: 07:23 11-03-2011 | Исправлено: SAS888, 07:23 11-03-2011
    asbo

    BANNED
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    SAS888
    Было бы вполне комильфо и сенкс за постановочку сказать :)
     
    Суть вопроса была не закодить Replace(это-то на то-то), а отделить зерна от плевел - т.е. формализовав интеллект правильно определить пару "это-то - то-то" и исполнить Replace в нужном месте и не исполнять в ненужном.
     
    Гарантии, что неразрывный пробел в качестве разделителя разрядов не изменится на апостроф или запятую нет. Поэтому надо выделить именно _разделитель_разрядов_, а не Chr(160)...  
     
    Добавлено:
    surgutfred
    "Оргмоменты" - это понятно... Могу ошибаться, давно дело было, но этот функционал был доступен и в через-колено-ломаной ГС :)
     
    Бзв, не забывайте о нетленном Вергилии: Quidquid id est, timeo Danaos et dona ferentes!...
    ... и когда Вам в очередной раз подскажут сделать "Application.ScreenUpdating = False", не забудьте от себя, в конце кода добавить отбой тревоги.

    Всего записей: 1805 | Зарегистр. 03-10-2006 | Отправлено: 07:56 11-03-2011
    surgutfred



    Full Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору

    Цитата:
    через-колено-ломаной ГС  
    максимум 4й версии видел, а боевая 5.1 уже
    Да и контора наша не приемлет ломаный софт, тут не жмотятся, вплоть до winrar все куплено.

    Всего записей: 589 | Зарегистр. 21-08-2001 | Отправлено: 12:03 11-03-2011
    asbo

    BANNED
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    [off]

    Цитата:
    ... организационные моменты(для работы с ГС нужон ключ, а он денежку хорошую стоить, и асушнику "жирно" отдельный ключ покупать)...  

    Трудно было понять по другому :) Пусть уж тады разберутся - или "жирно", или "не жмотятся". Как в Иван Васильиче? "Так покупай!..."
    [/off]

    Всего записей: 1805 | Зарегистр. 03-10-2006 | Отправлено: 12:53 11-03-2011
    andrewkard1980

    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Добрый день!
    Уважаемые программисты. Есть вопрос к Вам. Мне нужно реализовать поиск значений массива в тексте и если находит - то присвоение найденного значения переменной.
     
    Например массив:
    arr={"капуста", "морковь","свекла"}
     
    потом с сайта я вытаскиваю объявления
     
    z = Split(htmlcode, "tblAdvert")
    For i1 = 1 To UBound(z)
    z1 = z(i1)
     
    и в z1 у меня проходят объявления, в них нужен поиск значений из массива arr и если есть, то присвоение найденного значения z2
     
    Например:
    i1=1
    z1="Продается капуста, 100 руб./кг., тел..."
    z2="капуста"
    і1=2
    z1="Продам морковь...."
    z2="морковь"
     
    Cпасибо за помощь.
     
     
     

    Всего записей: 209 | Зарегистр. 01-05-2010 | Отправлено: 11:21 12-03-2011
    asbo

    BANNED
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    В общем случае:

    Код:
     
    For i = 1 to m ' around all of adverts z1$()
        For k = 1 to n ' around all of keywords arr$()
            If InStr(1, arr(k), z1(i)) > 0 Then z2 = arr(k)
        Next ' k
    Next ' i
     

    Всего записей: 1805 | Зарегистр. 03-10-2006 | Отправлено: 12:47 12-03-2011 | Исправлено: asbo, 12:47 12-03-2011
    Открыть новую тему     Написать ответ в эту тему

    Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213

    Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Excel VBA (часть 3)


    Реклама на форуме Ru.Board.

    Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
    Modified by Ru.B0ard
    © Ru.B0ard 2000-2024

    BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

    Рейтинг.ru