Страницы: 1
RSS
Аналог функции IsNumeric для текста
 
Передо мной стоит задача раскидать по двум массивам текст и числа из строк, содержащих состав ткани.
50% вискоза, 30% акрил, 11% полиэстер, 7% полиамид например такой состав
В итоге должен получиться массив с числами 50, 30, 11, 7 и массив со словами вискоза, акрил, полиэстер, полиамид

Отделить числа я могу функцией IsNumeric, но не могу найти решение для текста
Application.IsText считает  и знак % и запятую и пробел текстом, а мне нужны только буквы.

Помогите, пожалуйста
 
Татьяна Агафонова, Если фигурирует Application.IsText то предположу что VBA, тогда
1. зачем огород городить, если нужно просто сперва заменить % на , и засплитить, нечетными будут числа, четными текст. Ну пробелы могут остаться, но это тоже дело техники.
2. ну регуляркой можно проверить, только точно в названии материала не может быть цифр?
3. думаю еще варианты найдутся.
По вопросам из тем форума, личку не читаю.
 
БМВ, простите, не уточнила, да VBA
1. что такое засплитить? (и текст и числа могут располагаться в каком угодно порядке (т.е. 100% хлопок и 100хлопок и хлопок 100% ну как на заводе менеджеру вздумается))
2. что такое регулярка? нет, сам состав - это всегда слово

Пока была мысль просто отделять по букве слева от текста, решать буква это или цифра и если следом идет буква или цифра сцеплять их, и так до следующей цифры или буквы, результат сцепки отправлять в массив.
Застопорилась на поиске функции, которая даст ответ на вопрос "буква ли это" - да/нет

Добавила примерный набросок кода, то как это примерно мне представлялось в общих чертах

Код
Sub Правка_состава()
Dim shtSpec As Worksheet    'лист спецификация
Dim rngAll As Range         'спецификация
Dim i As Long               'счетчик цикла1
Dim j As Long               'счетчик цикла2
Dim u As Long               'счетчик цикла2
Dim Nrow As Long            'номер строки в спецификации
Dim strSost As String       'содержимое ячеек с составом
Dim a As String             'первый знак состава
Dim Ch As String            'одно число в составе в виде текста
Dim Tx As String            'одно слово в составе в виде текста
Dim C(15) As String        'массив всех 15 полных чисел в составе в виде текста
Dim T(15) As String        'массив всех 15 полных слов в составе в виде текста


    Set shtSpec = ActiveWorkbook.ActiveSheet                    'лист со спецификацией
    Set rngAll = shtSpec.Range("A1").CurrentRegion              'спецификация
    Nrow = rngAll.Rows.Count                                    'число строк спецификации

For i = 2 To Nrow
    strSost = shtSpec.Cells(i, 5).Value
        For j = 1 To Len(strSost)
            a = Mid(strSost, j, 1)
                If IsNumeric(a) = True Then
                    Ch = Ch & a
                ElseIf Application.IsText(a) = True Then
                    Tx = Tx & a
                Else
                If Ch <> "" Then
                    For u = 1 To 15
                        If C(u) = "" Then
                        C(u) = Ch
                        Exit For
                        End If
                    Next u
                End If
                If Tx <> "" Then
                    For u = 1 To 15
                        If T(u) = "" Then
                        T(u) = Tx
                        Exit For
                        End If
                    Next u
                    End If
                End If
        Next j
Next i


End Sub
Изменено: Татьяна Агафонова - 07.09.2018 19:42:14
 
Код
Function IsText(ByVal s) As Boolean
  IsText = LCase(s) <> UCase(s)
End Function
Владимир
 
засплитить - Split и её подруга Join.
ну если совсем так плохо как в последнем примере, то или регулярными выражениями, тут есть два Кузьмы, им хлеба не надо, дай что нить зарегулярить, ну или как написали, перебор с проверкой, Проверка простая ASC()  и сравнить с кодами первой и последней буквой, большой и маленькой. Полученный код должен быть между ними. Пропусков там нет.
По вопросам из тем форума, личку не читаю.
 
