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

Вход

Регистрация

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

 

= Мир MS Excel/Преобразовать В Прописные Только Первые Буквы Слов В Ячейке - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_  
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Преобразовать В Прописные Только Первые Буквы Слов В Ячейке (Макросы/Sub)
Преобразовать В Прописные Только Первые Буквы Слов В Ячейке
DrMini Дата: Четверг, 25.04.2019, 10:01 | Сообщение № 1
Группа: Друзья
Ранг: Старожил
Сообщений: 1647
Репутация: 208 ±
Замечаний: 0% ±

Excel LTSC 2024 RUS
Доброе время суток Форумчане.
Надо что бы в введённые в ячейке фамилии с инициалами (иногда просто фамилия) писались с Заглавной буквы. Нашёл в Internet`e макрос:
[vba]
Код
Sub Proper_Case()
   For Each x In Range("C1:C5")
       x.Value = Application.Proper(x.Value)
   Next
End Sub
[/vba]
но он работает по нажатию на кнопку.
Помогите сделать так, что бы данные в ячейке изменялись автоматически при после заполнении ячейки.
К сообщению приложен файл: __.xlsm (13.7 Kb)
 
Ответить
СообщениеДоброе время суток Форумчане.
Надо что бы в введённые в ячейке фамилии с инициалами (иногда просто фамилия) писались с Заглавной буквы. Нашёл в Internet`e макрос:
[vba]
Код
Sub Proper_Case()
   For Each x In Range("C1:C5")
       x.Value = Application.Proper(x.Value)
   Next
End Sub
[/vba]
но он работает по нажатию на кнопку.
Помогите сделать так, что бы данные в ячейке изменялись автоматически при после заполнении ячейки.

Автор - DrMini
Дата добавления - 25.04.2019 в 10:01
K-SerJC Дата: Четверг, 25.04.2019, 10:29 | Сообщение № 2
Группа: Проверенные
Ранг: Обитатель
Сообщений: 487
Репутация: 86 ±
Замечаний: 0% ±

Excel 2013
автоматически при после заполнении ячейки.

а вот так в модуль листа?
[vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range)
Application.EnableEvents = False
For Each x In Target
     x.Value = Application.Proper(x.Value)
   Next x
Application.EnableEvents = True
End Sub
[/vba]
К сообщению приложен файл: 4553428.xlsm (14.3 Kb)


Благими намерениями выстелена дорога в АД.

Сообщение отредактировал K-SerJC - Четверг, 25.04.2019, 10:29
 
Ответить
Сообщение
автоматически при после заполнении ячейки.

а вот так в модуль листа?
[vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range)
Application.EnableEvents = False
For Each x In Target
     x.Value = Application.Proper(x.Value)
   Next x
Application.EnableEvents = True
End Sub
[/vba]

Автор - K-SerJC
Дата добавления - 25.04.2019 в 10:29
DrMini Дата: Четверг, 25.04.2019, 10:41 | Сообщение № 3
Группа: Друзья
Ранг: Старожил
Сообщений: 1647
Репутация: 208 ±
Замечаний: 0% ±

Excel LTSC 2024 RUS
Работает идеально. СПАСИБО!
Буду пробовать подружить этот макрос с другими на этом листе. И задать диапазон.
 
Ответить
СообщениеРаботает идеально. СПАСИБО!
Буду пробовать подружить этот макрос с другими на этом листе. И задать диапазон.

Автор - DrMini
Дата добавления - 25.04.2019 в 10:41
DrMini Дата: Четверг, 25.04.2019, 11:04 | Сообщение № 4
Группа: Друзья
Ранг: Старожил
Сообщений: 1647
Репутация: 208 ±
Замечаний: 0% ±

Excel LTSC 2024 RUS
У меня что-то получилось но... не совсем. Очень долго обрабатывается (2-3 секунды голубой ореол вокруг курсора) после ввода данных в любую ячейку. Как будто, что-то зациклилось.
Подправьте пожалуйста.
Файл прилагаю.
К сообщению приложен файл: Dispatcher.zip (65.9 Kb)
 
Ответить
СообщениеУ меня что-то получилось но... не совсем. Очень долго обрабатывается (2-3 секунды голубой ореол вокруг курсора) после ввода данных в любую ячейку. Как будто, что-то зациклилось.
Подправьте пожалуйста.
Файл прилагаю.

