Отрезаем последнее предложение в ячейке

Программирование на Visual Basic for Applications
rdva
Новичок
Новичок
 
Сообщения: 36
Зарегистрирован: 16.01.2007 (Вт) 20:36

Отрезаем последнее предложение в ячейке

Сообщение rdva » 25.01.2007 (Чт) 14:28

Задача:
Если в ячейке текст длиной более 512 символов, то обрезаем его по последнюю ближайшую к границе "512" точку (".").

Такой код оптимален?
Код: Выделить всё

if Len(Worksheets("price.ru").Cells(rwindex - 5, 3).Value) > 512 Then
            Rezka = Left(Worksheets("price.ru").Cells(rwindex - 5, 3).Value, 512)
            Dot = InStrRev(Rezka, ".")
            Rezka = Left(Rezka, Dot)
            Worksheets("price.ru").Cells(rwindex - 5, 3).Value = Rezka
End If

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 25.01.2007 (Чт) 14:46

А если точки не будет?
Lasciate ogni speranza, voi ch'entrate.

Krasnaja Shapka
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 87
Зарегистрирован: 26.10.2006 (Чт) 12:13
Откуда: Киев

Сообщение Krasnaja Shapka » 25.01.2007 (Чт) 15:00

ну, если важна скорость, то как минимум надо приравнять Worksheets("price.ru").Cells(rwindex - 5, 3).Value к какой-то переменной...

или вставить условие в
With Worksheets("price.ru").Cells(rwindex - 5, 3)
End With

убрать лишние переменные - Dot и Rezka - все запихнуть в
.Value = Left(.Value,InStrRev(Left(.Value,512), "."))

ну и проверку на наличие точки впихнуть... :)
Если ясность вашего объяснения исключает ложное толкование, все равно кто-то поймет вас неправильно.

Чудовище под кроватью
Обычный пользователь
Обычный пользователь
 
Сообщения: 88
Зарегистрирован: 27.11.2006 (Пн) 14:46
Откуда: А из ника не ясно?

Re: Отрезаем последнее предложение в ячейке

Сообщение Чудовище под кроватью » 25.01.2007 (Чт) 15:01

rdva писал(а):Задача:
Если в ячейке текст длиной более 512 символов, то обрезаем его по последнюю ближайшую к границе "512" точку (".").

Такой код оптимален?
Код: Выделить всё
if Len(Worksheets("price.ru").Cells(rwindex - 5, 3).Value) > 512 Then
            Rezka = Left(Worksheets("price.ru").Cells(rwindex - 5, 3).Value, 512)
            Dot = InStrRev(Rezka, ".")
            Rezka = Left(Rezka, Dot)
            Worksheets("price.ru").Cells(rwindex - 5, 3).Value = Rezka
End If

Может так:
Код: Выделить всё

With Worksheets("price.ru").Cells(rwindex - 5, 3)
    If Len(.Value) > 512 Then _
       .Value = Left(.Value, InStrRev(.Value, ".", 512))
End With
Последний раз редактировалось Чудовище под кроватью 25.01.2007 (Чт) 15:16, всего редактировалось 1 раз.
У-у-у!!

Krasnaja Shapka
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 87
Зарегистрирован: 26.10.2006 (Чт) 12:13
Откуда: Киев

Re: Отрезаем последнее предложение в ячейке

Сообщение Krasnaja Shapka » 25.01.2007 (Чт) 15:10

InStrRev(.Value, ".", 512), это да-а-а.... :) еще круче...
Если ясность вашего объяснения исключает ложное толкование, все равно кто-то поймет вас неправильно.

rdva
Новичок
Новичок
 
Сообщения: 36
Зарегистрирован: 16.01.2007 (Вт) 20:36

Сообщение rdva » 25.01.2007 (Чт) 15:28

Примерно так?

Код: Выделить всё
With Worksheets("price.ru").Cells(rwindex - 5, 3)
            If Len(.Value) > 512 Then
                If InStrRev(.Value, ".") <> 0 Then
                    .Value = Left(.Value, InStrRev(.Value, ".", 512))
                Else
                    .Value = Left(.Value, 512)
                End If
            End If
End With

bi-lya
Обычный пользователь
Обычный пользователь
 
