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

Вход

Регистрация

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

 

= Мир MS Excel/Макрос несколько условий IF в одной строке и одном блоке - Мир MS Excel

Регистрация · Логин: · Пароль: · · Забыли пароль?
Страница 1 из 11
Модератор форума: _Boroda_, Pelena, Manyasha, SLAVICK 
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Макрос несколько условий IF в одной строке и одном блоке (Макросы/Sub)
Макрос несколько условий IF в одной строке и одном блоке
Yar4i4 Дата: Суббота, 05.03.2016, 14:47 | Сообщение № 1
Группа: Пользователи
Ранг: Участник
Сообщений: 55
Репутация: 0 ±
Замечаний: 20% ±

Excel 2013
Добрый вечер.
Написал макрос унификации возможных опечаток "шт", "10шт" и "100шт" (заменяющий их к определённому одному виду).
Всё работает, когда раскидываю на три блока с началом "For Each rng In Selection" и концовкой каждого блока "End If". Но стоит начать экономить место и ... перестало выполняться условие "10 шт." и "100 шт.".
Первое условие выполняется.

[vba]
Код
Columns("D:E").Select
  
       For Each rng In Selection
       If rng = "шт." Or rng = "шт ." Or rng = "шт." Then
             rng.Offset = "шт"
       If rng = "10 шт" Or rng = "10 шт." Or rng = "10 шт ." Then
             rng.Offset = "10шт"
       If rng = "100 шт" Or rng = "100 шт." Or rng = "100 шт ." Then
             rng.Offset = "100шт"
     End If
     End If
     End If
      Next rng
[/vba]
К сообщению приложен файл: 3091992.xlsx(81Kb)
 
Ответить
СообщениеДобрый вечер.
Написал макрос унификации возможных опечаток "шт", "10шт" и "100шт" (заменяющий их к определённому одному виду).
Всё работает, когда раскидываю на три блока с началом "For Each rng In Selection" и концовкой каждого блока "End If". Но стоит начать экономить место и ... перестало выполняться условие "10 шт." и "100 шт.".
Первое условие выполняется.

[vba]
Код
Columns("D:E").Select
  
       For Each rng In Selection
       If rng = "шт." Or rng = "шт ." Or rng = "шт." Then
             rng.Offset = "шт"
       If rng = "10 шт" Or rng = "10 шт." Or rng = "10 шт ." Then
             rng.Offset = "10шт"
       If rng = "100 шт" Or rng = "100 шт." Or rng = "100 шт ." Then
             rng.Offset = "100шт"
     End If
     End If
     End If
      Next rng
[/vba]

Автор - Yar4i4
Дата добавления - 05.03.2016 в 14:47
Pelena Дата: Суббота, 05.03.2016, 15:35 | Сообщение № 2
Группа: Модераторы
Ранг: Экселист
Сообщений: 9842
Репутация: 2252 ±
Замечаний: 0% ±

Excel 2010 & Mac Excel 2011
[vba]
Код
For Each rng In Selection
    If rng = "шт." Or rng = "шт ." Or rng = "шт." Then rng.Offset = "шт"
    If rng = "10 шт" Or rng = "10 шт." Or rng = "10 шт ." Then rng.Offset = "10шт"
    If rng = "100 шт" Or rng = "100 шт." Or rng = "100 шт ." Then rng.Offset = "100шт"
    Next rng
[/vba]
или
[vba]
Код
For Each rng In Selection
    If rng = "шт." Or rng = "шт ." Or rng = "шт." Then
            rng.Offset = "шт"
    End If
    If rng = "10 шт" Or rng = "10 шт." Or rng = "10 шт ." Then
            rng.Offset = "10шт"
    End If
    If rng = "100 шт" Or rng = "100 шт." Or rng = "100 шт ." Then
            rng.Offset = "100шт"
    End If
    Next rng
[/vba]

А в чём тайный смысл конструкции rng.Offset
Может, так короче будет
[vba]
Код
For Each rng In Selection
rng=Replace(Replace(rng,".","")," ","")
Next
[/vba]


"Черт возьми, Холмс! Но как??!!"
ЯД 41001765434816
 
Ответить
Сообщение[vba]
Код
For Each rng In Selection
    If rng = "шт." Or rng = "шт ." Or rng = "шт." Then rng.Offset = "шт"
    If rng = "10 шт" Or rng = "10 шт." Or rng = "10 шт ." Then rng.Offset = "10шт"
    If rng = "100 шт" Or rng = "100 шт." Or rng = "100 шт ." Then rng.Offset = "100шт"
    Next rng
