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

Вход

Регистрация

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

 

= Мир MS Excel/Функция (UDF) "ИЗВЛЕЧЬЦЕЛЫЕ" - Страница 2 - Мир MS Excel

Старая форма входа
  • Страница 2 из 2
  • «
  • 1
  • 2
Модератор форума: _Boroda_, китин  
Функция (UDF) "ИЗВЛЕЧЬЦЕЛЫЕ"
nerv Дата: Понедельник, 21.11.2011, 14:30 | Сообщение № 21
Группа: Редакторы
Ранг: Обитатель
Сообщений: 431
Репутация: 193 ±
Замечаний: 0% ±

Цитата (v__step)
Это важнее!

v__step, ну раз важнее)))

[vba]
Код
Public Function io(ParamArray Arguments()) As Variant
Dim v, x, i
With CreateObject("VBScript.RegExp")
       .Global = True: .Pattern = "\d+"
       For Each v In Arguments
           For Each x In IIf(v.Count = 1, Array(v.Value), v.Value)
               i = i & " " & x
           Next
       Next
       Set x = .Execute(i): ReDim v(1 To x.Count)
       For i = 0 To x.Count - 1: v(i + 1) = CLng(x.Item(i).Value): Next
       io = v
End With
End Function
[/vba]

Кстати, ради интереса, можно потестить, что быстрее)


Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук


YM 41001156540584 / WM WMR R21924176233

https://github.com/nervgh/vba


Сообщение отредактировал nerv - Понедельник, 21.11.2011, 14:31
 
Ответить
Сообщение
Цитата (v__step)
Это важнее!

v__step, ну раз важнее)))

[vba]
Код
Public Function io(ParamArray Arguments()) As Variant
Dim v, x, i
With CreateObject("VBScript.RegExp")
       .Global = True: .Pattern = "\d+"
       For Each v In Arguments
           For Each x In IIf(v.Count = 1, Array(v.Value), v.Value)
               i = i & " " & x
           Next
       Next
       Set x = .Execute(i): ReDim v(1 To x.Count)
       For i = 0 To x.Count - 1: v(i + 1) = CLng(x.Item(i).Value): Next
       io = v
End With
End Function
[/vba]

Кстати, ради интереса, можно потестить, что быстрее)

Автор - nerv
Дата добавления - 21.11.2011 в 14:30
v__step Дата: Понедельник, 21.11.2011, 14:36 | Сообщение № 22
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 225
Репутация: 27 ±
Замечаний: 0% ±

Quote (nerv)
v__step, ну раз важнее)))
Годится! А перенос в массив - дело хорошее
Одно "но": IIf смотрится хорошо, но часто работает медленней, чем If


С уважением, Владимир
 
Ответить
Сообщение
Quote (nerv)
v__step, ну раз важнее)))
Годится! А перенос в массив - дело хорошее
Одно "но": IIf смотрится хорошо, но часто работает медленней, чем If

Автор - v__step
Дата добавления - 21.11.2011 в 14:36
nerv Дата: Понедельник, 21.11.2011, 14:48 | Сообщение № 23
Группа: Редакторы
Ранг: Обитатель
Сообщений: 431
Репутация: 193 ±
Замечаний: 0% ±

Quote (v__step)
Одно "но": IIf смотрится хорошо, но часто работает медленней, чем If

Всегда медленней) Но в данном случае не критично smile А вот в количестве букв выигрыш существенный.


Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук


YM 41001156540584 / WM WMR R21924176233

https://github.com/nervgh/vba
 
Ответить
Сообщение
Quote (v__step)
Одно "но": IIf смотрится хорошо, но часто работает медленней, чем If

Всегда медленней) Но в данном случае не критично smile А вот в количестве букв выигрыш существенный.

Автор - nerv
Дата добавления - 21.11.2011 в 14:48
Alex_ST Дата: Понедельник, 21.11.2011, 15:23 | Сообщение № 24
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3214
Репутация: 615 ±
Замечаний: 0% ±

2003
Что-то я притупел...
Сожу, пялюсь в экран, никак не въеду: почему[vba]
Код
For Each x In IIf(v.Count = 1, Array(v.Value), v.Value)
[/vba]
а не[vba]
Код
For Each x In IIf(v.Count = 1, v.Value, Array(v.Value))
[/vba]



С уважением,
Алексей
MS Excel 2003 - the best!!!


Сообщение отредактировал Alex_ST - Понедельник, 21.11.2011, 15:24
 