Сообщения: 87
Зарегистрирован: 07.08.2006 (Пн) 15:36

Сообщение bi-lya » 26.01.2007 (Пт) 2:41

Можно так сделать, что-бы обрезать по точку
Код: Выделить всё
With Worksheets("price.ru").Cells(rwindex - 5, 3)
            If Len(.Value) > 512 Then
                If InStr(.Value, ".") <> 0 Then
                    .Value = Mid(.Value, 1, InStrRev(.Value, ".", -1))
                Else
                    .Value = Left(.Value, 512)
                End If
            End If
End With
Последний раз редактировалось bi-lya 26.01.2007 (Пт) 10:30, всего редактировалось 2 раз(а).

Чудовище под кроватью
Обычный пользователь
Обычный пользователь
 
Сообщения: 88
Зарегистрирован: 27.11.2006 (Пн) 14:46
Откуда: А из ника не ясно?

Сообщение Чудовище под кроватью » 26.01.2007 (Пт) 7:09

bi-lya писал(а):Что-бы обрезать по точку
Код: Выделить всё
With Worksheets("price.ru").Cells(rwindex - 5, 3)
            If Len(.Value) > 512 Then
                If InStr(.Value, ".") <> 0 Then
                    a = InStrRev(.Value, ".", 1)
                    .Value = Mid(.Value, 1, a)
                Else
                    .Value = Left(.Value, 512)' это что-бы оставить только 512 символов?
                End If
            End If
End With

bi-lya
Ты в код вникни. - Обрезать надо по точку, которая стоит в первых 512 символах (если она там вообще есть!). А теперь посмотри, что у тебя происходит:
Код: Выделить всё
With Worksheets("price.ru").Cells(rwindex - 5, 3)
'если длина > 512, то:
            If Len(.Value) > 512 Then
            'если в строке есть точка, то:
                If InStr(.Value, ".") <> 0 Then
                'попробовать найти в строке точку
                'двигаясь от первого символа, к начальному,
                'то бишь опять же к первому. :)
                    a = InStrRev(.Value, ".", 1)
                'независимо от того, найдена ли точка в
                'ПЕРВОМ символе строки, попробовать вырезать
                'из строки символы с первого по а. Где а=0 или
                'единице - в зависимости от того, найдена ли
                'точка в первом символе строки.
                    .Value = Mid(.Value, 1, a)
                Else
                    .Value = Left(.Value, 512)
                End If
            End If
End With


rdva
Все нормально. Только... может, если точки нет, то хотя бы по первый пробел обрезать - во избежание всяких казусов: обрезанные слова и номера могут выглядеть, как обычные. Но это конечно зависит от того, какие данные.
У-у-у!!

bi-lya
Обычный пользователь
Обычный пользователь
 
Сообщения: 87
Зарегистрирован: 07.08.2006 (Пн) 15:36

Сообщение bi-lya » 26.01.2007 (Пт) 8:38

Чудовище под кроватью
1. "...попробовать найти в строке точку двигаясь от первого символа, к начальному то бишь опять же к первому..." вы внимательно МОЙ код смотрели:
Код: Выделить всё
If InStr(.Value, ".") <> 0 Then
? Вообще-то я использовал InStr, а не InStrRev - две большие разницы. То есть для того, чтобы определить, есть или нет точка - вполне достаточно!
2. Второе замечание без комментариев, за отсутствием состава проблемы - читайте внимательно коды

Чудовище под кроватью
Обычный пользователь
Обычный пользователь
 
Сообщения: 88
Зарегистрирован: 27.11.2006 (Пн) 14:46
Откуда: А из ника не ясно?

Сообщение Чудовище под кроватью » 26.01.2007 (Пт) 9:21

:D Я даже комментировать не буду - сейчас ты сам внимательно прочтешь еще раз все, что я написал, скопируешь свой код себе в VBE. Попробуешь запустить (изменив, разумеется, rwindex), посмотришь в отладчике, что происходит, параллельно читая мои комменты, увидишь результат, который сильно тебя удивит (будет либо пусто, либо точка).
После этого отредактируй свой пост.
У-у-у!!

bi-lya
Обычный пользователь
Обычный пользователь
 
