Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Доработка скрипта по преобразованию выделенной области - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_  
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Доработка скрипта по преобразованию выделенной области (Макросы/Sub)
Доработка скрипта по преобразованию выделенной области
MitaMax Дата: Среда, 14.05.2014, 15:00 | Сообщение № 1
Группа: Пользователи
Ранг: Прохожий
Сообщений: 5
Репутация: 0 ±
Замечаний: 20% ±

Excel 2007
Доброго времени суток!

Есть скрипт следующего вида:
[vba]
Код
Sub RemoveCrLfs()

Dim pobjCell As Range
Dim plCharCounter As Long
Dim psCellText As String
Dim i As Long

i = 0

For Each pobjCell In Selection
psCellText = pobjCell.Text
Do While InStr(psCellText, vbCr) > 0
psCellText = Replace$(psCellText, vbCr, " ")
Loop

Do While InStr(psCellText, vbLf) > 0
psCellText = Replace$(psCellText, vbLf, " ")
Loop

Do While InStr(psCellText, vbTab) > 0
psCellText = Replace$(psCellText, vbTab, " ")
Loop

Do While InStr(psCellText, """") > 0
psCellText = Replace$(psCellText, """", " ")
Loop

Do While InStr(psCellText, "'") > 0
psCellText = Replace$(psCellText, "'", " ")
Loop

Do While InStr(psCellText, "«") > 0
psCellText = Replace$(psCellText, "«", " ")
Loop

Do While InStr(psCellText, "»") > 0
psCellText = Replace$(psCellText, "»", " ")
Loop

Do While InStr(psCellText, ";") > 0
psCellText = Replace$(psCellText, ";", " ")
Loop

Do While InStr(psCellText, "--") > 0
psCellText = Replace$(psCellText, "--", "-")
Loop

Do While InStr(psCellText, "\") > 0
psCellText = Replace$(psCellText, "\", " ")
Loop

If psCellText = "(null)" Then
psCellText = ""
End If

psCellText = Trim(psCellText)

If (pobjCell.Value <> psCellText) Then
pobjCell.Font.ColorIndex = 3
i = i + 1
End If

pobjCell.Value = psCellText
Next

MsgBox (Str(i) + " items replaced.")

End Sub
[/vba]

Появилась необходимость предварительного преобразования форматов выбранных ячеек в текст без искажения содержимого (как происходит после перевода даты в текстовый формат).
Не программист, надеюсь на понимание.
Спасибо заранее!


С уважением, Максим М.

Сообщение отредактировал MitaMax - Среда, 14.05.2014, 15:28
 
Ответить
СообщениеДоброго времени суток!

Есть скрипт следующего вида:
[vba]
Код
Sub RemoveCrLfs()

Dim pobjCell As Range
Dim plCharCounter As Long
Dim psCellText As String
Dim i As Long

i = 0

For Each pobjCell In Selection
psCellText = pobjCell.Text
Do While InStr(psCellText, vbCr) > 0
psCellText = Replace$(psCellText, vbCr, " ")
Loop

Do While InStr(psCellText, vbLf) > 0
psCellText = Replace$(psCellText, vbLf, " ")
Loop

Do While InStr(psCellText, vbTab) > 0
psCellText = Replace$(psCellText, vbTab, " ")
Loop

Do While InStr(psCellText, """") > 0
psCellText = Replace$(psCellText, """", " ")
Loop

Do While InStr(psCellText, "'") > 0
psCellText = Replace$(psCellText, "'", " ")
Loop

Do While InStr(psCellText, "«") > 0
psCellText = Replace$(psCellText, "«", " ")
Loop

Do While InStr(psCellText, "»") > 0
psCellText = Replace$(psCellText, "»", " ")
Loop

Do While InStr(psCellText, ";") > 0
psCellText = Replace$(psCellText, ";", " ")
Loop

Do While InStr(psCellText, "--") > 0
psCellText = Replace$(psCellText, "--", "-")
Loop

Do While InStr(psCellText, "\") > 0
psCellText = Replace$(psCellText, "\", " ")
Loop

If psCellText = "(null)" Then
psCellText = ""
End If

psCellText = Trim(psCellText)

If (pobjCell.Value <> psCellText) Then
pobjCell.Font.ColorIndex = 3
i = i + 1
End If

pobjCell.Value = psCellText
Next

MsgBox (Str(i) + " items replaced.")

End Sub
[/vba]

Появилась необходимость предварительного преобразования форматов выбранных ячеек в текст без искажения содержимого (как происходит после перевода даты в текстовый формат).
Не программист, надеюсь на понимание.
Спасибо заранее!

Автор - MitaMax
Дата добавления - 14.05.2014 в 15:00
krosav4ig Дата: Среда, 14.05.2014, 20:37 | Сообщение № 2
Группа: Друзья
Ранг: Старожил
Сообщений: 2347
Репутация: 989 ±
Замечаний: 0% ±

Excel 2007,2010,2013
я конечно не телепат, но попробую предположить, что вместо [vba]
Код
pobjCell.Text
[/vba] нужно написать [vba]
Код
CStr(pobjCell.Value)
[/vba]


email:krosav4ig26@gmail.com WMR R207627035142 WMZ Z821145374535 ЯД 410012026478460
 
Ответить
Сообщениея конечно не телепат, но попробую предположить, что вместо [vba]
Код
pobjCell.Text
[/vba] нужно написать [vba]
Код
CStr(pobjCell.Value)
[/vba]

Автор - krosav4ig
Дата добавления - 14.05.2014 в 20:37
Alex_ST Дата: Четверг, 15.05.2014, 14:02 | Сообщение № 3
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3209
Репутация: 609 ±
Замечаний: 0% ±

2003
Ну, вообще-то нафиг не нужны циклы с реплэйсами, т.к. функция Replace по умолчанию заменяет сразу все найденные в стринге символы на заданные
А вот то, что после замен символов на пробелы эти пробелы символы могут быть не только в начале или конце результирующего стринга, но и между его буквами, Вы не учли.
А простой Trim убирает только лидирующие и финишные пробелы. Вам же нужен аналог функции листа СЖПРОБЕЛЫ - Application.WorksheetFunction.Trim (эту запись чаще всего можно сократить до Application.Trim , хотя иногда почему-то не прокатывает).
Ну и про существование неразвывных пробелов - Chr(160) - Вы забыли, а они частенько портят кровь.
Что Вы хотели выловить в строчке [vba]
Код
If psCellText = "(null)" Then …
[/vba]я не понял. Может быть у Вас такая фигня на листе откуда-то есть. Поэтому тупо оставил.
А [vba]
Код
If (pobjCell.Value <> psCellText) Then
[/vba] лучше заменить на [vba]
Код
If Not pobjCell.Text Like psCellText Then
[/vba]тогда не будет вылетать Type Mismatch при обнаружении на листе формул, возвращающих ошибки, которые в ячейках обозначаются, например, как #ЗНАЧ! , а на самом деле - это цифровые коды ошибок.
Ну и ускорить обработку не плохо бы отключением обновления экрана и автоматического пересчёта ячеек.
Т.е. примерно так Вашу процедуру можно урезать и подпилить:

Конечно, используя регулярные выражения, можно было бы и ещё сократить, но я их навскидку не помню, а лазить по своей "копилке" просто лень



С уважением,
Алексей
MS Excel 2003 - the best!!!


Сообщение отредактировал Alex_ST - Четверг, 15.05.2014, 14:03
 
Ответить
СообщениеНу, вообще-то нафиг не нужны циклы с реплэйсами, т.к. функция Replace по умолчанию заменяет сразу все найденные в стринге символы на заданные
А вот то, что после замен символов на пробелы эти пробелы символы могут быть не только в начале или конце результирующего стринга, но и между его буквами, Вы не учли.
А простой Trim убирает только лидирующие и финишные пробелы. Вам же нужен аналог функции листа СЖПРОБЕЛЫ - Application.WorksheetFunction.Trim (эту запись чаще всего можно сократить до Application.Trim , хотя иногда почему-то не прокатывает).
Ну и про существование неразвывных пробелов - Chr(160) - Вы забыли, а они частенько портят кровь.
Что Вы хотели выловить в строчке [vba]
Код
If psCellText = "(null)" Then …
[/vba]я не понял. Может быть у Вас такая фигня на листе откуда-то есть. Поэтому тупо оставил.
А [vba]
Код
If (pobjCell.Value <> psCellText) Then
[/vba] лучше заменить на [vba]
Код
If Not pobjCell.Text Like psCellText Then
[/vba]тогда не будет вылетать Type Mismatch при обнаружении на листе формул, возвращающих ошибки, которые в ячейках обозначаются, например, как #ЗНАЧ! , а на самом деле - это цифровые коды ошибок.
Ну и ускорить обработку не плохо бы отключением обновления экрана и автоматического пересчёта ячеек.
Т.е. примерно так Вашу процедуру можно урезать и подпилить:

Конечно, используя регулярные выражения, можно было бы и ещё сократить, но я их навскидку не помню, а лазить по своей "копилке" просто лень

Автор - Alex_ST
Дата добавления - 15.05.2014 в 14:02
Alex_ST Дата: Четверг, 15.05.2014, 14:31 | Сообщение № 4
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3209
Репутация: 609 ±
Замечаний: 0% ±

2003
Если есть желание, загляните в ЭТОТ топик.
Там при доработке макроса Trim_By_Formula народ приводил примеры использования регулярных выражений. Намного короче получается



С уважением,
Алексей
MS Excel 2003 - the best!!!
 
Ответить
СообщениеЕсли есть желание, загляните в ЭТОТ топик.
Там при доработке макроса Trim_By_Formula народ приводил примеры использования регулярных выражений. Намного короче получается

Автор - Alex_ST
Дата добавления - 15.05.2014 в 14:31
MitaMax Дата: Вторник, 20.05.2014, 12:02 | Сообщение № 5
Группа: Пользователи
Ранг: Прохожий
Сообщений: 5
Репутация: 0 ±
Замечаний: 20% ±

Excel 2007
Допилил таки скрипт,
спасибо Вам за помощь!

Возникла следующая задача -
попросили наваять скрипт для выверки длины текстового поля в ячейке (8 символов),дабы
в выбранном столбце (или диапазоне) строки,неуд. этому условию,подсвечивались цветом.
Мой вариант

работать отказывается. Подскажите где косячу.
Заранее Спасибо!


С уважением, Максим М.
 
Ответить
СообщениеДопилил таки скрипт,
спасибо Вам за помощь!

Возникла следующая задача -
попросили наваять скрипт для выверки длины текстового поля в ячейке (8 символов),дабы
в выбранном столбце (или диапазоне) строки,неуд. этому условию,подсвечивались цветом.
Мой вариант

работать отказывается. Подскажите где косячу.
Заранее Спасибо!

Автор - MitaMax
Дата добавления - 20.05.2014 в 12:02
RAN Дата: Вторник, 20.05.2014, 12:35 | Сообщение № 6
Группа: Друзья
Ранг: Экселист
Сообщений: 5660
Репутация: 1163 ±
Замечаний: 0% ±

2010
Да все работает. Просто такой "удачный" цвет выбран. :D
[vba]
Код
pobjCell.Font.ColorIndex = 3 '13
[/vba]


Быть или не быть, вот в чем загвоздка!
 
Ответить
СообщениеДа все работает. Просто такой "удачный" цвет выбран. :D
[vba]
Код
pobjCell.Font.ColorIndex = 3 '13
[/vba]

Автор - RAN
Дата добавления - 20.05.2014 в 12:35
Alex_ST Дата: Вторник, 20.05.2014, 17:02 | Сообщение № 7
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3209
Репутация: 609 ±
Замечаний: 0% ±

2003
И лучше всё-таки не по всем выделенным ячейкам циклом бегать (а то вдруг кто-нибудь весь лист выберет - ждать замучаетесь), а ограничиться UsedRange [vba]
Код
For Each pobjCell In Intersect(ActiveWindow.RangeSelection, ActiveSheet.UsedRange)
[/vba]А ещё лучше - ещё и видимыми ячейками с константами:
[vba]
Код
For Each pobjCell In Intersect(ActiveWindow.RangeSelection.SpecialCells(xlCellTypeVisible), ActiveSheet.UsedRange.SpecialCells(xlCellTypeConstants))
[/vba]
Только перед началом цикла лучше бы проверить выбранный таким образом диапазон на то, что он не Nothing, а то в ошибку можете вылететь.
Ну и ещё как всегда:
[vba]
Код
With Application: .ScreenUpdating = False: .EnableEvents = False: .Calculation = xlManual: End With
[/vba]в начале и[vba]
Код
With Application: .ScreenUpdating = True: .EnableEvents = True: .Calculation = xlAutomatic: End With
[/vba]в конце. Тогда точно шустренько будет



С уважением,
Алексей
MS Excel 2003 - the best!!!


Сообщение отредактировал Alex_ST - Вторник, 20.05.2014, 17:04
 
Ответить
СообщениеИ лучше всё-таки не по всем выделенным ячейкам циклом бегать (а то вдруг кто-нибудь весь лист выберет - ждать замучаетесь), а ограничиться UsedRange [vba]
Код
For Each pobjCell In Intersect(ActiveWindow.RangeSelection, ActiveSheet.UsedRange)
[/vba]А ещё лучше - ещё и видимыми ячейками с константами:
[vba]
Код
For Each pobjCell In Intersect(ActiveWindow.RangeSelection.SpecialCells(xlCellTypeVisible), ActiveSheet.UsedRange.SpecialCells(xlCellTypeConstants))
[/vba]
Только перед началом цикла лучше бы проверить выбранный таким образом диапазон на то, что он не Nothing, а то в ошибку можете вылететь.
Ну и ещё как всегда:
[vba]
Код
With Application: .ScreenUpdating = False: .EnableEvents = False: .Calculation = xlManual: End With
[/vba]в начале и[vba]
Код
With Application: .ScreenUpdating = True: .EnableEvents = True: .Calculation = xlAutomatic: End With
[/vba]в конце. Тогда точно шустренько будет

Автор - Alex_ST
Дата добавления - 20.05.2014 в 17:02
MitaMax Дата: Четверг, 22.05.2014, 12:48 | Сообщение № 8
Группа: Пользователи
Ранг: Прохожий
Сообщений: 5
Репутация: 0 ±
Замечаний: 20% ±

Excel 2007
Алексей, скрипт ожил!Спасибо Вам!
сейчас пытаюсь добавить в него проверку на повторяющиеся числовые записи,столкнулся с тем что не знаю как обратиться к предыдущей ячейке
вариант
[vba]
Код
pobjcell-1
[/vba]
компилятор естественно не понимает
вопрос : заработает ли ,если добавить ??
[vba]
Код

Dim i As Long
....
if CLng(pobjcell.Text[i-1]-CLng(pobjcell.Text[i] = 1
Then
pobjCell[i-1].Font.ColorIndex = 5  
pobjCell[i].Font.ColorIndex = 5  
End If  
[/vba]


С уважением, Максим М.
 
Ответить
СообщениеАлексей, скрипт ожил!Спасибо Вам!
сейчас пытаюсь добавить в него проверку на повторяющиеся числовые записи,столкнулся с тем что не знаю как обратиться к предыдущей ячейке
вариант
[vba]
Код
pobjcell-1
[/vba]
компилятор естественно не понимает
вопрос : заработает ли ,если добавить ??
[vba]
Код

Dim i As Long
....
if CLng(pobjcell.Text[i-1]-CLng(pobjcell.Text[i] = 1
Then
pobjCell[i-1].Font.ColorIndex = 5  
pobjCell[i].Font.ColorIndex = 5  
End If  
[/vba]

Автор - MitaMax
Дата добавления - 22.05.2014 в 12:48
Alex_ST Дата: Четверг, 22.05.2014, 13:29 | Сообщение № 9
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3209
Репутация: 609 ±
Замечаний: 0% ±

2003
Для обращения к ячейкам, сдвинутым относительно заданной на +/- сколько нужно столбцов и строк используется свойство Offset:
Цитата Справка Excel
Returns a Range object that represents a range that’s offset from the specified range. Read-only.

expression.Offset(RowOffset, ColumnOffset)
expression Required. An expression that returns a Range object.

RowOffset Optional Variant. The number of rows (positive, negative, or 0 (zero)) by which the range is to be offset. Positive values are offset downward, and negative values are offset upward. The default value is 0.

ColumnOffset Optional Variant. The number of columns (positive, negative, or 0 (zero)) by which the range is to be offset. Positive values are offset to the right, and negative values are offset to the left. The default value is 0.




С уважением,
Алексей
MS Excel 2003 - the best!!!
 
Ответить
СообщениеДля обращения к ячейкам, сдвинутым относительно заданной на +/- сколько нужно столбцов и строк используется свойство Offset:
Цитата Справка Excel
Returns a Range object that represents a range that’s offset from the specified range. Read-only.

expression.Offset(RowOffset, ColumnOffset)
expression Required. An expression that returns a Range object.

RowOffset Optional Variant. The number of rows (positive, negative, or 0 (zero)) by which the range is to be offset. Positive values are offset downward, and negative values are offset upward. The default value is 0.

ColumnOffset Optional Variant. The number of columns (positive, negative, or 0 (zero)) by which the range is to be offset. Positive values are offset to the right, and negative values are offset to the left. The default value is 0.


Автор - Alex_ST
Дата добавления - 22.05.2014 в 13:29
Alex_ST Дата: Четверг, 22.05.2014, 13:36 | Сообщение № 10
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3209
Репутация: 609 ±
Замечаний: 0% ±

2003
Но, конечно, если Вы хотите обратиться именно к ячейке, которая обрабатывалась в предыдущем цикле, а не просто к сдвинутой, то можно и извратиться: задать ещё и дополнительную переменную, например, PrevCell As Range и при входе в очередной цикл её раскрашивать, а перед перед выходом из цикла устанавливать её равной текущей ячейке-переменной цикла: Set PrevCell = pobjCell



С уважением,
Алексей
MS Excel 2003 - the best!!!


Сообщение отредактировал Alex_ST - Четверг, 22.05.2014, 13:38
 
Ответить
СообщениеНо, конечно, если Вы хотите обратиться именно к ячейке, которая обрабатывалась в предыдущем цикле, а не просто к сдвинутой, то можно и извратиться: задать ещё и дополнительную переменную, например, PrevCell As Range и при входе в очередной цикл её раскрашивать, а перед перед выходом из цикла устанавливать её равной текущей ячейке-переменной цикла: Set PrevCell = pobjCell

Автор - Alex_ST
Дата добавления - 22.05.2014 в 13:36
MitaMax Дата: Четверг, 22.05.2014, 14:28 | Сообщение № 11
Группа: Пользователи
Ранг: Прохожий
Сообщений: 5
Репутация: 0 ±
Замечаний: 20% ±

Excel 2007
Ввел по Вашему совету переменную PrevCell
и добавил для нее строковую PrevCellText соответственно.
задаю для нее начальное значение путем обращения к свойству PrevCell.Text
выкидывает с ошибкой(комментарий в спойлере)...

[vba]
Код
Sub CountSumbol()
Dim pobjCell As Range
Dim plCharCounter As Long
Dim psCellText, PrevCellText As String
Dim PrevCell As Range
PrevCell.Text = "1111"
With Application: .ScreenUpdating = False: .EnableEvents = False: .Calculation = xlManual: End With
For Each pobjCell In Intersect(ActiveWindow.RangeSelection.SpecialCells(xlCellTypeVisible), ActiveSheet.UsedRange.SpecialCells(xlCellTypeConstants))
psCellText = pobjCell.Text
PrevCellText = PrevCell.Text '!!!ОШИБКА с кодом 91
If Len(psCellText) <> 8 Then
pobjCell.Font.ColorIndex = 4
End If
If CLng(PrevCellText) - CLng(psCellText) = 1 Then
pobjCell.Font.ColorIndex = 5
PrevCell.Font.ColorIndex = 5
End If
Set PrevCell = pobjCell
Next
With Application: .ScreenUpdating = True: .EnableEvents = True: .Calculation = xlAutomatic: End With
End Sub
[/vba]

Судя по всему косяк случается когда происходит перекод из строки в число,тк столбец начинается с буквенного заголовка:


Может стоит использовать другую функцию перекода форматов или какой-нибудь хитрый прием?


С уважением, Максим М.

Сообщение отредактировал MitaMax - Четверг, 22.05.2014, 14:38
 
Ответить
СообщениеВвел по Вашему совету переменную PrevCell
и добавил для нее строковую PrevCellText соответственно.
задаю для нее начальное значение путем обращения к свойству PrevCell.Text
выкидывает с ошибкой(комментарий в спойлере)...

[vba]
Код
Sub CountSumbol()
Dim pobjCell As Range
Dim plCharCounter As Long
Dim psCellText, PrevCellText As String
Dim PrevCell As Range
PrevCell.Text = "1111"
With Application: .ScreenUpdating = False: .EnableEvents = False: .Calculation = xlManual: End With
For Each pobjCell In Intersect(ActiveWindow.RangeSelection.SpecialCells(xlCellTypeVisible), ActiveSheet.UsedRange.SpecialCells(xlCellTypeConstants))
psCellText = pobjCell.Text
PrevCellText = PrevCell.Text '!!!ОШИБКА с кодом 91
If Len(psCellText) <> 8 Then
pobjCell.Font.ColorIndex = 4
End If
If CLng(PrevCellText) - CLng(psCellText) = 1 Then
pobjCell.Font.ColorIndex = 5
PrevCell.Font.ColorIndex = 5
End If
Set PrevCell = pobjCell
Next
With Application: .ScreenUpdating = True: .EnableEvents = True: .Calculation = xlAutomatic: End With
End Sub
[/vba]

Судя по всему косяк случается когда происходит перекод из строки в число,тк столбец начинается с буквенного заголовка:


Может стоит использовать другую функцию перекода форматов или какой-нибудь хитрый прием?

Автор - MitaMax
Дата добавления - 22.05.2014 в 14:28
RAN Дата: Четверг, 22.05.2014, 14:43 | Сообщение № 12
Группа: Друзья
Ранг: Экселист
Сообщений: 5660
Репутация: 1163 ±
Замечаний: 0% ±

2010
PrevCell.Text

[vba]
Код
PrevCell.Value
[/vba]


Быть или не быть, вот в чем загвоздка!
 
Ответить
Сообщение
PrevCell.Text

[vba]
Код
PrevCell.Value
[/vba]

Автор - RAN
Дата добавления - 22.05.2014 в 14:43
Alex_ST Дата: Четверг, 22.05.2014, 16:37 | Сообщение № 13
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3209
Репутация: 609 ±
Замечаний: 0% ±

2003
MitaMax, пользуйтесь, пожалуйста, тэгами оформления кода VBA. Абсолютно невозможно читать Ваши посты.
-----------------------------
У меня завал на работе.
Наспех набросал. Не отлаживал. Проверьте:

Вполне возможны вылеты на строке [vba]
Код
If CInt(rPrevCell) - CInt(rCell) = 1 Then
[/vba]Надо чуть подумать, как обойти... Нет времени.



С уважением,
Алексей
MS Excel 2003 - the best!!!


Сообщение отредактировал Alex_ST - Четверг, 22.05.2014, 16:39
 
Ответить
СообщениеMitaMax, пользуйтесь, пожалуйста, тэгами оформления кода VBA. Абсолютно невозможно читать Ваши посты.
-----------------------------
У меня завал на работе.
Наспех набросал. Не отлаживал. Проверьте:

Вполне возможны вылеты на строке [vba]
Код
If CInt(rPrevCell) - CInt(rCell) = 1 Then
[/vba]Надо чуть подумать, как обойти... Нет времени.

Автор - Alex_ST
Дата добавления - 22.05.2014 в 16:37
MitaMax Дата: Пятница, 23.05.2014, 14:42 | Сообщение № 14
Группа: Пользователи
Ранг: Прохожий
Сообщений: 5
Репутация: 0 ±
Замечаний: 20% ±

Excel 2007
Добрый день!
Кой-чего исправил,подсвечивает,только при условии если не брать заголовок столбца (текстовый)...
дабы побороть этот баг, решил добавить еще одну проверку на буквы (нашел массив для украинского языка,но пойдет и мне)
добавил в скрипт данный массив
[vba]
Код
alf = Array("а", "б", "в", "г", "д", "е", "є", "ж", "з", "і", "ї", "й", "к", _
     "л", "м", "н", "о", "п", "р", "с", "т", "у", "ф", "х", "ц", "ч", "ш", _
     "щ", "и", "ь", "ю", "я", "А", "Б", "В", "Г", "Д", "Е", _
     "Є", "Ж", "З", "И", "Ї", "Й", "К", "Л", "М", "Н", "О", "П", "Р", _
     "С", "Т", "У", "Ф", "Х", "Ц", "Ч", "Ш", "Щ", "И", "Ь", "Ю", "Я", " ", "'")
[/vba]
и видоизменил условие
[vba]
Код
If InStr(CStr(rCell), CStr(alf)) <> 1 And CLng(rCell) - CLng(rPrevCell) = 1 Then
[/vba]
такой механизм у меня не работает,экспериментирую дальше...
[p.s.]Извините ,что отвлекаю от работы...


С уважением, Максим М.
 
Ответить
СообщениеДобрый день!
Кой-чего исправил,подсвечивает,только при условии если не брать заголовок столбца (текстовый)...
дабы побороть этот баг, решил добавить еще одну проверку на буквы (нашел массив для украинского языка,но пойдет и мне)
добавил в скрипт данный массив
[vba]
Код
alf = Array("а", "б", "в", "г", "д", "е", "є", "ж", "з", "і", "ї", "й", "к", _
     "л", "м", "н", "о", "п", "р", "с", "т", "у", "ф", "х", "ц", "ч", "ш", _
     "щ", "и", "ь", "ю", "я", "А", "Б", "В", "Г", "Д", "Е", _
     "Є", "Ж", "З", "И", "Ї", "Й", "К", "Л", "М", "Н", "О", "П", "Р", _
     "С", "Т", "У", "Ф", "Х", "Ц", "Ч", "Ш", "Щ", "И", "Ь", "Ю", "Я", " ", "'")
[/vba]
и видоизменил условие
[vba]
Код
If InStr(CStr(rCell), CStr(alf)) <> 1 And CLng(rCell) - CLng(rPrevCell) = 1 Then
[/vba]
такой механизм у меня не работает,экспериментирую дальше...
[p.s.]Извините ,что отвлекаю от работы...

Автор - MitaMax
Дата добавления - 23.05.2014 в 14:42
Alex_ST Дата: Пятница, 23.05.2014, 23:08 | Сообщение № 15
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3209
Репутация: 609 ±
Замечаний: 0% ±

2003
такой механизм у меня не работает

И не мудрено. Кто Вас научил ТАК обращаться с массивами?
И что Вы надеялись получить от CStr(alf) ?
Если уж хотите что-то сравнивать с набором символов, то используйте оператор Like.
Он понимает перечисления и метасимволы. Посмотрите справку. Пригодится где-нибудь.
Но только не в этом случае.
Тут вполне достаточно перед вычислениями проверять типы переменных любым из доступных методов
[vba]
Код
If IsNumeric(rCell) Then …
If TypeName(rCell) <> "String" Then …
If VarType(rCell) < vbString Then …
[/vba]
В общем, Ваш макрос, скорее всего заработает так:

Только я сделал изменение не цвета шрифта, а цвета заливки (мне так удобнее - зрение слабовато стало).
Если Вам удобнее изменять цвет шрифта, от исправьте сами.
Но в любом случае, если не нужно 56 цветов, то по-моему намного удобнее использовать не ColorIndex , а Color и задавать его не ничего не значащими цифрами, а понятными цифровыми константами.



С уважением,
Алексей
MS Excel 2003 - the best!!!


Сообщение отредактировал Alex_ST - Пятница, 23.05.2014, 23:09
 
Ответить
Сообщение
такой механизм у меня не работает

И не мудрено. Кто Вас научил ТАК обращаться с массивами?
И что Вы надеялись получить от CStr(alf) ?
Если уж хотите что-то сравнивать с набором символов, то используйте оператор Like.
Он понимает перечисления и метасимволы. Посмотрите справку. Пригодится где-нибудь.
Но только не в этом случае.
Тут вполне достаточно перед вычислениями проверять типы переменных любым из доступных методов
[vba]
Код
If IsNumeric(rCell) Then …
If TypeName(rCell) <> "String" Then …
If VarType(rCell) < vbString Then …
[/vba]
В общем, Ваш макрос, скорее всего заработает так:

Только я сделал изменение не цвета шрифта, а цвета заливки (мне так удобнее - зрение слабовато стало).
Если Вам удобнее изменять цвет шрифта, от исправьте сами.
Но в любом случае, если не нужно 56 цветов, то по-моему намного удобнее использовать не ColorIndex , а Color и задавать его не ничего не значащими цифрами, а понятными цифровыми константами.

Автор - Alex_ST
Дата добавления - 23.05.2014 в 23:08
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Доработка скрипта по преобразованию выделенной области (Макросы/Sub)
  • Страница 1 из 1
  • 1
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2024 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!