[/vba]
или
[vba]
Код
For Each rng In Selection
    If rng = "шт." Or rng = "шт ." Or rng = "шт." Then
            rng.Offset = "шт"
    End If
    If rng = "10 шт" Or rng = "10 шт." Or rng = "10 шт ." Then
            rng.Offset = "10шт"
    End If
    If rng = "100 шт" Or rng = "100 шт." Or rng = "100 шт ." Then
            rng.Offset = "100шт"
    End If
    Next rng
[/vba]

А в чём тайный смысл конструкции rng.Offset
Может, так короче будет
[vba]
Код
For Each rng In Selection
rng=Replace(Replace(rng,".","")," ","")
Next
[/vba]

Автор - Pelena
Дата добавления - 05.03.2016 в 15:35
RAN Дата: Суббота, 05.03.2016, 15:41 | Сообщение № 3
Группа: Друзья
Ранг: Участник клуба
Сообщений: 4277
Репутация: 829 ±
Замечаний: 0% ±

2010
Проанализируйте внимательно написанное
[vba]
Код
    For Each Rng In Selection
        If Rng = "шт." Or Rng = "шт ." Or Rng = "шт." Then
            Rng.Offset = "шт"
            If Rng = "10 шт" Or Rng = "10 шт." Or Rng = "10 шт ." Then
                Rng.Offset = "10шт"
                If Rng = "100 шт" Or Rng = "100 шт." Or Rng = "100 шт ." Then
                    Rng.Offset = "100шт"
                End If
            End If
        End If
    Next Rng
[/vba]

Без цикла
[vba]
Код
    Selection.Replace " ", ""
    Selection.Replace "шт", "шт."
    Selection.Replace "..", "."
[/vba]


Быть или не быть, вот в чем загвоздка!
 
Ответить
СообщениеПроанализируйте внимательно написанное
[vba]
Код
    For Each Rng In Selection
        If Rng = "шт." Or Rng = "шт ." Or Rng = "шт." Then
            Rng.Offset = "шт"
            If Rng = "10 шт" Or Rng = "10 шт." Or Rng = "10 шт ." Then
                Rng.Offset = "10шт"
                If Rng = "100 шт" Or Rng = "100 шт." Or Rng = "100 шт ." Then
                    Rng.Offset = "100шт"
                End If
            End If
        End If
    Next Rng
[/vba]

Без цикла
[vba]
Код
    Selection.Replace " ", ""
    Selection.Replace "шт", "шт."
    Selection.Replace "..", "."
[/vba]

Автор - RAN
Дата добавления - 05.03.2016 в 15:41
Wasilich Дата: Суббота, 05.03.2016, 15:55 | Сообщение № 4
Группа: Друзья
Ранг: Ветеран
Сообщений: 858
Репутация: 220 ±
Замечаний: 0% ±

2003
А может так?
[vba]
Код
Sub WWW()
    Range("E32:E220").Replace ".", "", xlPart
    Range("E32:E220").Replace " ", "", xlPart
End Sub
[/vba]
 
Ответить
СообщениеА может так?
[vba]
Код
Sub WWW()
    Range("E32:E220").Replace ".", "", xlPart
    Range("E32:E220").Replace " ", "", xlPart
End Sub
[/vba]

Автор - Wasilich
Дата добавления - 05.03.2016 в 15:55
МВТ Дата: Суббота, 05.03.2016, 16:20 | Сообщение № 5
Группа: Проверенные
Ранг: Обитатель
Сообщений: 475
Репутация: 135 ±
Замечаний: 0% ±

Excel 2007
Как вариант: работает с любыми целыми числами и произвольным количеством пробелов перед "шт", игнорирует наличие или отсутствие точки после "шт"
[vba]
Код
Option Explicit
Sub tt()
Dim Rng As Range, arr(), I As Long
On Error Resume Next
Set Rng = Application.InputBox("Выберите диапазон", , Selection.Address, , , , , 8)
If Err Then
    Err.Clear
    Exit Sub
End If
If Rng.Rows.Count > 1 Then
    arr = Rng.Value
Else
        ReDim arr(1 To 1, 1 To 1): arr(1, 1) = ActiveCell.Value
End If
With CreateObject("vbscript.regexp")
    .Pattern = "(\d+) +(шт)\.?"
    For I = 1 To UBound(arr)
        arr(I, 1) = .Replace(arr(I, 1), "$1$2")
    Next
