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

Вход

Регистрация

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

 

= Мир MS Excel/Развивающие задачи для VBA Excel - часть 1 - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: китин  
Развивающие задачи для VBA Excel - часть 1
Просьба оценить Ваш интерес к данным задачам:
Rioran Дата: Понедельник, 16.02.2015, 12:01 | Сообщение № 1
Группа: Авторы
Ранг: Ветеран
Сообщений: 903
Репутация: 290 ±
Замечаний: 0% ±

Excel 2013
Всем привет и хорошего настроения!

Для любителей размять мозги предлагаю несколько спонтанно пришедших на ум задач. Приглашаю всех, кто знаком с VBA чуть более, чем поверхностно, публиковать и обсуждать решения здесь. Задачи развивают понимание некоторых возможностей VBA и учат искать информацию в справочниках и открытых источниках.

Дано.

Подготовительные задачи.

Основной блок задач.

Если интерес к теме будет, но с какими-то задачами будет пробуксовка - выложу подсказки или свои решения. Успехов в развитии!

P.S. Предлагаю решения выкладывать по одной задаче, так как все вопросы сразу могут занять времени от нескольких часов.
К сообщению приложен файл: Rio_Practice.xlsm (22.1 Kb)


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


Сообщение отредактировал Rioran - Понедельник, 16.02.2015, 13:55
 
Ответить
СообщениеВсем привет и хорошего настроения!

Для любителей размять мозги предлагаю несколько спонтанно пришедших на ум задач. Приглашаю всех, кто знаком с VBA чуть более, чем поверхностно, публиковать и обсуждать решения здесь. Задачи развивают понимание некоторых возможностей VBA и учат искать информацию в справочниках и открытых источниках.

Дано.

Подготовительные задачи.

Основной блок задач.

Если интерес к теме будет, но с какими-то задачами будет пробуксовка - выложу подсказки или свои решения. Успехов в развитии!

P.S. Предлагаю решения выкладывать по одной задаче, так как все вопросы сразу могут занять времени от нескольких часов.

Автор - Rioran
Дата добавления - 16.02.2015 в 12:01
Саня Дата: Понедельник, 16.02.2015, 15:13 | Сообщение № 2
Группа: Друзья
Ранг: Ветеран
Сообщений: 1068
Репутация: 560 ±
Замечаний: 0% ±

XL 2016
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
[/vba]
 
Ответить
Сообщение
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
[/vba]

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

Excel 2013
Саня, изящное решение, снимаю шляпу =) Не думал, что задачи заинтересуют специалистов столь высокого уровня =)

Помоги, пожалуйста, понять трюк. Я превратил UDF в Sub и пошагово проверил работу. Когда ты загоняешь строку в байтовый массив - на каждый символ у тебя получается два байта. Ты проверяешь каждый второй байт, который для английского языка равен 0, для русского 4. Что нужно загуглить, чтобы понять почему каждый символ разбивается на два байта?

Правда, для испанской буквы энньэ "Ñ" мы тоже получаем нулевой второй байт, но это уже, казалось бы, не английский символ.


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

Помоги, пожалуйста, понять трюк. Я превратил UDF в Sub и пошагово проверил работу. Когда ты загоняешь строку в байтовый массив - на каждый символ у тебя получается два байта. Ты проверяешь каждый второй байт, который для английского языка равен 0, для русского 4. Что нужно загуглить, чтобы понять почему каждый символ разбивается на два байта?

Правда, для испанской буквы энньэ "Ñ" мы тоже получаем нулевой второй байт, но это уже, казалось бы, не английский символ.

Автор - Rioran
Дата добавления - 16.02.2015 в 15:46
ikki Дата: Понедельник, 16.02.2015, 15:55 | Сообщение № 4
Группа: Друзья
Ранг: Старожил
Сообщений: 1906
Репутация: 504 ±
Замечаний: 0% ±

Excel 2003, 2010
Что нужно загуглить
unicode
например, здесь: http://unicode-table.com/ru/

и там не только эннье:
[vba]
Код
Sub t()
    Dim i&, s$, a() As Byte
    For i = 192 To 255: s = s & ChrW(i): Next
    a = s
End Sub
[/vba]


помощь по Excel и VBA
ikki@fxmail.ru, icq 592842413, skype alex.ikki


Сообщение отредактировал ikki - Понедельник, 16.02.2015, 15:56
 
Ответить
Сообщение
Что нужно загуглить
unicode
например, здесь: http://unicode-table.com/ru/

и там не только эннье:
[vba]
Код
Sub t()
    Dim i&, s$, a() As Byte
    For i = 192 To 255: s = s & ChrW(i): Next
    a = s
