Sub Macro1()
Dim iText As String
Dim iArray() As String
Dim i&
iText = Range("A1").Text
iArray = Split(iText, " ")
For i = 0 To UBound(iArray)
ActiveCell.Value = ActiveCell.Value & Left(iArray(i), 4) & " "
Next i
End Sub
Function CutWords(WordsSource As Range, SymbNum As Long) As String
Dim iText As String
Dim iArray() As String
Dim i&
Dim NewStrng As String
iText = WordsSource
iArray = Split(iText, " ")
For i = 0 To UBound(iArray)
NewStrng = NewStrng & Left(iArray(i), SymbNum) & " "
Next i
CutWords = NewStrng
End Function
uhm писал(а):У-у, я то думал...
Высший пилотаж - решить такую задачу с помощью формулы В ОДНОЙ ЯЧЕЙКЕ, которая не будет использовать промежуточных ячеек, и которая не будет зависеть от количества слов в исходной ячейке. Тот вид, в котором задача решена сейчас, ни одному критерию не удовлетворяет, и никакого интереса не представляет - при такой постановке, задача тривиальна.
Подозреваю, правда, что в данной задаче решение, удовлетворяющее моим критериям невозможно.
@Nik писал(а):Высшый пилотаж в экселе - это научиться разумно сочетать подпрограммы на ВБА с формулами экселя. Т.е. те моменты, которые проще реализовать при помощи формул - делать их формулами, а которые проще программой (как в данном случае) - сделать программой. Оптимальный вариант, я думаю, будет таким:
- Код: Выделить всё
Function CutWords(WordsSource As Range, SymbNum As Long) As String
Dim iText As String
Dim iArray() As String
Dim i&
Dim NewStrng As String
iText = WordsSource
iArray = Split(iText, " ")
For i = 0 To UBound(iArray)
NewStrng = NewStrng & Left(iArray(i), SymbNum) & " "
Next i
CutWords = NewStrng
End Function
т.е. создать пользовательскую функцию.... Тогда формулу "=CutWords(C9;4)" можно будет распространять в любом направлении, чего не сделаешь в случае реализацией формулами.... Получилось предельно просто, наглядно и рационально.... за что я и люблю эксель!
Function SplitText(strText As String, strSeparator As String) As Variant
SplitText = Split(strText, strSeparator)
End Function
Function JoinArray(arrSource As Variant, strSeparator As String) As String
JoinArray = Join(arrSource, strSeparator)
End Function
Только я забыл сказать, что подразумевалось реализовать это именно формулами экселя..... Smile Можете сделать ещё одну попытку
anvg писал(а):А что вернёт твоя функция, если пробелов между словами 2?
anvg писал(а):Если после слова стоят: двоеточие, точка с запятой, запятая, точка и т. д.; то есть обычное предложение? Будет ли выполняться исходное условие?
anvg писал(а):твоя реализация - есть использование формул Excel - каких?
@Nik писал(а):Мой товарищ подкинул очередную задачку:
Функция ПОИСКПОЗ(...;...;0) - ищет смещение до первого совпадения, а задача стоит в том, чтобы найти смещение до последнего совпадения, при чём искать подстроку, а не конкретное числовое значение или целую строку
Те, кто заинтересовался, пока ниже не смотрят, там будет мой вариант решения.....
{=МАКС(ЕСЛИ(ЕОШИБКА(ПОИСК("*" & G2&"*";D3:D11));0;СТРОКА(D3:D11)-СТРОКА(D2)))}
где D3:D11 - просматриваемый массив;
D2 - ячейка, на строку выше начала просматриваемого диапазона;
в G2 - искомая подстрока
=ВЫЧИСЛИТЬ("ПСТР(""" & ПОДСТАВИТЬ(A1;" ";""";1;4) & "" "" & ПСТР(""") & """;1;4)")
Aent2007 писал(а):Решение первой задачи (об обрезании слов)
Пусть искомая строка находится в ячейке $A$1.
Через Вставка->Имя->Присвоить определяем имя Result как
- Код: Выделить всё
=ВЫЧИСЛИТЬ("ПСТР(""" & ПОДСТАВИТЬ(A1;" ";""";1;4) & "" "" & ПСТР(""") & """;1;4)")
В ячейку $B$1 пишем формулу =Result
Ву-аля.
Заметьте, что функция ВЫЧИСЛИТЬ (из макроязыка Excel4) не может быть непосредственно применена на листе.
@Nik писал(а):Напр, в яч. А1 разместить:
{=ПОИСКПОЗ(1;--(ПОИСКПОЗ(C3:C11&D3:D11;C3:C11&D3:D11;0)<>СТРОКА(C3:C11)-СТРОКА(C2));0)}
KL писал(а):Нет необходимости конвертировать логические значения в числовые.
KL писал(а):В этих случаях можно еще использовать комбинацию из Усл.Форматирования и Проверки.
@Nik писал(а):Да, я знаю, просто мне синтаксис "ПОИСКПОЗ(1;--(..." больше понравился, чем "ПОИСКПОЗ(ИСТИНА; ....".
@Nik писал(а):А можете привести пример, что вы имели в виду... оч. интересно...
@Nik писал(а):Уважаемые Aent2007 или KL, поясните, плиз, тёмным, вроде меня что это вы тут такое насочиняли и как оно работает ? И что это за функция ВЫЧИСЛИТЬ() такая ? Как её найти в справке ?
#If Not VBA6 Then
Function Split(sStr As Variant, sdelim As String) As Variant
Split = Evaluate("{""" & Application.Substitute(sStr, sdelim, """,""") & """}")
End Function
#End If
=ВЫЧИСЛИТЬ("ПСТР(""" & ПОДСТАВИТЬ(A1;" ";""";1;4) & "" "" & ПСТР(""") & """;1;4)")
@Nik писал(а):И всё-таки, помогите разобраться.... сам не могу:=ВЫЧИСЛИТЬ("ПСТР(""" & ПОДСТАВИТЬ(A1;" ";""";1;4) & "" "" & ПСТР(""") & """;1;4)")
"ВЫЧИСЛИТЬ" - понятно, "ПСТР(""" & - тоже
а вот ПОДСТАВИТЬ(A1;" ";""";1;4) и дальше - жуть... Как это понять ?
@Nik писал(а):Ещё такой вопрос: А можно ли как-то вытащить массив, лежащий в другой ячейке ?
Например:
в А1 лежит: ={1;2;6;7;9}
в А2 формула, которой нужны числа из А1
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 15