End With
Rng.Value = arr
End Sub
[/vba]
 
Ответить
СообщениеКак вариант: работает с любыми целыми числами и произвольным количеством пробелов перед "шт", игнорирует наличие или отсутствие точки после "шт"
[vba]
Код
Option Explicit
Sub tt()
Dim Rng As Range, arr(), I As Long
On Error Resume Next
Set Rng = Application.InputBox("Выберите диапазон", , Selection.Address, , , , , 8)
If Err Then
    Err.Clear
    Exit Sub
End If
If Rng.Rows.Count > 1 Then
    arr = Rng.Value
Else
        ReDim arr(1 To 1, 1 To 1): arr(1, 1) = ActiveCell.Value
End If
With CreateObject("vbscript.regexp")
    .Pattern = "(\d+) +(шт)\.?"
    For I = 1 To UBound(arr)
        arr(I, 1) = .Replace(arr(I, 1), "$1$2")
    Next
End With
Rng.Value = arr
End Sub
[/vba]

Автор - МВТ
Дата добавления - 05.03.2016 в 16:20
Yar4i4 Дата: Среда, 09.03.2016, 07:18 | Сообщение № 6
Группа: Пользователи
Ранг: Участник
Сообщений: 55
Репутация: 0 ±
Замечаний: 20% ±

Excel 2013

Оказалось всё так просто, я даже не думал в этой плоскости.
Действительно, все опечатки в области единиц измерения связаны с точками и пробелами. Возможно и будут встречаться двухсловные единицы измерения, но за мою практику я таких не встречал.

Проанализируйте

я пока многого не понимаю, но Selection.Replace " ", "" - из пробела пустоту, Selection.Replace "шт", "шт." - из шт в шт. Классно.

тайный смысл

я rng.Offset скопировал из ранее использованного макроса толком не зная что оно означает.

Спасибо, мне было приятно посмотреть все вариации этого решения.
 
Ответить
Сообщение
Оказалось всё так просто, я даже не думал в этой плоскости.
Действительно, все опечатки в области единиц измерения связаны с точками и пробелами. Возможно и будут встречаться двухсловные единицы измерения, но за мою практику я таких не встречал.

Проанализируйте

я пока многого не понимаю, но Selection.Replace " ", "" - из пробела пустоту, Selection.Replace "шт", "шт." - из шт в шт. Классно.

тайный смысл

я rng.Offset скопировал из ранее использованного макроса толком не зная что оно означает.

Спасибо, мне было приятно посмотреть все вариации этого решения.

Автор - Yar4i4
Дата добавления - 09.03.2016 в 07:18
StoTisteg Дата: Среда, 09.03.2016, 21:52 | Сообщение № 7
Группа: Авторы
Ранг: Ветеран
Сообщений: 541
Репутация: 45 ±
Замечаний: 0% ±

Excel 2010
А от нас Вы чего хотите? Чтобы мы Вам парсили фразы на русском языке? Так я Вам заранее скажу — распарсить "непонял, чо за ерунда", означающее "мне кажется, здесь необходим другой формат данных", невозможно.


Проверь всё. ThisWorkbook.Save. On Error Resume Next.

Сообщение отредактировал StoTisteg - Среда, 09.03.2016, 22:04
 
Ответить
СообщениеА от нас Вы чего хотите? Чтобы мы Вам парсили фразы на русском языке? Так я Вам заранее скажу — распарсить "непонял, чо за ерунда", означающее "мне кажется, здесь необходим другой формат данных", невозможно.

Автор - StoTisteg
Дата добавления - 09.03.2016 в 21:52
Pelena Дата: Среда, 09.03.2016, 21:59 | Сообщение № 8
Группа: Модераторы
Ранг: Экселист
Сообщений: 9842
Репутация: 2252 ±
Замечаний: 0% ±

Excel 2010 & Mac Excel 2011
StoTisteg, сами свой пост отредактируете или мне бан Вам выписать за нарушение Правил форума?


"Черт возьми, Холмс! Но как??!!"
ЯД 41001765434816
 
Ответить
СообщениеStoTisteg, сами свой пост отредактируете или мне бан Вам выписать за нарушение Правил форума?

Автор - Pelena
Дата добавления - 09.03.2016 в 21:59
StoTisteg Дата: Среда, 09.03.2016, 22:07 | Сообщение № 9
Группа: Авторы
Ранг: Ветеран
Сообщений: 541
Репутация: 45 ±
Замечаний: 0% ±

Excel 2010
Прошу прощения.