End Sub
[/vba]

Автор - ikki
Дата добавления - 16.02.2015 в 15:55
ikki Дата: Понедельник, 16.02.2015, 16:00 | Сообщение № 5
Группа: Друзья
Ранг: Старожил
Сообщений: 1906
Репутация: 504 ±
Замечаний: 0% ±

Excel 2003, 2010
пс. мне не хватает варианта ответа "Задачи интересные, но нет времени"


помощь по Excel и VBA
ikki@fxmail.ru, icq 592842413, skype alex.ikki
 
Ответить
Сообщениепс. мне не хватает варианта ответа "Задачи интересные, но нет времени"

Автор - ikki
Дата добавления - 16.02.2015 в 16:00
Саня Дата: Понедельник, 16.02.2015, 16:11 | Сообщение № 6
Группа: Друзья
Ранг: Ветеран
Сообщений: 1068
Репутация: 560 ±
Замечаний: 0% ±

XL 2016
Когда ты загоняешь строку в байтовый массив - на каждый символ у тебя получается два байта.


Getz, Gilbert. Программирование в MS Office. Руководство по VBA:

К сообщению приложен файл: 6437341.jpg (93.4 Kb)
 
Ответить
Сообщение
Когда ты загоняешь строку в байтовый массив - на каждый символ у тебя получается два байта.


Getz, Gilbert. Программирование в MS Office. Руководство по VBA:


Автор - Саня
Дата добавления - 16.02.2015 в 16:11
Rioran Дата: Понедельник, 16.02.2015, 16:17 | Сообщение № 7
Группа: Авторы
Ранг: Ветеран
Сообщений: 903
Репутация: 290 ±
Замечаний: 0% ±

Excel 2013
ikki, спасибо за ключ, всё осознал =) По наваждению сначала UTF гуглил.

варианта ответа "Задачи интересные, но нет времени"

И правда, логичный вариант. Просьба модератору, если возможно, добавить после варианта "Слегка расширил (...)" еще вариант "Задачи интересные, найду время - попробую". Смысл тот же, формулировка слегка позитивнее =)


Роман, Москва, voronov_rv@mail.ru
Яндекс-Деньги: 41001312674279
 
Ответить
Сообщениеikki, спасибо за ключ, всё осознал =) По наваждению сначала UTF гуглил.

варианта ответа "Задачи интересные, но нет времени"

И правда, логичный вариант. Просьба модератору, если возможно, добавить после варианта "Слегка расширил (...)" еще вариант "Задачи интересные, найду время - попробую". Смысл тот же, формулировка слегка позитивнее =)

Автор - Rioran
Дата добавления - 16.02.2015 в 16:17
Rioran Дата: Понедельник, 16.02.2015, 16:33 | Сообщение № 8
Группа: Авторы
Ранг: Ветеран
Сообщений: 903
Репутация: 290 ±
Замечаний: 0% ±

Excel 2013
Саня, благодарю. Теперь всё точно на своих местах =) Правда, как мы с Сашей нашли, код не совсем выполняет начальную задачу:

ИСТИНА, если в ячейке А1 все символы английского языка

Для решающих я предполагал немного другой путь. С логикой, как в формулах из Мозгового Штурма


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

ИСТИНА, если в ячейке А1 все символы английского языка

Для решающих я предполагал немного другой путь. С логикой, как в формулах из Мозгового Штурма

Автор - Rioran
Дата добавления - 16.02.2015 в 16:33
Rioran Дата: Вторник, 17.02.2015, 11:51 | Сообщение № 9
Группа: Авторы
Ранг: Ветеран
Сообщений: 903
Репутация: 290 ±
Замечаний: 0% ±

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

[vba]
Код
Sub Rio_Test()

Dim ArrX(11) As Byte
Dim StrX As String

ArrX(0) = 82:   ArrX(1) = 0
ArrX(2) = 105:  ArrX(3) = 0
ArrX(4) = 111:  ArrX(5) = 0
ArrX(6) = 114:  ArrX(7) = 0
ArrX(8) = 97:   ArrX(9) = 0
ArrX(10) = 110: ArrX(11) = 0

StrX = ArrX

MsgBox StrX

End Sub
[/vba]


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

[vba]
Код
Sub Rio_Test()

Dim ArrX(11) As Byte
Dim StrX As String

ArrX(0) = 82:   ArrX(1) = 0
ArrX(2) = 105:  ArrX(3) = 0
ArrX(4) = 111:  ArrX(5) = 0
ArrX(6) = 114:  ArrX(7) = 0
ArrX(8) = 97:   ArrX(9) = 0
ArrX(10) = 110: ArrX(11) = 0