Автор - DrMini
Дата добавления - 25.04.2019 в 11:04
K-SerJC Дата: Четверг, 25.04.2019, 11:36 | Сообщение № 5
Группа: Проверенные
Ранг: Обитатель
Сообщений: 487
Репутация: 86 ±
Замечаний: 0% ±

Excel 2013
не то что зациклилось

просто вы все ячейки диапазона прогоняете через функцию, добавил условие если не пустая
а еще несколько раз в процедуре включать и отключать обработку событий и обновление экрана не обоснованная трата ресурсов
вначале отключаете, выполняете код потом включаете

[vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range)
     Application.EnableEvents = False
     Application.ScreenUpdating = 0
     If Target.Count > 1 Then Exit Sub
    If Not Intersect(Target, Range("C5:C10000,E5:E10000,G5:G10000")) Is Nothing Then
        If Target.NumberFormat = "m/d/yyyy" Then
            Target.NumberFormat = "General"
        End If
        x_ = Target
        If Len(x_) = 5 Or Len(x_) = 6 Then
            If IsDate(Format(x_, "00\/00\/00")) Then
                If Mid(Format(x_, "00\/00\/00"), 4, 2) > 12 Then GoTo error_
                x_ = CDate(Format(x_, "00\/00\/00"))
            Else: GoTo error_
            End If
        ElseIf Len(x_) = 7 Or Len(x_) = 8 Then
            If IsDate(Format(x_, "00\/00\/0000")) Then
                If Mid(Format(x_, "00\/00\/0000"), 4, 2) > 12 Then GoTo error_
                x_ = CDate(Format(x_, "00\/00\/0000"))
            Else: GoTo error_
            End If
        Else: GoTo error_
        End If
   
        Target = x_
      
    ElseIf Not Intersect(Target, Range("D5:D10000,F5:F10000,H5:H10000")) Is Nothing Then
        If Len(Target) = 3 Or Len(Target) = 4 Then
            If IsDate(Format(Format(Target.Value, "00:00"), "h:nn")) Then
                Target = Format(Format(Target.Value, "00:00"), "h:nn")
            Else
                Application.Undo
            End If
        End If
    End If
    Dim d0_ As Range
    Set d_ = Intersect(Target, Range("J5:J2000"))
    If Not d_ Is Nothing Then
        
        On Error Resume Next
        With d_
            For Each d0_ In d_
                d0_ = --Right(d0_, 10)
                d0_.NumberFormat = "[<=9999999]#-##-##;+7(###) ###-##-##"
            Next d0_
        End With
        
    End If
' Прописные

'For Each x In Target 'на весь лист
For Each x In Range("I5:I2000") 'диапазон
    If x.Value <> "" Then x.Value = Application.Proper(x.Value)
Next x
Application.EnableEvents = True
Application.ScreenUpdating = 1
        Exit Sub
error_:
        Target = Empty
        Application.EnableEvents = True
    End Sub
[/vba]


Благими намерениями выстелена дорога в АД.
 
Ответить
Сообщениене то что зациклилось

просто вы все ячейки диапазона прогоняете через функцию, добавил условие если не пустая
а еще несколько раз в процедуре включать и отключать обработку событий и обновление экрана не обоснованная трата ресурсов
вначале отключаете, выполняете код потом включаете

[vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range)
     Application.EnableEvents = False
     Application.ScreenUpdating = 0
     If Target.Count > 1 Then Exit Sub
    If Not Intersect(Target, Range("C5:C10000,E5:E10000,G5:G10000")) Is Nothing Then
        If Target.NumberFormat = "m/d/yyyy" Then
            Target.NumberFormat = "General"
        End If
        x_ = Target
        If Len(x_) = 5 Or Len(x_) = 6 Then
            If IsDate(Format(x_, "00\/00\/00")) Then
                If Mid(Format(x_, "00\/00\/00"), 4, 2) > 12 Then GoTo error_
                x_ = CDate(Format(x_, "00\/00\/00"))
            Else: GoTo error_
            End If
        ElseIf Len(x_) = 7 Or Len(x_) = 8 Then
            If IsDate(Format(x_, "00\/00\/0000")) Then
                If Mid(Format(x_, "00\/00\/0000"), 4, 2) > 12 Then GoTo error_
                x_ = CDate(Format(x_, "00\/00\/0000"))
            Else: GoTo error_
            End If
        Else: GoTo error_
        End If
   
        Target = x_
      
    ElseIf Not Intersect(Target, Range("D5:D10000,F5:F10000,H5:H10000")) Is Nothing Then
        If Len(Target) = 3 Or Len(Target) = 4 Then
            If IsDate(Format(Format(Target.Value, "00:00"), "h:nn")) Then
                Target = Format(Format(Target.Value, "00:00"), "h:nn")
            Else
                Application.Undo
            End If
        End If
    End If
    Dim d0_ As Range
    Set d_ = Intersect(Target, Range("J5:J2000"))
    If Not d_ Is Nothing Then
        
        On Error Resume Next
        With d_
            For Each d0_ In d_
                d0_ = --Right(d0_, 10)
                d0_.NumberFormat = "[<=9999999]#-##-##;+7(###) ###-##-##"
            Next d0_
        End With
        
    End If
' Прописные

'For Each x In Target 'на весь лист
For Each x In Range("I5:I2000") 'диапазон
    If x.Value <> "" Then x.Value = Application.Proper(x.Value)
Next x
Application.EnableEvents = True
Application.ScreenUpdating = 1
        Exit Sub
error_:
        Target = Empty
        Application.EnableEvents = True
    End Sub
[/vba]

Автор - K-SerJC
Дата добавления - 25.04.2019 в 11:36
DrMini Дата: Четверг, 25.04.2019, 11:44 | Сообщение № 6
Группа: Друзья
Ранг: Старожил
Сообщений: 1647
Репутация: 208 ±
Замечаний: 0% ±

Excel LTSC 2024 RUS
K-SerJC, Я не раз говорил, что я в VBA ваааще полный ноль. Думал получится но... как всегда. Сейчас буду пробовать.
 
Ответить
СообщениеK-SerJC, Я не раз говорил, что я в VBA ваааще полный ноль. Думал получится но... как всегда. Сейчас буду пробовать.

Автор - DrMini
Дата добавления - 25.04.2019 в 11:44
RAN Дата: Четверг, 25.04.2019, 11:44 | Сообщение № 7
Группа: Друзья
Ранг: Экселист
Сообщений: 5660
Репутация: 1163 ±
Замечаний: 0% ±

