Статьи из блога

Зеркальное отображение текста

Начиная с версии 6 в VBA появилась команда strReverce, предоставляющая возможность отзеркаливать символы. Например, слово ЖУК после выполнения следующего макроса будет выглядеть как КУЖ.

Sub reverse()
'Замена выделенного фрагмента текста на его 
'зеркальное отображение
Dim strStroka As String
Dim strRev As String
   strStroka = Selection.Text
   strRev = strReverse(strStroka)
   Selection.Text = Replace(strStroka, strStroka, strRev)
End Sub

Как использовать: выделите текст и выполните макрос.

 

Обновление: в комментариях приведен более продвинутый макрос для этого действия.

twitter.com facebook.com vkontakte.ru odnoklassniki.ru mail.ru ya.ru rutvit.ru myspace.com technorati.com digg.com friendfeed.com pikabu.ru blogger.com liveinternet.ru livejournal.ru memori.ru google.com bobrdobr.ru mister-wong.ru yahoo.com yandex.ru del.icio.us

Еще записи по вопросам использования Microsoft Word:

Комментариев: 26

  1. Питание
    15.11.2007 в 16:51 | #1

    Странная функия... я вот думал-думал над тем, где ее можно применить... так и не придумал ничего, может кто-то подскажет?

  2. 15.11.2007 в 16:57 | #2

    Меня однажды спрашивали о возможности сделать зеркальное отображение текста на VBA, но я не нашел в то время ответа. И вот буквально недавно узнал об этой функции, поэтому и написал эту заметку.

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

  3. Илья
    04.05.2008 в 02:07 | #3

    Здравствуйте,

    уважаемый Антон Кокин

    Если использовать этот макрос то из предложения

    Привет, день пришел. _имеем_ .леширп ьнед ,тевирП

    Возможно ли чтобы переворачивались только слова в предложении но при этом сами слова оставались на своих местах.

    Вот так_ тевирП, ьнед .леширп

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

  4. 04.05.2008 в 11:46 | #4

    Здравствуйте Илья.

    Вот код, который мне подсказали на форуме Программирование на Visual Basic, VB 6.0, VBA, VB.net:

    Sub reverse2()
    Dim myArr() As String
    Dim i As Integer
    Dim sStr As String
    Dim strRev As String
    sStr = Selection.Text
    myArr = Split(sStr) 'устанавливаем массив элементов выделенной строки
    For i = 0 To UBound(myArr)   'запускаем цикл обработки каждого элемента в массиве (от 0 до последнего элемента)
       strRev = strRev & StrReverse(myArr(i)) & " "
    Next i
    Selection.Text = Trim(strRev)
    End Sub

    Однако, при использовании этого макроса никуда не деться от знаков препинания. Они привязаны к словам. Увы...

  5. Илья
    05.05.2008 в 03:27 | #5

    Здравствуйте,

    Антон Кокин

    Спасибо за ответ и предложенный макрос. То, что знаки препинания привязаны к словам, это здорово, хотя их и можно, до преобразования, отделить от слов пробелами и удалить лишние пробелы после, но это не нужно. Для предложения все прекрасно работает.

    У меня есть проблема при обработке абзаца. Если обработать один абзац, то для последнего слова в предложении создается свой абзац и предложение разделяется. Обойти это можно, если между последним словом и абзацем поставить пробел. Но для нескольких абзацев это уже не работает. Можно ли что-то сделать?

    С уважением,

    Илья

  6. Илья
    06.05.2008 в 21:50 | #6

    Здравствуйте,

    Антон Кокин

    Я думаю, что нашел, почему макрос переносит последнее слово, из абзаца. Он воспринимает завершение абзаца, как часть слова, и пытается отзеркалить эту связку. Поэтому пробел пред завершением абзаца выручает. Но с несколькими абзацами мне ничего не понятно, не помогают ни пробелы, ни дополнительные слова. Что самое интересное если разделить абзацы с текстом несколькими пустыми абзацами, то слово все равно перенесется в абзац с текстом.

    С уважением,

    Илья

  7. 07.05.2008 в 06:49 | #7

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

    Sub Макрос1() 
    Dim myArr() As String 
    Dim i As Integer 
    Dim sStr As String 
    Dim sStrRev As String 
        sStr = Trim(Selection.Text) 
        If Asc(Right(sStr, 1)) = 13 Then sStr = Left(sStr, Len(sStr) - 1) 
        myArr = Split(sStr, " ") 
        For i = 0 To UBound(myArr) 
           strRev = strRev & StrReverse(myArr(i)) & " "
        Next i
        Selection.Text = Trim(strRev)
    End Sub

  8. Илья
    07.05.2008 в 14:34 | #8

    Здравствуйте,

    Антон Кокин

    Спасибо за отредактированный макрос. Последний доработанный вариант, лучше. Он корректно обрабатывает, один абзац, и без пробела между последним символом и концом абзаца. К сожалению, несколько абзацев, без переноса слова, он также не обрабатывает. И тоже удивительное поведение, если разделить абзацы с текстом несколькими пустыми абзацами, то слово все равно перенесется в абзац с текстом. Возможно ли это исправить?

    Еще раз спасибо, за внимание и потраченное время.

    С уважением,

    Илья

  9. 07.05.2008 в 15:19 | #9

    Илья, макрос дорабатывал не я и не я его создавал. Это помощь с форума Программирование на Visual Basic, VB 6.0, VBA.

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

  10. Илья
    03.09.2008 в 00:45 | #10

    Мне помогли написать работающий макрос, жаль не на форуме "Программирование на Visual Basic, VB 6.0, VBA".

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

    Sub Макрос1()
      Dim parArr() As String
      Dim myArr() As String
      Dim par As Integer
      Dim i As Integer
      ' Разбиваем текст на параграфы
      parArr = Split(Selection.Text, vbCr)
      
      For par = 0 To UBound(parArr)
        ' Текст параграфа бьём на слова
        myArr = Split(parArr(par), " ")
        
        ' Переворачиваем каждое слово
        For i = 0 To UBound(myArr)
          myArr(i) = StrReverse(myArr(i))
        Next i
        ' Собираем параграф назад
        parArr(par) = Join(myArr, " ")
      Next par
      
      ' Собираем весь текст
      Selection.Text = Join(parArr, vbCr)
    End Sub

    С уважением,

    Илья

  11. 03.09.2008 в 15:30 | #11

    Илья, спасибо. Кто-то в офлайне вам помог?

  12. Илья
    04.09.2008 в 10:30 | #12

    Я часто бываю на http://forum.ru-board.com. Отслеживаю там разные топики и отвечаю на вопросы, если могу помочь. Как-то, когда мы решали очередную проблему, мне в ПМ пришло письмо, от пользователя, который здорово разобрался с ней. Он предложил озвучить это предложение, и попросил на него не ссылаться. Он еще так помогает, когда вопросы трудные и сразу их решить не получается. Я предположил, что человек здорово разбирается в программировании, и задал ему вопрос о макросе. Его результат в моем предыдущем посте. По-моему его решение, как обойти проблему абзаца гениальное, просто и эффективно.

    С уважением,

    Илья

  13. 04.09.2008 в 12:00 | #13

    Да, его решение простое и ясное.

  14. OSI
    13.03.2009 в 21:27 | #14

    Народ! Необходима помощь!! Необходимо не только отзеркалить текст, но и буквы в нем с помощью Ворда, без использования графики. Например слово ИМЯ должно писаться как RMN.. Заранее Спасибо!

  15. gnom
    19.06.2009 в 01:36 | #15

    Присоединяюсь к osi,очень нужен макрос зеркалящиий буквы!Помогите пожалуйста!!!Заранее огромное спасибо!!!

  16. 19.06.2009 в 09:34 | #16

    Интересно, а как вы собиратесь зеркалить без использования графики сугубо кириллические символы: Щ, Ц, Й и прочие?

    Проблема интересная, нужно подумать. Раньше я на эту тему внимания не обращал, жаль.

  17. gnom
    19.06.2009 в 11:24 | #17

    Спасибо за ответ.К сожалению я мало,что поимаю,как происходит процесс зеркаливания и вчера даже пытался заменить русские буквы латиницей Я на R,но потом понял,что для очень многих букв альтернативы нет.Надеюсь у людей более разбирающихся,что-то получится придумать.

  18. 19.06.2009 в 11:36 | #18

    Думаю, что без API здесь не получится.

    Я надеялся на встроенный метод CopyAsPicture, но он обманчивый. В буфер копируется не картинка, как ожидается из названия, а текст, который потом можно вставить как картинку через PasteSpecial.

    Будем думать.

  19. gnom
    20.06.2009 в 10:27 | #19

    Напишите пожалуйста здесь о результатач,даже если они будут отрицательные.Большое спасибо за помощь!

  20. 21.06.2009 в 13:17 | #20

    Результаты есть, правда, не знаю насколько они соответствуют Вашим ожиданиям.

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

    Вот что у меня получилось:

    Прямой текст

    DirectText

    Текст, зеркальный относительно вертикальной оси:

    MirrX

    Текст, зеркальный относительно горизонтальной оси:

    MirrY

    Текст, зеркальный относительно вертикальной и горизонтальной осей:

    MirrXY

  21. OSI
    23.06.2009 в 15:58 | #21

    Проблема решилась довольно просто. С помощью программы FontLab Studio 5, "зазеркалил" стандартный шрифт Arial, затем воспользовался макросом выше чтобы буквы располагались справа налево.

  22. Всеволод
    26.02.2010 в 14:24 | #22

    Александр, извините, а как Вы конкретно смогли получить такие отражения?

  23. 27.02.2010 в 01:57 | #23

    Всеволод, давненько это было. Принцип такой: берётся фрагмент документа, определяются его экранные координаты, а дальше с помощью функций WinAPI делается скриншот этой области экрана и различные преобразования с ним. Если интересно, то я могу выслать вам пример документа. Для человека, далёкого от программирования, там тёмный лес.

    Работать можно только с видимой на экране частью документа.

  24. Аноним
    27.02.2010 в 13:08 | #24

    Понятненько. Я, в общем-то, далек от программирования. Использовал самый первый скрипт и повернутый шрифт. В итоге получил зеркальный макет для печати текстов на обороте кальки на струйном принтере (для защиты от размазывания текста влажными пальцами). Единственно с чем не справился - с обращением курсива: при его зазеркаливании он ложится "не в ту" сторону (влево, а не направо). Может ли кто-нить подсказать, что можно бы добавить в скрипт, чтобы это решить?

  25. Аноним
    21.07.2011 в 11:55 | #25

    ОН НУЖЕН ДЛЯ ТАТУИРОВОК В ЗЕРКАЛЬНОМ ВИДЕ НАНОСИШЬ НА ТЕЛО!

  26. Аноним
    10.12.2011 в 23:55 | #26

    Здравствуйте. а можно ли отобразить текст относительно какой-нибудь буквы, в данном случаи?

    Заранее спасибо.

Оставьте комментарий!

(обязательно)

^ Наверх