StrX = ArrX

MsgBox StrX

End Sub
[/vba]

Автор - Rioran
Дата добавления - 17.02.2015 в 11:51
Саня Дата: Вторник, 17.02.2015, 12:38 | Сообщение № 10
Группа: Друзья
Ранг: Ветеран
Сообщений: 1068
Репутация: 560 ±
Замечаний: 0% ±

XL 2016
Правда, как мы с Сашей нашли, код не совсем выполняет начальную задачу


[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

     Next i
     bEngString = True
End Function
[/vba]
 
Ответить
Сообщение
Правда, как мы с Сашей нашли, код не совсем выполняет начальную задачу


[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

     Next i
     bEngString = True
End Function
[/vba]

Автор - Саня
Дата добавления - 17.02.2015 в 12:38
ikki Дата: Вторник, 17.02.2015, 12:59 | Сообщение № 11
Группа: Друзья
Ранг: Старожил
Сообщений: 1906
Репутация: 504 ±
Замечаний: 0% ±

Excel 2003, 2010
ну, просто для примера (хотя это, конечно. слишком "в лоб")
[vba]
Код
Function bEngString(sText As String) As Boolean
     With CreateObject("vbscript.regexp")
         .Pattern = "^[a-z]+$"
         bEngString = .test(sText)
     End With
End Function
[/vba]


помощь по Excel и VBA
ikki@fxmail.ru, icq 592842413, skype alex.ikki
 
Ответить
Сообщениену, просто для примера (хотя это, конечно. слишком "в лоб")
[vba]
Код
Function bEngString(sText As String) As Boolean
     With CreateObject("vbscript.regexp")
         .Pattern = "^[a-z]+$"
         bEngString = .test(sText)
     End With
End Function
[/vba]

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

Excel 2013
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) соответственно.


Роман, Москва, voronov_rv@mail.ru
Яндекс-Деньги: 41001312674279
 
Ответить
Сообщение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
Дата добавления - 17.02.2015 в 14:40
Rioran Дата: Вторник, 17.02.2015, 14:53 | Сообщение № 13
Группа: Авторы
Ранг: Ветеран
Сообщений: 903
Репутация: 290 ±
Замечаний: 0% ±

Excel 2013
Саня, ловко ты под байты подстроил =) У меня аналогичное решение, только через Chr() и последовательный перебор символов строки. Всем остальным решающим будет несложно прикрутить к твоей функции проверку на числа и знаки препинания по вкусу.

Мне нравится, как идёт тема =) Не ожидал, что решая такую простую задачу - можно использовать такие интересные приёмы. Надеюсь, до следующих задач кто-то тоже доберётся.


Роман, Москва, voronov_rv@mail.ru
Яндекс-Деньги: 41001312674279
 
Ответить
СообщениеСаня, ловко ты под байты подстроил =) У меня аналогичное решение, только через Chr() и последовательный перебор символов строки. Всем остальным решающим будет несложно прикрутить к твоей функции проверку на числа и знаки препинания по вкусу.

Мне нравится, как идёт тема =) Не ожидал, что решая такую простую задачу - можно использовать такие интересные приёмы. Надеюсь, до следующих задач кто-то тоже доберётся.

Автор - Rioran
Дата добавления - 17.02.2015 в 14:53
ikki Дата: Вторник, 17.02.2015, 15:20 | Сообщение № 14
Группа: Друзья
Ранг: Старожил
Сообщений: 1906
Репутация: 504 ±
Замечаний: 0% ±

Excel 2003, 2010
пока одно уточнение - \w включает цифры и, кажется, ещё символ подчёркивания
точно не помню - я им не пользуюсь, потому что он, теоретически, должен работать и с кириллицей, но не работает.
так же, как и \b, к сожалению.


помощь по Excel и VBA
ikki@fxmail.ru, icq 592842413, skype alex.ikki
 
Ответить
Сообщениепока одно уточнение - \w включает цифры и, кажется, ещё символ подчёркивания
точно не помню - я им не пользуюсь, потому что он, теоретически, должен работать и с кириллицей, но не работает.
так же, как и \b, к сожалению.

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

Excel 2013
ikki, да, ты прав, числа включает и нижнее подчеркивание. Из моего паттерна можно убрать \d - на функционал не повлияет. Проверил ЗДЕСЬ. Также - не реагирует на специфические немецкие/испанские символы и вообще любые другие языки.


Роман, Москва, voronov_rv@mail.ru
Яндекс-Деньги: 41001312674279
 