Проверь всё. ThisWorkbook.Save. On Error Resume Next.
 
Ответить
СообщениеПрошу прощения.

Автор - StoTisteg
Дата добавления - 09.03.2016 в 22:07
StoTisteg Дата: Среда, 09.03.2016, 22:14 | Сообщение № 10
Группа: Авторы
Ранг: Ветеран
Сообщений: 541
Репутация: 45 ±
Замечаний: 0% ±

Excel 2010
Число возможностей ошибиться во всяческих "шт" практически не ограниченно, как это ни странно и предусмотреть всё Вам просто не удастся. Проще сделать выпадающий список с единицами измерения.


Проверь всё. ThisWorkbook.Save. On Error Resume Next.
 
Ответить
СообщениеЧисло возможностей ошибиться во всяческих "шт" практически не ограниченно, как это ни странно и предусмотреть всё Вам просто не удастся. Проще сделать выпадающий список с единицами измерения.

Автор - StoTisteg
Дата добавления - 09.03.2016 в 22:14
Yar4i4 Дата: Четверг, 17.03.2016, 12:30 | Сообщение № 11
Группа: Пользователи
Ранг: Участник
Сообщений: 55
Репутация: 0 ±
Замечаний: 20% ±

Excel 2013
Число возможностей ошибиться

Под "ошибкой" я понимаю не саму ошибку, а не стандарт.
Часто люди употребляют в общепризнанных сокращениях точки, а некоторые люди эти точки часто ставят после пробела. Я не говорю, что это не правильно и я не говорю, что это правильно. Мне не важно это. Мне интересно, чтобы все вариации со "шт." были унифицированы после завершения воспроизведения макроса.
Это "часто" не стоит принимать как общепринятое "часто" - это "часто" я взял из моей практики инженера-сметчика.
У каждого из нас своё "часто". Философия окончена...

В данном случае мне подошёл вариант:
[vba]
Код
Sub WWW()
    Range("E32:E220").Replace ".", "", xlPart
    Range("E32:E220").Replace " ", "", xlPart
End Sub
[/vba]
Также мне стало приятным открытием условие "Or" - я его с удовольствием пользую.
Спасибо огромное Вам (плюсики всем поставил)).
 
Ответить
Сообщение
Число возможностей ошибиться

Под "ошибкой" я понимаю не саму ошибку, а не стандарт.
Часто люди употребляют в общепризнанных сокращениях точки, а некоторые люди эти точки часто ставят после пробела. Я не говорю, что это не правильно и я не говорю, что это правильно. Мне не важно это. Мне интересно, чтобы все вариации со "шт." были унифицированы после завершения воспроизведения макроса.
Это "часто" не стоит принимать как общепринятое "часто" - это "часто" я взял из моей практики инженера-сметчика.
У каждого из нас своё "часто". Философия окончена...

В данном случае мне подошёл вариант:
[vba]
Код
Sub WWW()
    Range("E32:E220").Replace ".", "", xlPart
    Range("E32:E220").Replace " ", "", xlPart
End Sub
[/vba]
Также мне стало приятным открытием условие "Or" - я его с удовольствием пользую.
Спасибо огромное Вам (плюсики всем поставил)).

Автор - Yar4i4
Дата добавления - 17.03.2016 в 12:30
StoTisteg Дата: Четверг, 17.03.2016, 21:27 | Сообщение № 12
Группа: Авторы
Ранг: Ветеран
Сообщений: 541
Репутация: 45 ±
Замечаний: 0% ±

Excel 2010
Под "ошибкой" я понимаю не саму ошибку, а не стандарт.Часто люди употребляют в общепризнанных сокращениях точки, а некоторые люди эти точки часто ставят после пробела

Я тоже. И т. д., и т.п. Рано или поздно Вы обнаружите, что кто-то написал "10тш. " вместо "10 шт", а Вам всё это парсить :p


Проверь всё. ThisWorkbook.Save. On Error Resume Next.
 
Ответить
Сообщение
Под "ошибкой" я понимаю не саму ошибку, а не стандарт.Часто люди употребляют в общепризнанных сокращениях точки, а некоторые люди эти точки часто ставят после пробела

Я тоже. И т. д., и т.п. Рано или поздно Вы обнаружите, что кто-то написал "10тш. " вместо "10 шт", а Вам всё это парсить :p

Автор - StoTisteg
Дата добавления - 17.03.2016 в 21:27
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Макрос несколько условий IF в одной строке и одном блоке (Макросы/Sub)
Страница 1 из 11
Поиск:

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