Ответить
СообщениеЧто-то я притупел...
Сожу, пялюсь в экран, никак не въеду: почему[vba]
Код
For Each x In IIf(v.Count = 1, Array(v.Value), v.Value)
[/vba]
а не[vba]
Код
For Each x In IIf(v.Count = 1, v.Value, Array(v.Value))
[/vba]

Автор - Alex_ST
Дата добавления - 21.11.2011 в 15:23
nerv Дата: Понедельник, 21.11.2011, 15:43 | Сообщение № 25
Группа: Редакторы
Ранг: Обитатель
Сообщений: 431
Репутация: 193 ±
Замечаний: 0% ±

Alex_ST, попробую объяснить, но с начала такой прикол

- при выделении нескольких ячеек создается массив
- при выделении одной берется значение ячейки на строку ниже : )

[vba]
Код
Sub io()
Dim x
With Selection
        x = IIf(.Count = 1, .Offset(1), .Cells).Value
End With
End Sub
[/vba]

Цитата (Alex_ST)
никак не въеду: почему

В данном случае For Each это цикл по массиву. Т.е. For Each Variant In Array(): Next

Иными словами
For Each x(сейчас x - это Object/Range) In IIf(x.Количество_Ячеек = 1, ПРАВДА:Создать_Массив_Из_Значения_Одной_Ячеки, ЛОЖЬ: создать массив из диапазона)
А еще учти, что я на скорую руку шлепал и не тестил happy


Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук


YM 41001156540584 / WM WMR R21924176233

https://github.com/nervgh/vba


Сообщение отредактировал nerv - Понедельник, 21.11.2011, 15:50
 
Ответить
СообщениеAlex_ST, попробую объяснить, но с начала такой прикол

- при выделении нескольких ячеек создается массив
- при выделении одной берется значение ячейки на строку ниже : )

[vba]
Код
Sub io()
Dim x
With Selection
        x = IIf(.Count = 1, .Offset(1), .Cells).Value
End With
End Sub
[/vba]

Цитата (Alex_ST)
никак не въеду: почему

В данном случае For Each это цикл по массиву. Т.е. For Each Variant In Array(): Next

Иными словами
For Each x(сейчас x - это Object/Range) In IIf(x.Количество_Ячеек = 1, ПРАВДА:Создать_Массив_Из_Значения_Одной_Ячеки, ЛОЖЬ: создать массив из диапазона)
А еще учти, что я на скорую руку шлепал и не тестил happy

Автор - nerv
Дата добавления - 21.11.2011 в 15:43
Alex_ST Дата: Понедельник, 21.11.2011, 15:51 | Сообщение № 26
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3214
Репутация: 615 ±
Замечаний: 0% ±

2003
а разве[vba]
Код
For Each x In IIf(v.Count = 1, v, v.Value)
[/vba]
, которое мы с твоей лёгкой руки применяли раньше, это не то же самое, что и [vba]
Код
For Each x In IIf(v.Count = 1, v.Value, Array(v.Value))
[/vba]

Что-то я, наверное, переутомился...
Надо, наверное, немного отвлечься, поработать, отдохнуть biggrin



С уважением,
Алексей
MS Excel 2003 - the best!!!
 
Ответить
Сообщениеа разве[vba]
Код
For Each x In IIf(v.Count = 1, v, v.Value)
[/vba]
, которое мы с твоей лёгкой руки применяли раньше, это не то же самое, что и [vba]
Код
For Each x In IIf(v.Count = 1, v.Value, Array(v.Value))
[/vba]

Что-то я, наверное, переутомился...
Надо, наверное, немного отвлечься, поработать, отдохнуть biggrin

Автор - Alex_ST
Дата добавления - 21.11.2011 в 15:51
nerv Дата: Понедельник, 21.11.2011, 16:16 | Сообщение № 27
Группа: Редакторы
Ранг: Обитатель
Сообщений: 431
Репутация: 193 ±
Замечаний: 0% ±

Алексей, гляди, я все время писал так
[vba]
Код
For Each x In IIf(v.Count = 1, Array(v.Value), v.Value)
[/vba]

а ты так пишешь
[vba]
Код
For Each rCell In IIf(rArea.Count = 1, rArea, rArea.Value)
[/vba]

Видимо с самого начала перепутал и не пошло)

Чтобы прояснить ситуацию
[vba]
Код
Sub io()
Dim x
'by step
x = [A1].Value ' 1 cell - value
x = [A1:A2].Value ' 2 cells - array

