Страницы: 1
RSS
Вытащить номер заказа из текста в ячейках
 
Здравствуйте.  
Необходима ваша помощь в след. вопросе.  
Есть статистика по оплаченными счетам. Необходимо из ячеек в столбце L с текстом вытащить только номера счетов, скажем на лист ИТОГОВЫЙ также в столбец L. А ячейки, где номер счета отсутствует, просто копировались в ИТОГОВЫЙ лист, либо вообще не копировались. Номера счетов идут в формате: X0000000  (7 цифр). Однако бывает косяк: после буквы стоит пробел, вместо нуля идет буква О, вместо W пишут две VV, вместо англ С пишется русская С, так же с буквой Т, вместо S иногда попадается цифра 5 или цифра 8 ... Если бы этого косяка не было, можно было бы попробовать формулой, к примеру ПСТР(L42;ПОИСК("W";L42;1);8 . Но здесь не получится... Просьба помочь в данном вопросе.
 
Попробуйте для начала  
'выделяет числа из ячейки  
Function GetNumbers(TargetCell As Range) As String  
   Dim LenStr As Long  
   For LenStr = 1 To Len(TargetCell)  
       Select Case Asc(Mid(TargetCell, LenStr, 1))  
       Case 48 To 57  
           GetNumbers = GetNumbers & Mid(TargetCell, LenStr, 1)  
       End Select  
   Next  
End Function
 
Ну можно сперва по всему столбцу заменить "VV" на "W" - там вряд ли будут другие нужные "VV".  
А вообще задача непростая, судя по примеру. Там есть ячейки, где вообще отбирать ничего не нужно?  
Например    
5331/2    Инкассация денежных средств+ООО "НЕРРИС"+            
Оплата с-но Договор N П 10/2009-4 от 7 октября, за бытовую технику. В в.ч. НДС 61016.95 руб.
 
Не получится, т.к. косяк с буквами, вместо цифр, о чем я писал выше..  
 
{quote}{login=}{date=03.06.2011 11:49}{thema=}{post}Попробуйте для начала  
'выделяет числа из ячейки  
Function GetNumbers(TargetCell As Range) As String  
   Dim LenStr As Long  
   For LenStr = 1 To Len(TargetCell)  
       Select Case Asc(Mid(TargetCell, LenStr, 1))  
       Case 48 To 57  
           GetNumbers = GetNumbers & Mid(TargetCell, LenStr, 1)  
       End Select  
   Next  
End Function{/post}{/quote}
 
{quote}{login=Hugo}{date=03.06.2011 11:56}{thema=}{post}Ну можно сперва по всему столбцу заменить "VV" на "W" - там вряд ли будут другие нужные "VV".  
А вообще задача непростая, судя по примеру. Там есть ячейки, где вообще отбирать ничего не нужно?  
Например    
5331/2    Инкассация денежных средств+ООО "НЕРРИС"+            
Оплата с-но Договор N П 10/2009-4 от 7 октября, за бытовую технику. В в.ч. НДС 61016.95 руб.{/post}{/quote}  
 
Да, ячейки, где нет такого формата X0000000 , как вы указали, отбирать вообще не нужно... Можно конечно автозаменой заменить VV на W, как и другие косяки, но они бывают совершенно разные. То там ошибка, то в цифру буквой заменят, то еще что-то... Допустим, мы ошибки исправим: там, где должна быть цифра, стоит буква, мы вручную исправим. Можно выборку тогда сделать ТОЛЬКО по цифрам, т.е. формат взять в лист ИТОГОВЫЙ не X0000000, а 0000000 ?
 
Можно на Regexp сделать - отбирать 7 цифр подряд, и с буквой впереди. Но ведь есть варианты 8 цифр без буквы..., или 7 цифр, но с двумя буквами:  
Оплата по счету-договору №W0678079 от 31.05.2011  
Оплата по счету NS0172678 от 1.06.11  
 
Но я не спец по Regexp...
 
{quote}{login=stevie4}{date=03.06.2011 11:41}{thema=Вытащить номер заказа из текста в ячейках}{post}Однако бывает косяк: после буквы стоит пробел, вместо нуля идет буква О, вместо W пишут две VV, вместо англ С пишется русская С, так же с буквой Т, вместо S иногда попадается цифра 5 или цифра 8 ...{/post}{/quote}  
Выгнать сотрудника, который такую фигню сотворил. Предварительно оторвать руки: они в любом случае кривые и не пригодятся.
 
Вот есть UDF - автор не я:  
 
Function FindDigits(ByVal txt$, ByVal DigitsCount%) As String  
   ' ищет в строке txt$ подстроку цифр длиной DigitsCount%  
   Dim RegExp As Object  
   Set RegExp = CreateObject("VBScript.RegExp"): RegExp.Global = True  
   RegExp.Pattern = "[\D]": txt$ = " " & RegExp.Replace(txt$, " ") & " "
   RegExp.Pattern = " [\d]{" & DigitsCount% & "} "
   If RegExp.test(txt$) Then FindDigits = Trim$(RegExp.Execute(txt$)(0).Value)  
End Function  
 
Может можно подшаманить, или в стандартную формулу добавить...
 
Вот типа так - нашли номер, нашли его позицию, взяли символ до и приклеили:  
 
=MID(L10;FIND(FindDigits(L10;7);L10;1)-1;1)&FindDigits(L10;7)
 
Что получилось, см. файл
 
{quote}{login=Юрий М}{date=03.06.2011 12:38}{thema=Re: Вытащить номер заказа из текста в ячейках}{post}{quote}{login=stevie4}{date=03.06.2011 11:41}{thema=Вытащить номер заказа из текста в ячейках}{post}Однако бывает косяк: после буквы стоит пробел, вместо нуля идет буква О, вместо W пишут две VV, вместо англ С пишется русская С, так же с буквой Т, вместо S иногда попадается цифра 5 или цифра 8 ...{/post}{/quote}  
Выгнать сотрудника, который такую фигню сотворил. Предварительно оторвать руки: они в любом случае кривые и не пригодятся.{/post}{/quote}  
 
Вы правы))) Знать бы, кто так сделал, сам заделался в палачи)
 
{quote}{login=Hugo}{date=03.06.2011 12:47}{thema=}{post}Что получилось, см. файл{/post}{/quote}  
 
Hugo, спасибо большое за помощь. Этого мне вполне хватит. Скажу руководству, пусть шаманят над корректностью выгрузки, тогда и не придется в исходнике ничего исправлять, и счета будут корректно все выгружаться. А здесь итак неплохо)
 
Но С на C и T на Т не меняет, и возможные восьмизначные не вытягивает. Ну хоть так.
 
{quote}{login=Hugo}{date=03.06.2011 12:58}{thema=}{post}Но С на C и T на Т не меняет, и возможные восьмизначные не вытягивает. Ну хоть так.{/post}{/quote}  
 
Да, я понял. Мне итак сойдет))) Что поделаешь, когда такая косячная выгрузка идет...
Страницы: 1
Читают тему
Наверх