Цитата
раскидать по двум массивам текст и числа из строк, содержащих состав ткани.
Поскольку примера нет, то в А1( 50% вискоза, 30% акрил, 11% полиэстер, 7% полиамид) ваш текст, в столбцах В и С массивы
Код
Sub iMassiv()
Dim i As Long
Dim iLastRow As Long
Dim arr
  arr = Split(Cells(1, 1).Value, ", ")
    For i = 0 To UBound(arr)
      Cells(i + 1, "B") = Left(Split(arr(i), " ")(0), Len(Split(arr(i), " ")(0)) - 1)
      Cells(i + 1, "C") = Split(arr(i), " ")(1)
    Next
End Sub
 
БМВ, Спасибо! про ASC() не подумала
sokol92,  спасибо, работает! )))))
Kuzmich,  выглядит круто, надо почитать про Split и её подругу Join ))))
 
Kuzmich,  Я не понял????
Цитата
БМВ написал:
тут есть два Кузьмы, им хлеба не надо, дай что нить зарегулярить,
:-)

sokol92, Владимр, Ответ именно по теме. Надо взять на заметку, хотя и не без проблем для данного случая, ведь спец символы будут отнесены к цифрам.
Изменено: БМВ - 07.09.2018 20:12:58
По вопросам из тем форума, личку не читаю.
 
sokol92, а нет (( не работает (( отсеивает все, и буквы и пробелы с процентами ))
через asc сделала )
Изменено: Татьяна Агафонова - 07.09.2018 20:16:13
 
Цитата
тут есть два Кузьмы
Ну Кузя1972 еще проявится
Изменено: Kuzmich - 07.09.2018 20:16:18
 
Цитата
Татьяна Агафонова написал:
sokol92,  спасибо, работает! )))))
Цитата
Татьяна Агафонова написал:
sokol92 , а нет (( не работает
Вот же какие они, женщины, не угодишь им :) Но именно такими мы вас и любим! :)
 
_Igor_61,очень спешила порадоваться )

ElseIf Asc(a) > 64 And Asc(a) < 91 Or Asc(a) > 96 And Asc(a) < 123 Or Asc(a) > 191 And Asc(a) < 256 Then решил мою беду )))))
 
Татьяна Агафонова,  а токое небыло желания использовать?
Код
Select Case Asc(a)
Case 65 To 90, 97 To 122, 192 To 255
Case Else
End Select
По вопросам из тем форума, личку не читаю.
 
БМВ написал
Цитата
им хлеба не надо, дай что нить зарегулярить,
Код
Sub iPersent()
Dim mo As Object
Dim n As Integer
Dim i As Long
Dim j As Integer
 With CreateObject("VBScript.RegExp")
   .Global = True
   .MultiLine = True
   .Pattern = "\d+(?=%)"
     If .test(Cells(1, 1)) Then
       Set mo = .Execute(Cells(1, 1))
           i = 1
         For n = 0 To mo.Count - 1
           Cells(i, "B") = CDbl(mo(n))
           i = i + 1
         Next
     End If
   .Pattern = "[а-я]+"
     If .test(Cells(1, 1)) Then
       Set mo = .Execute(Cells(1, 1))
           i = 1
         For n = 0 To mo.Count - 1
           Cells(i, "C") = mo(n)
           i = i + 1
         Next
    End If
 End With
End Sub
 
Kuzmich,  Во, другое дело,  узнаю подчерк :-)

Off
Купил мужик подержаную иномарку. Так как гаража у него не было -
поставил он ее возле подъезда. Как-то с утра выходит из дома и видит:
на машине ржавым гвоздем нацарапано... "ПОКРАСЬ МЕНЯ"...
Мужик погоревал, потом думает: "а ведь в натуре красить пора"...
Загнал машину в сервис, за бешеные бабки открасил, машина стала как
новая. Поставил ее на место...
На следующий день выходит из подъезда, на машине в том же месте тем же
гвоздем нацарапано... "НУ ВОТ, СОВСЕМ ДРУГОЕ ДЕЛО!"
По вопросам из тем форума, личку не читаю.
 