x = Array([A1].Value) ' 1 cell - array
x = [A1:A2].Value ' 2 cells - array
End Sub


Ну и на последок немного мозгового штурма smile
[vba]
Код
Sub io()
Dim i As Byte: i = 1
MsgBox Range("A1:A10")(IIf(i, 7, 1)).Address
End Sub
[/vba]


Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук


YM 41001156540584 / WM WMR R21924176233

https://github.com/nervgh/vba


Сообщение отредактировал nerv - Понедельник, 21.11.2011, 16:20
 
Ответить
СообщениеАлексей, гляди, я все время писал так
[vba]
Код
For Each x In IIf(v.Count = 1, Array(v.Value), v.Value)
[/vba]

а ты так пишешь
[vba]
Код
For Each rCell In IIf(rArea.Count = 1, rArea, rArea.Value)
[/vba]

Видимо с самого начала перепутал и не пошло)

Чтобы прояснить ситуацию
[vba]
Код
Sub io()
Dim x
'by step
x = [A1].Value ' 1 cell - value
x = [A1:A2].Value ' 2 cells - array

x = Array([A1].Value) ' 1 cell - array
x = [A1:A2].Value ' 2 cells - array
End Sub


Ну и на последок немного мозгового штурма smile
[vba]
Код
Sub io()
Dim i As Byte: i = 1
MsgBox Range("A1:A10")(IIf(i, 7, 1)).Address
End Sub
[/vba]

Автор - nerv
Дата добавления - 21.11.2011 в 16:16
Alex_ST Дата: Понедельник, 21.11.2011, 16:50 | Сообщение № 28
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3214
Репутация: 615 ±
Замечаний: 0% ±

2003
Цитата (nerv)
[vba]
Код
x = Array([A1].Value) ' 1 cell - array
[/vba]

Вот, где собака порылась!
Спасибо. Понял. Ты просто из одной ячейки так умудряешься сделать массив.
Ну, тогда, наверное в завершение темы, выложу собранный и оформленный плод общего труда с обработкой ошибок [vba]
Код
Public Function ИЗВЛЕЧЬ_ЦЕЛЫЕ(ParamArray ДИАПАЗОН())
      Dim rArea, rCell, sStr$, oMatches, i&, Arr()
      On Error GoTo xlErrEXIT
      For Each rArea In ДИАПАЗОН
         For Each rCell In IIf(rArea.Count = 1, Array(rArea.Value), rArea.Value)
            sStr = sStr & " " & rCell
         Next rCell
      Next rArea
      With CreateObject("VBScript.RegExp"): .Global = True: .Pattern = "\d+": Set oMatches = .Execute(sStr): End With
      If oMatches.Count = 0 Then ИЗВЛЕЧЬ_ЦЕЛЫЕ = CVErr(xlErrNA): Exit Function   ' вернуть ошибку #Н/Д если чисел нет
      ReDim Arr(1 To oMatches.Count)
      For i = 0 To oMatches.Count - 1: Arr(i + 1) = CLng(oMatches(i).Value): Next i
      ИЗВЛЕЧЬ_ЦЕЛЫЕ = Arr
xlErrEXIT:    If Err Then ИЗВЛЕЧЬ_ЦЕЛЫЕ = CVErr(xlErrValue): Exit Function   ' вернуть ошибку #ЗНАЧЕНИЕ если была ошибка в аргументах
End Function
[/vba]

P.S. Я не думаю, что применение тобой трёх переменных As Variant в "разных ипостасях" вместо примененных мною 6-ти, но более специализированных назначений как-то скажется на быстродействии, но зато код стал более читабельным biggrin



С уважением,
Алексей
MS Excel 2003 - the best!!!


Сообщение отредактировал Alex_ST - Понедельник, 21.11.2011, 17:02
 
Ответить
Сообщение
Цитата (nerv)
[vba]
Код
x = Array([A1].Value) ' 1 cell - array
[/vba]