Сообщения: 87
Зарегистрирован: 07.08.2006 (Пн) 15:36

Сообщение bi-lya » 26.01.2007 (Пт) 9:53

Чудовище под кроватью Ну если вам трудно минус воткнуть... :wink:
Код: Выделить всё
.Value = Mid(.Value, 1, InStrRev(.Value, ".", -1))

Можно (как я понял условие) вообще на одних InStr сделать
Код: Выделить всё
.Value = Mid(.Value, 1, InStr(.Value, "."))
:D

Чудовище под кроватью
Обычный пользователь
Обычный пользователь
 
Сообщения: 88
Зарегистрирован: 27.11.2006 (Пн) 14:46
Откуда: А из ника не ясно?

Сообщение Чудовище под кроватью » 26.01.2007 (Пт) 9:59

bi-lya
Можно (как я понял условие) вообще на одних InStr сделать

Значит, помимо запуска своего кода еще и перечитай условие. - Точка должна быть последней.
Надеюсь, прежде, чем еще что-то написать в этом топике, ты все же внимательно вникнешь в свой код (в первую очередь) и в условие задачи.
У-у-у!!

bi-lya
Обычный пользователь
Обычный пользователь
 
Сообщения: 87
Зарегистрирован: 07.08.2006 (Пн) 15:36

Сообщение bi-lya » 26.01.2007 (Пт) 10:29

Чудовище под кроватью писал(а):bi-lya
- Точка должна быть последней.

Да нет, это не явно сказано! А коды работают.
Кстати! Поздравляю с лейтенантом (или прапорщиком - не вижу полосок?)!!! :P

Чудовище под кроватью
Обычный пользователь
Обычный пользователь
 
Сообщения: 88
Зарегистрирован: 27.11.2006 (Пн) 14:46
Откуда: А из ника не ясно?

Сообщение Чудовище под кроватью » 26.01.2007 (Пт) 10:46

bi-lya
Буду краток:
Если в ячейке текст длиной более 512 символов, то обрезаем его по последнюю ближайшую к границе "512" точку (".").
У-у-у!!

bi-lya
Обычный пользователь
Обычный пользователь
 
Сообщения: 87
Зарегистрирован: 07.08.2006 (Пн) 15:36

Сообщение bi-lya » 26.01.2007 (Пт) 10:56

Чудовище под кроватью Да ладно, не будем спорить о таинствах великого и могучего...
Вообще, почему возникло замечание про точку? В моих обоих кодах они как раз и остаются :wink:
ТОВАРИЩ - ПРОВЕРЬ, ПРЕЖДЕ ЧЕМ ХАЯТЬ!
А я в свое время упомянул точку потому, что условие могло бы быть таким, что в строке ДО 512 символа могли бы быть точки, ВОТ ТОГДА InStrRev действительно необходим, но нужно еще создавать условие ... - ну это тема другая. Здесь InStrRev не нужна по-идее :!:
Да и к тому же автор топика не указал, где должна находиться точка - ДО 512 символа или ПОСЛЕ. Извините, уважаемый, но ваш код
Код: Выделить всё
.Value = Left(.Value, InStrRev(.Value, ".", 512))
э-э-э, мягко говоря, не соответсвует поставленному условию, обрабатывается только часть строки... :cry:
Последний раз редактировалось bi-lya 26.01.2007 (Пт) 11:16, всего редактировалось 1 раз.

Чудовище под кроватью
Обычный пользователь
Обычный пользователь
 
Сообщения: 88
Зарегистрирован: 27.11.2006 (Пн) 14:46
Откуда: А из ника не ясно?

Сообщение Чудовище под кроватью » 26.01.2007 (Пт) 11:15

bi-lya писал(а):Здесь InStrRev не нужна по-идее :!:

Не используя InStrRev реализуй следущую строку (Она находит первую ближайшую к 512 точку, т.е. именно то, что требовалось по условию):
Код: Выделить всё
InStrRev(.Value, ".", 512)

... только чур без потерь по быстродействию.

rdva
Кстати, проверять на наличие точки надо не всю строку, а только первые 512 символов.
У-у-у!!

Чудовище под кроватью
Обычный пользователь
Обычный пользователь
 
