Для любителей размять мозги предлагаю несколько спонтанно пришедших на ум задач. Приглашаю всех, кто знаком с VBA чуть более, чем поверхностно, публиковать и обсуждать решения здесь. Задачи развивают понимание некоторых возможностей VBA и учат искать информацию в справочниках и открытых источниках.
Дано.
В приложенном файле 2 кнопки. По нажатию на каждую проигрывается звук слов, записанных в ячейку А1. При использовании кнопки Excel будет задействован встроенный в Excel функционал. При использовании кнопки Google будет задействован сервис перевода, звук проиграется в браузере или медиа-плеере. Также прилагается таблица русскоязычных символов нижнего регистра, с которыми работает Google.
Подготовительные задачи.
1). Составить список символов верхнего регистра с расшифровкой для Google. 2). Составить список символов, которые можно найти на клавиатуре и которые Google преобразует по аналогии с русскими буквами. 3). Составьте программу, которая будет инициализировать публичный массив из двух столбцов. В первом столбце - кодировка Google, во втором - символы русского языка обоих регистров. 4). Может ли Excel проговаривать с помощью .Speak другие языки кроме английского? Обоснуйте ответ. Если ответ "да", то какие.
Основной блок задач.
1). Составьте UDF, которая будет возвращать булево значение. ИСТИНА, если в ячейке А1 все символы английского языка, ЛОЖЬ - если есть хотя бы один символ на любом другом языке. 2). Добавьте кнопку, которая, если в ячейке А1 есть не английские символы, преобразует все русскоязычные символы в соответствии с кодом Google. Протестируйте на любой преобразованной русской фразе кнопку Google. 3). Создайте программу, которая будет сохранять звуковой файл от Google в папку на диске С. 4). В подключаемых библиотеках Tools -> References есть библиотека Media Player. Значит ли это, что можно по нажатию кнопки запускать проигрывание MP3 файлов? Если да - предоставьте код программы. 5). Создайте программу, которая проходит по всем аудио-записям Google в конкретной папке и переименовывает их в значение их веса в КИЛО байтах, нижнее подчеркивание, время создания (4 цифры без двоеточия).
Если интерес к теме будет, но с какими-то задачами будет пробуксовка - выложу подсказки или свои решения. Успехов в развитии!
P.S. Предлагаю решения выкладывать по одной задаче, так как все вопросы сразу могут занять времени от нескольких часов.
Всем привет и хорошего настроения!
Для любителей размять мозги предлагаю несколько спонтанно пришедших на ум задач. Приглашаю всех, кто знаком с VBA чуть более, чем поверхностно, публиковать и обсуждать решения здесь. Задачи развивают понимание некоторых возможностей VBA и учат искать информацию в справочниках и открытых источниках.
Дано.
В приложенном файле 2 кнопки. По нажатию на каждую проигрывается звук слов, записанных в ячейку А1. При использовании кнопки Excel будет задействован встроенный в Excel функционал. При использовании кнопки Google будет задействован сервис перевода, звук проиграется в браузере или медиа-плеере. Также прилагается таблица русскоязычных символов нижнего регистра, с которыми работает Google.
Подготовительные задачи.
1). Составить список символов верхнего регистра с расшифровкой для Google. 2). Составить список символов, которые можно найти на клавиатуре и которые Google преобразует по аналогии с русскими буквами. 3). Составьте программу, которая будет инициализировать публичный массив из двух столбцов. В первом столбце - кодировка Google, во втором - символы русского языка обоих регистров. 4). Может ли Excel проговаривать с помощью .Speak другие языки кроме английского? Обоснуйте ответ. Если ответ "да", то какие.
Основной блок задач.
1). Составьте UDF, которая будет возвращать булево значение. ИСТИНА, если в ячейке А1 все символы английского языка, ЛОЖЬ - если есть хотя бы один символ на любом другом языке. 2). Добавьте кнопку, которая, если в ячейке А1 есть не английские символы, преобразует все русскоязычные символы в соответствии с кодом Google. Протестируйте на любой преобразованной русской фразе кнопку Google. 3). Создайте программу, которая будет сохранять звуковой файл от Google в папку на диске С. 4). В подключаемых библиотеках Tools -> References есть библиотека Media Player. Значит ли это, что можно по нажатию кнопки запускать проигрывание MP3 файлов? Если да - предоставьте код программы. 5). Создайте программу, которая проходит по всем аудио-записям Google в конкретной папке и переименовывает их в значение их веса в КИЛО байтах, нижнее подчеркивание, время создания (4 цифры без двоеточия).
Если интерес к теме будет, но с какими-то задачами будет пробуксовка - выложу подсказки или свои решения. Успехов в развитии!
P.S. Предлагаю решения выкладывать по одной задаче, так как все вопросы сразу могут занять времени от нескольких часов.Rioran
1). Составьте UDF, которая будет возвращать булево значение. ИСТИНА, если в ячейке А1 все символы английского языка, ЛОЖЬ - если есть хотя бы один символ на любом другом языке
предложу такой вариант, ru/eng работает, остальные, по-сути, тоже должны: [vba]
Код
Function bEngString(sText As String) As Boolean Dim abytText() As Byte: abytText = sText
Dim i As Integer For i = 1 To UBound(abytText) Step 2 If abytText(i) > 0 Then Exit Function Next i bEngString = True End Function
1). Составьте UDF, которая будет возвращать булево значение. ИСТИНА, если в ячейке А1 все символы английского языка, ЛОЖЬ - если есть хотя бы один символ на любом другом языке
предложу такой вариант, ru/eng работает, остальные, по-сути, тоже должны: [vba]
Код
Function bEngString(sText As String) As Boolean Dim abytText() As Byte: abytText = sText
Dim i As Integer For i = 1 To UBound(abytText) Step 2 If abytText(i) > 0 Then Exit Function Next i bEngString = True End Function
Саня, изящное решение, снимаю шляпу =) Не думал, что задачи заинтересуют специалистов столь высокого уровня =)
Помоги, пожалуйста, понять трюк. Я превратил UDF в Sub и пошагово проверил работу. Когда ты загоняешь строку в байтовый массив - на каждый символ у тебя получается два байта. Ты проверяешь каждый второй байт, который для английского языка равен 0, для русского 4. Что нужно загуглить, чтобы понять почему каждый символ разбивается на два байта?
Правда, для испанской буквы энньэ "Ñ" мы тоже получаем нулевой второй байт, но это уже, казалось бы, не английский символ.
Саня, изящное решение, снимаю шляпу =) Не думал, что задачи заинтересуют специалистов столь высокого уровня =)
Помоги, пожалуйста, понять трюк. Я превратил UDF в Sub и пошагово проверил работу. Когда ты загоняешь строку в байтовый массив - на каждый символ у тебя получается два байта. Ты проверяешь каждый второй байт, который для английского языка равен 0, для русского 4. Что нужно загуглить, чтобы понять почему каждый символ разбивается на два байта?
Правда, для испанской буквы энньэ "Ñ" мы тоже получаем нулевой второй байт, но это уже, казалось бы, не английский символ.Rioran
Роман, Москва, voronov_rv@mail.ru Яндекс-Деньги: 41001312674279
варианта ответа "Задачи интересные, но нет времени"
И правда, логичный вариант. Просьба модератору, если возможно, добавить после варианта "Слегка расширил (...)" еще вариант "Задачи интересные, найду время - попробую". Смысл тот же, формулировка слегка позитивнее =)
ikki, спасибо за ключ, всё осознал =) По наваждению сначала UTF гуглил.
варианта ответа "Задачи интересные, но нет времени"
И правда, логичный вариант. Просьба модератору, если возможно, добавить после варианта "Слегка расширил (...)" еще вариант "Задачи интересные, найду время - попробую". Смысл тот же, формулировка слегка позитивнее =)Rioran
Роман, Москва, voronov_rv@mail.ru Яндекс-Деньги: 41001312674279
Правда, как мы с Сашей нашли, код не совсем выполняет начальную задачу
[vba]
Код
Function bEngString(sText As String) As Boolean Dim abytText() As Byte: abytText = UCase(sText)
Dim i As Integer For i = 1 To UBound(abytText) Step 2 If abytText(i) = 0 Then Select Case abytText(i - 1) Case 65 To 90 Case Else: Exit Function End Select Else Exit Function End If
Правда, как мы с Сашей нашли, код не совсем выполняет начальную задачу
[vba]
Код
Function bEngString(sText As String) As Boolean Dim abytText() As Byte: abytText = UCase(sText)
Dim i As Integer For i = 1 To UBound(abytText) Step 2 If abytText(i) = 0 Then Select Case abytText(i - 1) Case 65 To 90 Case Else: Exit Function End Select Else Exit Function End If
ну, просто для примера (хотя это, конечно. слишком "в лоб") [vba]
Код
Function bEngString(sText As String) As Boolean With CreateObject("vbscript.regexp") .Pattern = "^[a-z]+$" bEngString = .test(sText) End With End Function
[/vba]
ну, просто для примера (хотя это, конечно. слишком "в лоб") [vba]
Код
Function bEngString(sText As String) As Boolean With CreateObject("vbscript.regexp") .Pattern = "^[a-z]+$" bEngString = .test(sText) End With End Function
ikki, спасибо за вариант, знакомлюсь с регулярными выражениями =) Уточняю твой паттерн:
[vba]
Код
Function bEngString(sText As String) As Boolean
With CreateObject("vbscript.regexp") .Pattern = "^[ \w\d\-+.,!?@#$%^&*():;\/\\|<>" & Chr(34) & Chr(39) & "=]+$" bEngString = .test(sText) End With
End Function
[/vba] Где конструкция ^[ ]+$ означает, что соответствие со строкой мы получим только тогда, когда все символы с первого по последний удовлетворяют условиям внутри скобок. Где \w - нас удовлетворяют английские буквы без учета регистра. Где \d - нас интересуют любые числа. Всё остальное - перечисление символов, где \/ ищет только /, т.к. \ системный символ для RegExp. Соответственно, \\ ищет только \. Символы " и ' являются системными для VBA, поэтому их я заменяю на Chr(34) и Chr(39) соответственно.
ikki, спасибо за вариант, знакомлюсь с регулярными выражениями =) Уточняю твой паттерн:
[vba]
Код
Function bEngString(sText As String) As Boolean
With CreateObject("vbscript.regexp") .Pattern = "^[ \w\d\-+.,!?@#$%^&*():;\/\\|<>" & Chr(34) & Chr(39) & "=]+$" bEngString = .test(sText) End With
End Function
[/vba] Где конструкция ^[ ]+$ означает, что соответствие со строкой мы получим только тогда, когда все символы с первого по последний удовлетворяют условиям внутри скобок. Где \w - нас удовлетворяют английские буквы без учета регистра. Где \d - нас интересуют любые числа. Всё остальное - перечисление символов, где \/ ищет только /, т.к. \ системный символ для RegExp. Соответственно, \\ ищет только \. Символы " и ' являются системными для VBA, поэтому их я заменяю на Chr(34) и Chr(39) соответственно.Rioran
Роман, Москва, voronov_rv@mail.ru Яндекс-Деньги: 41001312674279
Саня, ловко ты под байты подстроил =) У меня аналогичное решение, только через Chr() и последовательный перебор символов строки. Всем остальным решающим будет несложно прикрутить к твоей функции проверку на числа и знаки препинания по вкусу.
Мне нравится, как идёт тема =) Не ожидал, что решая такую простую задачу - можно использовать такие интересные приёмы. Надеюсь, до следующих задач кто-то тоже доберётся.
Саня, ловко ты под байты подстроил =) У меня аналогичное решение, только через Chr() и последовательный перебор символов строки. Всем остальным решающим будет несложно прикрутить к твоей функции проверку на числа и знаки препинания по вкусу.
Мне нравится, как идёт тема =) Не ожидал, что решая такую простую задачу - можно использовать такие интересные приёмы. Надеюсь, до следующих задач кто-то тоже доберётся.Rioran
Роман, Москва, voronov_rv@mail.ru Яндекс-Деньги: 41001312674279
пока одно уточнение - \w включает цифры и, кажется, ещё символ подчёркивания точно не помню - я им не пользуюсь, потому что он, теоретически, должен работать и с кириллицей, но не работает. так же, как и \b, к сожалению.
пока одно уточнение - \w включает цифры и, кажется, ещё символ подчёркивания точно не помню - я им не пользуюсь, потому что он, теоретически, должен работать и с кириллицей, но не работает. так же, как и \b, к сожалению.ikki
помощь по Excel и VBA ikki@fxmail.ru, icq 592842413, skype alex.ikki
ikki, да, ты прав, числа включает и нижнее подчеркивание. Из моего паттерна можно убрать \d - на функционал не повлияет. Проверил ЗДЕСЬ. Также - не реагирует на специфические немецкие/испанские символы и вообще любые другие языки.
ikki, да, ты прав, числа включает и нижнее подчеркивание. Из моего паттерна можно убрать \d - на функционал не повлияет. Проверил ЗДЕСЬ. Также - не реагирует на специфические немецкие/испанские символы и вообще любые другие языки.Rioran
Роман, Москва, voronov_rv@mail.ru Яндекс-Деньги: 41001312674279
Rioran, вот что обидно (для меня лично) ни где не застрял т.к. даже не изучал тему. Завидую я Вам макрописцам - что-то изучаете, интересуетесь, а я пока не возникнет необходимость в решении какого-то конкретного вопроса - даже не пошевелюсь...
Rioran, вот что обидно (для меня лично) ни где не застрял т.к. даже не изучал тему. Завидую я Вам макрописцам - что-то изучаете, интересуетесь, а я пока не возникнет необходимость в решении какого-то конкретного вопроса - даже не пошевелюсь... Nic70y
Nic70y, расслабьтесь, Николай, все модели поведения имеют свои преимущества =) Например, у Вас - максимальная отдача от затраченной энергии. Никаких лишних движений, только практика ради практики и решение сложившихся вопросов. В то время как для любителей абстрактных задач решение оных повышает вероятность и эффективность решения вопросов, которые они ВОЗМОЖНО встретят в будущем. В первом случае больше ресурсов затрачивается на этапе решения, потом, когда задача есть. Во втором случае - затрачивается больше ресурсов заранее, своего рода "инвестиции" в будущие решения.
Nic70y, расслабьтесь, Николай, все модели поведения имеют свои преимущества =) Например, у Вас - максимальная отдача от затраченной энергии. Никаких лишних движений, только практика ради практики и решение сложившихся вопросов. В то время как для любителей абстрактных задач решение оных повышает вероятность и эффективность решения вопросов, которые они ВОЗМОЖНО встретят в будущем. В первом случае больше ресурсов затрачивается на этапе решения, потом, когда задача есть. Во втором случае - затрачивается больше ресурсов заранее, своего рода "инвестиции" в будущие решения.Rioran
Роман, Москва, voronov_rv@mail.ru Яндекс-Деньги: 41001312674279
Английские письмена внутри документа никоим образом не влияют на исходную задачу и изначальные данные. Это намеренно привнесённый "отвлекающий фактор". Всё, что нужно, дано в посте №1.
Английские письмена внутри документа никоим образом не влияют на исходную задачу и изначальные данные. Это намеренно привнесённый "отвлекающий фактор". Всё, что нужно, дано в посте №1.Rioran
Роман, Москва, voronov_rv@mail.ru Яндекс-Деньги: 41001312674279