Вот, где собака порылась!
Спасибо. Понял. Ты просто из одной ячейки так умудряешься сделать массив.
Ну, тогда, наверное в завершение темы, выложу собранный и оформленный плод общего труда с обработкой ошибок [vba]
Код
Public Function ИЗВЛЕЧЬ_ЦЕЛЫЕ(ParamArray ДИАПАЗОН())
      Dim rArea, rCell, sStr$, oMatches, i&, Arr()
      On Error GoTo xlErrEXIT
      For Each rArea In ДИАПАЗОН
         For Each rCell In IIf(rArea.Count = 1, Array(rArea.Value), rArea.Value)
            sStr = sStr & " " & rCell
         Next rCell
      Next rArea
      With CreateObject("VBScript.RegExp"): .Global = True: .Pattern = "\d+": Set oMatches = .Execute(sStr): End With
      If oMatches.Count = 0 Then ИЗВЛЕЧЬ_ЦЕЛЫЕ = CVErr(xlErrNA): Exit Function   ' вернуть ошибку #Н/Д если чисел нет
      ReDim Arr(1 To oMatches.Count)
      For i = 0 To oMatches.Count - 1: Arr(i + 1) = CLng(oMatches(i).Value): Next i
      ИЗВЛЕЧЬ_ЦЕЛЫЕ = Arr
xlErrEXIT:    If Err Then ИЗВЛЕЧЬ_ЦЕЛЫЕ = CVErr(xlErrValue): Exit Function   ' вернуть ошибку #ЗНАЧЕНИЕ если была ошибка в аргументах
End Function
[/vba]

P.S. Я не думаю, что применение тобой трёх переменных As Variant в "разных ипостасях" вместо примененных мною 6-ти, но более специализированных назначений как-то скажется на быстродействии, но зато код стал более читабельным biggrin

Автор - Alex_ST
Дата добавления - 21.11.2011 в 16:50
Alex_ST Дата: Понедельник, 21.11.2011, 21:36 | Сообщение № 29
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3214
Репутация: 615 ±
Замечаний: 0% ±

2003
Quote (nerv)
немного мозгового штурма

Quote (nerv)
As Byte

Я никогда не понимал сути переменных, объявляемых As Byte…(ну самоучка я smile , поэтому с чем имел дело, то и знаю более-менее)
Это что, целое от 0 до 255 или от -127 до 127?



С уважением,
Алексей
MS Excel 2003 - the best!!!


Сообщение отредактировал Alex_ST - Понедельник, 21.11.2011, 21:37
 
Ответить
Сообщение
Quote (nerv)
немного мозгового штурма

Quote (nerv)
As Byte

Я никогда не понимал сути переменных, объявляемых As Byte…(ну самоучка я smile , поэтому с чем имел дело, то и знаю более-менее)
Это что, целое от 0 до 255 или от -127 до 127?

Автор - Alex_ST
Дата добавления - 21.11.2011 в 21:36
nerv Дата: Понедельник, 21.11.2011, 21:46 | Сообщение № 30
Группа: Редакторы
Ранг: Обитатель
Сообщений: 431
Репутация: 193 ±
Замечаний: 0% ±

Цитата (Alex_ST)
ну самоучка я

Сам из таких) И с VBA, кстати, имею дело относительно недавно - год-полтора smile

Цитата (Alex_ST)
Я никогда не понимал сути переменных, объявляемых As Byte

Alex_ST, Byte - от 0 до 255. Ты лучше взгляни на этого зверя
[vba]
Код
Sub io()
Dim x
With Selection
      x = IIf(.Count = 1, .Offset(1), .Cells).Value
End With
End Sub
[/vba]

- при выделении нескольких ячеек создается массив
- при выделении одной берется значение ячейки на строку ниже : )

Утрировано суть: IIf().Value happy

p.s.: сейчас изучаю JavaScript. Весело)


Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук


YM 41001156540584 / WM WMR R21924176233

https://github.com/nervgh/vba


Сообщение отредактировал nerv - Понедельник, 21.11.2011, 21:48
 
Ответить
Сообщение
Цитата (Alex_ST)
ну самоучка я

Сам из таких) И с VBA, кстати, имею дело относительно недавно - год-полтора smile

Цитата (Alex_ST)
Я никогда не понимал сути переменных, объявляемых As Byte

Alex_ST, Byte - от 0 до 255. Ты лучше взгляни на этого зверя
[vba]
Код
Sub io()
Dim x
With Selection
      x = IIf(.Count = 1, .Offset(1), .Cells).Value
End With
End Sub
[/vba]

- при выделении нескольких ячеек создается массив
- при выделении одной берется значение ячейки на строку ниже : )

Утрировано суть: IIf().Value happy

p.s.: сейчас изучаю JavaScript. Весело)

Автор - nerv
Дата добавления - 21.11.2011 в 21:46
Alex_ST Дата: Пятница, 23.12.2011, 12:47 | Сообщение № 31
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3214
Репутация: 615 ±
Замечаний: 0% ±