Сообщения: 88
Зарегистрирован: 27.11.2006 (Пн) 14:46
Откуда: А из ника не ясно?

Сообщение Чудовище под кроватью » 26.01.2007 (Пт) 11:23

bi-lya
автор топика не указал, где должна находиться точка - ДО 512 символа или ПОСЛЕ.

А как ты считаешь, "последнее предложение" находится ДО или ПОСЛЕ 512-го символа?! :D
Читай заголовок:
Отрезаем последнее предложение в ячейке
У-у-у!!

bi-lya
Обычный пользователь
Обычный пользователь
 
Сообщения: 87
Зарегистрирован: 07.08.2006 (Пн) 15:36

Сообщение bi-lya » 26.01.2007 (Пт) 11:23

Чудовище под кроватью
Я несколько поправил свое предыдущее, посмотрите. Как раз про "...Кстати, проверять на наличие точки надо не всю строку, а только первые 512 символов..." - где это сказано?
Вот условие - "...то обрезаем его по последнюю ближайшую к границе "512" точку (".")...". ЗА или ПОСЛЕ - НЕ СКАЗАНО. Кто прав?! Мои коды обрабатывают все согласно условий :!:
И не сказано, что точка - обязательно 512 символ
Ладно, я пошел. Рад был пообщаться 8)

Чудовище под кроватью
Обычный пользователь
Обычный пользователь
 
Сообщения: 88
Зарегистрирован: 27.11.2006 (Пн) 14:46
Откуда: А из ника не ясно?

Сообщение Чудовище под кроватью » 26.01.2007 (Пт) 12:13

bi-lya
Про 512 символов:

нас не интересует все, что вне первых 512 символов. Поэтому и проверять на наличие точки надо только эти 512 символов. Иначе может появиться ситуация, когда 514-м символов будет точка (т.е. условие InStr(.Value, ".") <> 0 выполняется), но найти "." в первых 512 символах может не получиться. В результате чего строка может просто потеряться.
У-у-у!!

Krasnaja Shapka
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 87
Зарегистрирован: 26.10.2006 (Чт) 12:13
Откуда: Киев

Сообщение Krasnaja Shapka » 26.01.2007 (Пт) 15:11

rdva писал(а):Примерно так?

Код: Выделить всё
With Worksheets("price.ru").Cells(rwindex - 5, 3)
            If Len(.Value) > 512 Then
                If InStrRev(.Value, ".") <> 0 Then
                    .Value = Left(.Value, InStrRev(.Value, ".", 512))
                Else
                    .Value = Left(.Value, 512)
                End If
            End If
End With


проверку
Код: Выделить всё
If InStrRev(.Value, ".") <> 0

замени на проверку
Код: Выделить всё
If InStrRev(.Value, ".", 512) <> 0

иначеточка может оказаться после 512 символа и все буде плохо...

p.s. ну вы, bi-lya, и любите спорить на голом месте, это звиздец... :)
Если ясность вашего объяснения исключает ложное толкование, все равно кто-то поймет вас неправильно.

Чудовище под кроватью
Обычный пользователь
Обычный пользователь
 
Сообщения: 88
Зарегистрирован: 27.11.2006 (Пн) 14:46
Откуда: А из ника не ясно?

Сообщение Чудовище под кроватью » 26.01.2007 (Пт) 15:37

Krasnaja Shapka писал(а):проверку
Код: Выделить всё
If InStrRev(.Value, ".") <> 0

замени на проверку
Код: Выделить всё
If InStrRev(.Value, ".", 512) <> 0

иначеточка может оказаться после 512 символа и все буде плохо...

Тогда наверное, надо завести:
Код: Выделить всё
Dim lngPointPos As Long

, чтобы два раза не вызывать поиск по строке?
Т.е.:
Код: Выделить всё

    Dim lngPointPos As Long
    With Worksheets("price.ru").Cells(rwindex - 5, 3)
        If Len(.Value) > 512 Then
            lngPointPos = InStrRev(.Value, ".", 512)
            If lngPointPos > 0 Then
                .Value = Left(.Value, lngPointPos)
            Else
                .Value = Left(.Value, 512)
            End If
        End If
    End With
У-у-у!!


Вернуться в VBA

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 121

    TopList