2010
[vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Count > 1 Then Exit Sub
    If Not Intersect(Target, Range("C5:C10000,E5:E10000,G5:G10000")) Is Nothing Then
        If Target.NumberFormat = "m/d/yyyy" Then
            Target.NumberFormat = "General"
        End If
        x_ = Target
        If Len(x_) = 5 Or Len(x_) = 6 Then
            If IsDate(Format(x_, "00\/00\/00")) Then
                If Mid(Format(x_, "00\/00\/00"), 4, 2) > 12 Then GoTo error_
                x_ = CDate(Format(x_, "00\/00\/00"))
            Else: GoTo error_
            End If
        ElseIf Len(x_) = 7 Or Len(x_) = 8 Then
            If IsDate(Format(x_, "00\/00\/0000")) Then
                If Mid(Format(x_, "00\/00\/0000"), 4, 2) > 12 Then GoTo error_
                x_ = CDate(Format(x_, "00\/00\/0000"))
            Else: GoTo error_
            End If
        Else: GoTo error_
        End If
        Application.EnableEvents = False
        Target = x_
        Application.EnableEvents = True
    ElseIf Not Intersect(Target, Range("D5:D10000,F5:F10000,H5:H10000")) Is Nothing Then
        If Len(Target) = 3 Or Len(Target) = 4 Then
            If IsDate(Format(Format(Target.Value, "00:00"), "h:nn")) Then
                Application.EnableEvents = False
                Target = Format(Format(Target.Value, "00:00"), "h:nn")
                Application.EnableEvents = True
            Else
                Application.EnableEvents = False
                Application.Undo
                Application.EnableEvents = True
            End If
        End If
    ElseIf Not Intersect(Target, Range("J5:J10000")) Is Nothing Then
         Application.EnableEvents = False
        If Len(Target) Then Target = --Right(Target, 10)
        Target.NumberFormat = "[<=9999999]#-##-##;+7(###) ###-##-##"
        Application.EnableEvents = True
    ElseIf Not Intersect(Target, Range("I5:I10000")) Is Nothing Then
        Application.EnableEvents = False
        Target = Application.Proper(Target)
        Application.EnableEvents = True
    End If

    Exit Sub
error_:
    Application.EnableEvents = False
    Target = Empty
    Application.EnableEvents = True
End Sub
[/vba]


Быть или не быть, вот в чем загвоздка!
 
Ответить
Сообщение[vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Count > 1 Then Exit Sub
    If Not Intersect(Target, Range("C5:C10000,E5:E10000,G5:G10000")) Is Nothing Then
        If Target.NumberFormat = "m/d/yyyy" Then
            Target.NumberFormat = "General"
        End If
        x_ = Target
        If Len(x_) = 5 Or Len(x_) = 6 Then
            If IsDate(Format(x_, "00\/00\/00")) Then
                If Mid(Format(x_, "00\/00\/00"), 4, 2) > 12 Then GoTo error_
                x_ = CDate(Format(x_, "00\/00\/00"))
            Else: GoTo error_
            End If
        ElseIf Len(x_) = 7 Or Len(x_) = 8 Then
            If IsDate(Format(x_, "00\/00\/0000")) Then
                If Mid(Format(x_, "00\/00\/0000"), 4, 2) > 12 Then GoTo error_
                x_ = CDate(Format(x_, "00\/00\/0000"))
            Else: GoTo error_
            End If
        Else: GoTo error_
        End If
        Application.EnableEvents = False
        Target = x_
        Application.EnableEvents = True
    ElseIf Not Intersect(Target, Range("D5:D10000,F5:F10000,H5:H10000")) Is Nothing Then
        If Len(Target) = 3 Or Len(Target) = 4 Then
            If IsDate(Format(Format(Target.Value, "00:00"), "h:nn")) Then
                Application.EnableEvents = False
                Target = Format(Format(Target.Value, "00:00"), "h:nn")
                Application.EnableEvents = True
            Else
                Application.EnableEvents = False
                Application.Undo
                Application.EnableEvents = True
            End If
        End If
    ElseIf Not Intersect(Target, Range("J5:J10000")) Is Nothing Then
         Application.EnableEvents = False
        If Len(Target) Then Target = --Right(Target, 10)
        Target.NumberFormat = "[<=9999999]#-##-##;+7(###) ###-##-##"
        Application.EnableEvents = True
    ElseIf Not Intersect(Target, Range("I5:I10000")) Is Nothing Then
        Application.EnableEvents = False
        Target = Application.Proper(Target)
        Application.EnableEvents = True
    End If

    Exit Sub
error_:
    Application.EnableEvents = False
    Target = Empty
    Application.EnableEvents = True
End Sub
[/vba]

Автор - RAN
Дата добавления - 25.04.2019 в 11:44
DrMini Дата: Четверг, 25.04.2019, 11:50 | Сообщение № 8
Группа: Друзья
Ранг: Старожил
Сообщений: 1647
Репутация: 208 ±
Замечаний: 0% ±

Excel LTSC 2024 RUS
не то что зациклилось

Всё работает. Спасибо.
 
Ответить
Сообщение
не то что зациклилось

Всё работает. Спасибо.

Автор - DrMini
Дата добавления - 25.04.2019 в 11:50
DrMini Дата: Четверг, 25.04.2019, 11:55 | Сообщение № 9
Группа: Друзья
Ранг: Старожил
Сообщений: 1647
Репутация: 208 ±
Замечаний: 0% ±

Excel LTSC 2024 RUS
Андрей, Спасибо. Ваш вариант тоже прекрасно работает.
 
Ответить
СообщениеАндрей, Спасибо. Ваш вариант тоже прекрасно работает.

Автор - DrMini
Дата добавления - 25.04.2019 в 11:55
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Преобразовать В Прописные Только Первые Буквы Слов В Ячейке (Макросы/Sub)
  • Страница 1 из 1
  • 1
Поиск:

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