Цитата
Во, другое дело
Что-то Кузя1972 не проявляется
 
БМВ, так там еще надо проверить не число ли вдруг ) с select case компактнее и уютнее, да )

Код
                If IsNumeric(a) = True Then
                    Ch = Ch & a
                ElseIf Asc(a) > 64 And Asc(a) < 91 Or Asc(a) > 96 And Asc(a) < 123 Or Asc(a) > 191 And Asc(a) < 256 Then
                    Tx = Tx & a
Kuzmich, иномарка что надо ))) ничего не ясно, но очень симпатично
Изменено: Татьяна Агафонова - 07.09.2018 21:13:00
 
добрый вечер,поле чудес смотрел по TV,а у нас нет файл-примера,-данные как бы в A1,а результат куда выводить:в строку,в одну ячейку через запятую или в два массива...Как вариант кнопка test и UDF IsText
Код
Function IsText(s) As Boolean
   With CreateObject("VBScript.RegExp"): .Pattern = "[а-яёa-z]+": .IgnoreCase = True: IsText = .test(s)
   End With
End Function.
Код
Sub test()
Dim t$, i&: t = Range("A1")
With CreateObject("VBScript.RegExp"): .Pattern = "\d+": .Global = True
 For i = 0 To .Execute(t).Count - 1
  If .test(t) Then MsgBox .Execute(t)(i)
 Next
 For i = 0 To .Execute(t).Count - 1
  .Pattern = "[а-яё]+": .IgnoreCase = True
  If .test(t) Then MsgBox .Execute(t)(i)
 Next
End With
End Sub
Изменено: кузя1972 - 08.09.2018 00:01:05
 
Татьяна, а Вы ни разу файл не показали. А ведь по одной строке о данных судить - чревато...
 
Я прошу прощения, всегда прикладываю файл, просто сейчас не знаю что приложить.

Проблему с определением текст или не текст решила с помощью Asc, а сами данные, оказавшиеся в массиве буду использовать дальше в макросе, для того, чтобы преобразовать состав в стандартную форму и использовать части состава для подбора кода ТНВЭД, т.е. буду дальше писать макрос и сам массив выводится не будет никуда, это просто кусок макроса в котором произошел затык.
Спасибо, как всегда неравнодушному форуму ))
 
Цитата
БМВ написал:
Владимр, Ответ именно по теме.
Здравствуйте, Михаил! А как еще без Win API можно определить, что символ юникода является буквой? По крайней мере, для европейских языков указанный "трюк" представляется удовлетворительным и может быть применен также к формулам Excel, SQL, PL/SQL и т.д.
Владимир
 
Вот вариант из примера от кузя1972,
"Все гениальное просто, а все простое гениально!!!"
 
https://www.planetaexcel.ru/forum/index.php?PAGE_NAME=search&tags=&q=%D0%B2%D0%B8%D1%81%D0%BA%D0%BE%D0%B7%D0%B0&FORUM_ID%5B%5D=0&DATE_CHANGE=0&order=relevance&s=%D0%9D%D0%B0%D0%B9%D1%82%D0%B8
:)
 
Доброе время суток
кузя1972, всё же шаблон у Kuzmich более правильный, в том смысле, что отбирает числа, связанные с конечным %. Вы же знаете, что как правило ТСы выдают не полный пример. Следовательно, в текстовой строке может быть что-нибудь
50% вискоза, 30% акрил, 11% полиэстер, 7% полиамид, плотность 123,34, цена 500,34 за кв. м.
Увы, почти всегда это нужно держать в голове.
Изменено: Андрей VG - 08.09.2018 10:13:48
Страницы: 1
Наверх