Войти

Показать полную графическую версию : [решено] Поиск фразы в столбце и создание записи в соседнем столбце


blackeangel
13-12-2015, 16:13
Всем добрый день. Есть такая не сложная задача:
Найти столбец содержащий в первой строке слово "маршрут", в нём искать регулярные выражения как 3000,3100,3200,3300,3400,3600,3800,3801,2400 и справа от столбца с "маршрут" создать столбец "пришёл" в котором будем писать если нашлось 3000, то пишем 3000,если нет 3000, но нашлось 3100 то пишем 3100 и тд до последней записи в файле.
Как это все реализовать?Помогите пожалуйста!
Пример как было и как должно быть прилагаю

blackeangel
13-12-2015, 16:39
себе представляю это так:

sub типа пример ()
задаем переменные
а=3000
b=3100
c=3200
d=3300
...
ищем столбец содержащий в первой строке "Маршрут"
Получаем его номер
дальше запускаем for со 2 до последней строки содержащей запись в столбце с "Маршрут"
запускаем if содержит(входит) а then
в столбец с номером "Маршрут" +1 и строка [i] пишем константу а
else
if содержит(входит) b then
в столбец с номером "Маршрут" +1 и строка [i] пишем константу b
else
if содержит(входит) c then
в столбец с номером "Маршрут" +1 и строка [i] пишем константу c
else
...
end if
end sub
но как это реализовать на ЯП не знаю...

Iska
13-12-2015, 18:07
В выложенном примере «B7» содержит «3050». Откуда оно взялось, если его нет в указанном Вами перечне:
3000,3100,3200,3300,3400,3600,3800,3801,2400 »

И вообще непонятно, как понимать эту фразу:
искать регулярные выражения как 3000,3100,3200,3300,3400,3600,3800,3801,2400 »
?!

P.S. Выложите реальный образец. Пример, как должно быть, лучше делать на отдельном листе.

blackeangel
13-12-2015, 18:53
В выложенном примере «B7» содержит «3050». Откуда оно взялось, если его нет в указанном Вами перечне:
3000,3100,3200,3300,3400,3600,3800,3801,2400 »

И вообще непонятно, как понимать эту фразу:
искать регулярные выражения как 3000,3100,3200,3300,3400,3600,3800,3801,2400 »
?!

P.S. Выложите реальный образец. Пример, как должно быть, лучше делать на отдельном листе.
Так искать надо как содержит,там и буквы есть и скобочки ещё,так что 3050 это как лишний мусор. Я дал кусок да ещё и упрощённый.
Как понимать мою фразу?как константы.Все перечисленные это и есть константы(9 штук), которые искать надо.Во втором своём сообщении я примерно описал как программа должна работать. .

blackeangel
14-12-2015, 07:18
В выложенном примере «B7» содержит «3050». Откуда оно взялось, если его нет в указанном Вами перечне:
3000,3100,3200,3300,3400,3600,3800,3801,2400 »

И вообще непонятно, как понимать эту фразу:
искать регулярные выражения как 3000,3100,3200,3300,3400,3600,3800,3801,2400 »
?!

P.S. Выложите реальный образец. Пример, как должно быть, лучше делать на отдельном листе.
Вот живой рабочий пример,сильно от того что давал ранее не отличается.Было и стало на разных листах, как и просил

blackeangel
15-12-2015, 09:29
Решение найдено.

Sub raspil()
Application.ScreenUpdating = False
i = 2
sWhatFind = "Маршрут"
Cells.Find(What:=sWhatFind, After:=ActiveCell, SearchOrder:=xlByColumns).Activate
ncolumn = ActiveCell.Column
Do While Cells(i, ncolumn).Value <> Empty
If Cells(i, ncolumn).Value Like "*3000*" Then
Cells(i, ncolumn + 1).Value = "3000"
Else
If Cells(i, ncolumn).Value Like "*3100*" Then
Cells(i, ncolumn + 1).Value = "3100"
Else
If Cells(i, ncolumn).Value Like "*3200*" Then
Cells(i, ncolumn + 1).Value = "3200"
Else
If Cells(i, ncolumn).Value Like "*3300*" Then
Cells(i, ncolumn + 1).Value = "3300"
Else
If Cells(i, ncolumn).Value Like "*3400*" Then
Cells(i, ncolumn + 1).Value = "3400"
Else
If Cells(i, ncolumn).Value Like "*3600*" Then
Cells(i, ncolumn + 1).Value = "3600"
Else
If Cells(i, ncolumn).Value Like "*3800*" Then
Cells(i, ncolumn + 1).Value = "3800"
Else
If Cells(i, ncolumn).Value Like "*3801*" Then
Cells(i, ncolumn + 1).Value = "3801"
Else
If Cells(i, ncolumn).Value Like "*2400*" Then
Cells(i, ncolumn + 1).Value = "2400"
End If
End If
End If
End If
End If
End If
End If
End If
End If
i = i + 1
Loop
Application.ScreenUpdating = True
End Sub

okshef
15-12-2015, 21:02
По-моему, с помощью Select Case вышло бы короче и понятнее

Iska
15-12-2015, 21:54
Там «Like»'а нету. Если, конечно, в новых версиях не разрешили использовать его в «Is». Update: обходной путь указал коллега okshef ниже.

А сократить, конечно, можно было. Хотя бы использовав не вложенность, а «ElseIf», а для скорости один раз брать значение «Cells(i, ncolumn).Value», а не десяток.

okshef
15-12-2015, 22:14
Как-то так: http://ccm.net/faq/36211-vba-using-the-like-operator-with-select-case

Iska
15-12-2015, 22:52
okshef, «Good» :). И ведь видел когда-то эту технику (не в связи с Like). Но не пользуешься — забыл.

a_axe
22-12-2015, 09:58
okshef, браво! Искренне считал, что это на select case не реализуется, всегда использовал if. Снимаю шляпу :hi:

Iska
22-12-2015, 15:54
a_axe, ага. У меня примерно такое же изумление было, когда впервые увидел технику «Select Case True», причём — даже не в связи с «Like», но тоже какой-то обходной путь реализации (деталей — кто, когда — уже не припомню).




© OSzone.net 2001-2012