как заменить многочисленное If на Switch?
Dim i, iPath, iFName As String
iPath = "E:\123\"
iFName = Dir(iPath & "*.doc")
Do While iFName <> "" And Not InStr(iFName, "+") [COLOR="Green"]'т.е. если с плюсиком,
'значит он уже обработан, и его не трогать[/COLOR]
If InStr(LCase(iFName), "алког") Then i = "A3": GoTo Colorize
[COLOR="Green"]'тут я присваиваю по названию документа номер ячейке,
в которой сидит его название и хочу перекрасить шрифт в белый цвет
(проверяю наличие документа в папке и если есть делаю цвет названия этого документа в табличке Екселя ярким цветом.[/COLOR]
...
If InStr(LCase(iFName), "химия") Then i = "A33": GoTo Colorize
GoTo skipp
Colorize:
Range(i).Select
Selection.Font.ColorIndex = 2
skipp:
iFName$ = Dir
Loop
End Sub
Может быть вместо 30-ти If'ов лучше использовать один Switch (должно быстрее работать), но не соображу как тогда надо записать.
Можно сделать через индексацию.
Dim Cnt, iPath, iFName As String
Dim arrThing(10,1) As String
arrThing(1,1) = "A3": arrThing(1,0) = "алког"
arrThing(2,1) = "A33": arrThing(2,0) = "химия"
arrThing(3,1) = "C2": arrThing(3,0) = "наркот"
'...
arrThing(10,1) = "B1": arrThing(10,0) = "женщ"
' :)
iPath = "E:\123\"
iFName = Dir(iPath & "*.doc")
Do While iFName <> "" And Not InStr(iFName, "+") 'т.е. если с плюсиком, значит он уже обработан, и его не трогать
For Cnt=1 To UBound(arrThing)-1'при Option Base 0
If InStr(LCase(iFName))=arrThing(Cnt,0)) Then Range((arrThing(Cnt,1))).ColorIndex = 2
Next
iFName$ = Dir
Loop
End Sub
Помню, помню. :o
arrThing(3,1) = "C2": arrThing(3,0) = "наркот"
'...
arrThing(10,1) = "B1": arrThing(10,0) = "женщ"
А вот про это подзабыл, надо вспомнить как, что и куда, чтобы не запутаться. :D
Кстати, строчка
If InStr(LCase(iFName))=arrThing(Cnt,0)) Then Range((arrThing(Cnt,1))).ColorIndex = 2
высвечена красным. Что-то не так.
А может быть еще проще использовать оператор like?
Т.е. если название файла like текст в ячейке, то красить.
Кстати, строчка
If InStr(LCase(iFName))=arrThing(Cnt,0)) Then Range((arrThing(Cnt,1))).ColorIndex = 2
высвечена красным. Что-то не так.
А что не так? Где высвечена красным?
На счет like - то вряд ли.
Кстати, а почему вы свегда используете такой синтаксис:
'Выделить область:
[COLOR=Blue] Range(i).[/COLOR]Select
Работать с выделением
Selection[COLOR=Blue].Font.ColorIndex = 2[/COLOR]
а можно жн сразу рабоать с областью:
[COLOR=Blue] Range(i).Font.ColorIndex = 2[/COLOR]
[COLOR="Red"]If InStr(LCase(iFName))=arrThing(Cnt,0)) Then Exit Sub[/COLOR]
или без одной скобки
[COLOR="Red"]If InStr(LCase(iFName)=arrThing(Cnt,0)) Then Exit Sub[/COLOR]
А ткая нормально:
[COLOR="Navy"]If InStr(LCase(iFName), "алко") Then Exit Sub[/COLOR] 'для краткости хвост заменил на Exit Sub
Наверное не нравится, что внутри Instr сидит знак равенства.
Про то, что сразу можно работать с областью понял. Просто для тренировки навыков программирования хочется сначала выделить, что бы увидеть, что "оно" работает, а потом уже что-то с выделением делать. С like'ом тоже понял.
Пока читал свой же ответ увидел, что надо написать так:
[COLOR="Navy"]If InStr(LCase(iFName), arrThing(Cnt, 0)) Then Exit Sub[/COLOR]
И все станет нормально.