Ответить
Сообщениеikki, да, ты прав, числа включает и нижнее подчеркивание. Из моего паттерна можно убрать \d - на функционал не повлияет. Проверил ЗДЕСЬ. Также - не реагирует на специфические немецкие/испанские символы и вообще любые другие языки.

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

Excel 2013
Уважаемые форумчане, может кто-то застрял на каком-то моменте? Возможно, кому-то в каком-то моменте нужны подсказки? Пожалуйста, обращайтесь =)


Роман, Москва, voronov_rv@mail.ru
Яндекс-Деньги: 41001312674279
 
Ответить
СообщениеУважаемые форумчане, может кто-то застрял на каком-то моменте? Возможно, кому-то в каком-то моменте нужны подсказки? Пожалуйста, обращайтесь =)

Автор - Rioran
Дата добавления - 20.02.2015 в 12:05
Nic70y Дата: Пятница, 20.02.2015, 17:30 | Сообщение № 17
Группа: Друзья
Ранг: Экселист
Сообщений: 9047
Репутация: 2382 ±
Замечаний: 0% ±

Excel 2010
Rioran, вот что обидно (для меня лично) ни где не застрял т.к. даже не изучал тему.
Завидую я Вам макрописцам - что-то изучаете, интересуетесь, а я пока не возникнет необходимость в решении какого-то конкретного вопроса - даже не пошевелюсь... :(


ЮMoney 41001841029809
 
Ответить
СообщениеRioran, вот что обидно (для меня лично) ни где не застрял т.к. даже не изучал тему.
Завидую я Вам макрописцам - что-то изучаете, интересуетесь, а я пока не возникнет необходимость в решении какого-то конкретного вопроса - даже не пошевелюсь... :(

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

Excel 2013
Nic70y, расслабьтесь, Николай, все модели поведения имеют свои преимущества =) Например, у Вас - максимальная отдача от затраченной энергии. Никаких лишних движений, только практика ради практики и решение сложившихся вопросов. В то время как для любителей абстрактных задач решение оных повышает вероятность и эффективность решения вопросов, которые они ВОЗМОЖНО встретят в будущем. В первом случае больше ресурсов затрачивается на этапе решения, потом, когда задача есть. Во втором случае - затрачивается больше ресурсов заранее, своего рода "инвестиции" в будущие решения.


Роман, Москва, voronov_rv@mail.ru
Яндекс-Деньги: 41001312674279
 
Ответить
СообщениеNic70y, расслабьтесь, Николай, все модели поведения имеют свои преимущества =) Например, у Вас - максимальная отдача от затраченной энергии. Никаких лишних движений, только практика ради практики и решение сложившихся вопросов. В то время как для любителей абстрактных задач решение оных повышает вероятность и эффективность решения вопросов, которые они ВОЗМОЖНО встретят в будущем. В первом случае больше ресурсов затрачивается на этапе решения, потом, когда задача есть. Во втором случае - затрачивается больше ресурсов заранее, своего рода "инвестиции" в будущие решения.

Автор - Rioran
Дата добавления - 20.02.2015 в 18:09
RAN Дата: Пятница, 20.02.2015, 19:04 | Сообщение № 19
Группа: Друзья
Ранг: Экселист
Сообщений: 5660
Репутация: 1163 ±
Замечаний: 0% ±

2010
Пишите грамотно, на нормальном русском или, если этот язык Вам не родной, английском.
Open>Close>End


Быть или не быть, вот в чем загвоздка!
 
Ответить
СообщениеПишите грамотно, на нормальном русском или, если этот язык Вам не родной, английском.
Open>Close>End

Автор - RAN
Дата добавления - 20.02.2015 в 19:04
Rioran Дата: Вторник, 24.02.2015, 13:52 | Сообщение № 20
Группа: Авторы
Ранг: Ветеран
Сообщений: 903
Репутация: 290 ±
Замечаний: 0% ±

Excel 2013
Английские письмена внутри документа никоим образом не влияют на исходную задачу и изначальные данные. Это намеренно привнесённый "отвлекающий фактор". Всё, что нужно, дано в посте №1.


Роман, Москва, voronov_rv@mail.ru
Яндекс-Деньги: 41001312674279
 
Ответить
СообщениеАнглийские письмена внутри документа никоим образом не влияют на исходную задачу и изначальные данные. Это намеренно привнесённый "отвлекающий фактор". Всё, что нужно, дано в посте №1.

Автор - Rioran
Дата добавления - 24.02.2015 в 13:52
  • Страница 1 из 1
  • 1
Поиск:

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