2003
Я тут случайно полез к код функции "ИЗВЛЕЧЬ_ЦЕЛЫЕ" и обнаружил, что с обработкой ошибок перемудрил. Можно упростить так:[vba]
Код
Function ИЗВЛЕЧЬ_ЦЕЛЫЕ(ParamArray ДИАПАЗОН())
     '---------------------------------------------------------------------------------------
     ' Purpose      : создать массив из целых чисел, извлечённых из текста произвольно расположенных ячеек
     ' Notes        : К полученному массиву можно применять любые стандартные формулы листа
     ' Notes        : Если цифр в ячейках-аргументах функции нет, то возвращается КОРРЕКТНОЕ #Н/Д
     '---------------------------------------------------------------------------------------
     Dim rArea, rCell, sStr$, oMatches, i&, Arr()
     On Error GoTo xlErrEXIT
     For Each rArea In ДИАПАЗОН
        For Each rCell In IIf(rArea.Count = 1, Array(rArea.Value), rArea.Value)
           sStr = sStr & " " & rCell
        Next rCell
     Next rArea
     With CreateObject("VBScript.RegExp"): .Global = True: .Pattern = "\d+": Set oMatches = .Execute(sStr): End With
     ReDim Arr(1 To oMatches.Count)
     For i = 0 To oMatches.Count - 1: Arr(i + 1) = CLng(oMatches(i).Value): Next i
     ИЗВЛЕЧЬ_ЦЕЛЫЕ = Arr
xlErrEXIT:    If Err Then ИЗВЛЕЧЬ_ЦЕЛЫЕ = CVErr(xlErrValue)  ' вернуть ошибку #ЗНАЧЕНИЕ если была ошибка
End Function
[/vba]



С уважением,
Алексей
MS Excel 2003 - the best!!!
 
Ответить
СообщениеЯ тут случайно полез к код функции "ИЗВЛЕЧЬ_ЦЕЛЫЕ" и обнаружил, что с обработкой ошибок перемудрил. Можно упростить так:[vba]
Код
Function ИЗВЛЕЧЬ_ЦЕЛЫЕ(ParamArray ДИАПАЗОН())
     '---------------------------------------------------------------------------------------
     ' Purpose      : создать массив из целых чисел, извлечённых из текста произвольно расположенных ячеек
     ' Notes        : К полученному массиву можно применять любые стандартные формулы листа
     ' Notes        : Если цифр в ячейках-аргументах функции нет, то возвращается КОРРЕКТНОЕ #Н/Д
     '---------------------------------------------------------------------------------------
     Dim rArea, rCell, sStr$, oMatches, i&, Arr()
     On Error GoTo xlErrEXIT
     For Each rArea In ДИАПАЗОН
        For Each rCell In IIf(rArea.Count = 1, Array(rArea.Value), rArea.Value)
           sStr = sStr & " " & rCell
        Next rCell
     Next rArea
     With CreateObject("VBScript.RegExp"): .Global = True: .Pattern = "\d+": Set oMatches = .Execute(sStr): End With
     ReDim Arr(1 To oMatches.Count)
     For i = 0 To oMatches.Count - 1: Arr(i + 1) = CLng(oMatches(i).Value): Next i
     ИЗВЛЕЧЬ_ЦЕЛЫЕ = Arr
xlErrEXIT:    If Err Then ИЗВЛЕЧЬ_ЦЕЛЫЕ = CVErr(xlErrValue)  ' вернуть ошибку #ЗНАЧЕНИЕ если была ошибка
End Function
[/vba]

Автор - Alex_ST
Дата добавления - 23.12.2011 в 12:47
Alex_ST Дата: Четверг, 05.06.2014, 13:51 | Сообщение № 32
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3214
Репутация: 615 ±
Замечаний: 0% ±

2003
Оказывается, ещё чуть подпилил у себя, а сюда добавить забыл... :(
Теперь если цифр нет, то вернёт ошибку #Н/Д как обычная функция листа.



С уважением,
Алексей
MS Excel 2003 - the best!!!


Сообщение отредактировал Alex_ST - Четверг, 05.06.2014, 13:54
 
Ответить
СообщениеОказывается, ещё чуть подпилил у себя, а сюда добавить забыл... :(
Теперь если цифр нет, то вернёт ошибку #Н/Д как обычная функция листа.

Автор - Alex_ST
Дата добавления - 05.06.2014 в 13:51
  • Страница 2 из 2
  • «
  • 1
  • 2
Поиск:

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