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

Вход

Регистрация

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

 

= Мир MS Excel/Поиск и замена натуральных чисел в массиве Excel - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_  
Поиск и замена натуральных чисел в массиве Excel
selles-2013 Дата: Вторник, 08.11.2022, 14:33 | Сообщение № 1
Группа: Пользователи
Ранг: Прохожий
Сообщений: 8
Репутация: 0 ±
Замечаний: 0% ±

Суть проблемы в следующем:
Есть массив натуральных чисел от 1 до 12, означающих номер (или количество) месяца (месяцев) исполнения. Чисел очень много, поскольку этот массив (файл xlsm )"разбирается" по другим программам. И формируется этот файл другими программами, и разными людьми.

Но проблема в том, что потом досылаются распоряжения о переносе месяца исполнений, например, с 1 месяца на месяц 5, и т.д. И приходится менять в массиве число 1 на число 5. Замен могут быть сотни. Чисел от 1 до 12 очень много. Проблему решало бы использования функций замены Excel. Но там месяц 12 (как содержащий цифру 1) меняется на 52. И т.д. Приходится вручную делать каждую замену. Долго.

Код следующий:

[vba]
Код
Sub replaceByList()
    Dim replaceRn As Range, inputRn As Range, replacementsRn As Range
    ' Определяем диапазон со значениями для замен
    With ThisWorkbook.Sheets("Список замен")
        Set replacementsRn = Range(.Cells(2, 1), .Cells(.Rows.Count, 1).End(xlUp).Offset(0, 1))
    End With
    With ThisWorkbook.Sheets("Массив замен")
        ' Устанавливаем стартовый диапазон
        Set replaceRn = Range(.Cells(2, 1), .Cells(.Rows.Count, 1).End(xlUp))
        ' Выделяем стартовый диапазон
        replaceRn.Parent.Activate
        replaceRn.Select
        ' Выведем запрос на изменение диапазона
        On Error Resume Next
        Set inputRn = Application.InputBox( _
                        Prompt:="Адрес для массовой замены", _
                        Title:="Замена по списку", _
                        Default:=replaceRn.Address(True, True, xlA1, True), _
                        Type:=8)
        Err.Clear
        On Error GoTo 0
        ' Если пользователь отменил выделение - выйдем из макроса с предупреждением
        If Not inputRn Is Nothing Then
            Set replaceRn = inputRn
        Else
            MsgBox "Диапазон не выбран", vbCritical
            Exit Sub
        End If
    End With
    
    ' Для каждой пары заменяемых значений сделаем замену
    For Each rrow In replacementsRn.Rows
        replaceRn.Replace What:=rrow.Cells(1, 1).Value, Replacement:=rrow.Cells(1, 2).Value
    Next rrow
    
    ' Выведем сообщение о завершении работы (можно убрать)
    MsgBox "Done!", vbInformation
End Sub
[/vba]

Прикрепляю сам файл. Он сильно упрощен, но содержит суть проблемы.
Что можно сделать чтоб не было таких месяцев как 52 при замене месяца 1 на 5 при массовой замене?
К сообщению приложен файл: 4990944.xlsm (20.0 Kb)


Сообщение отредактировал selles-2013 - Вторник, 08.11.2022, 15:36
 
Ответить
СообщениеСуть проблемы в следующем:
Есть массив натуральных чисел от 1 до 12, означающих номер (или количество) месяца (месяцев) исполнения. Чисел очень много, поскольку этот массив (файл xlsm )"разбирается" по другим программам. И формируется этот файл другими программами, и разными людьми.

Но проблема в том, что потом досылаются распоряжения о переносе месяца исполнений, например, с 1 месяца на месяц 5, и т.д. И приходится менять в массиве число 1 на число 5. Замен могут быть сотни. Чисел от 1 до 12 очень много. Проблему решало бы использования функций замены Excel. Но там месяц 12 (как содержащий цифру 1) меняется на 52. И т.д. Приходится вручную делать каждую замену. Долго.

Код следующий:

[vba]
Код
Sub replaceByList()
    Dim replaceRn As Range, inputRn As Range, replacementsRn As Range
    ' Определяем диапазон со значениями для замен
    With ThisWorkbook.Sheets("Список замен")
        Set replacementsRn = Range(.Cells(2, 1), .Cells(.Rows.Count, 1).End(xlUp).Offset(0, 1))
    End With
    With ThisWorkbook.Sheets("Массив замен")
        ' Устанавливаем стартовый диапазон
        Set replaceRn = Range(.Cells(2, 1), .Cells(.Rows.Count, 1).End(xlUp))
        ' Выделяем стартовый диапазон
        replaceRn.Parent.Activate
        replaceRn.Select
        ' Выведем запрос на изменение диапазона
        On Error Resume Next
        Set inputRn = Application.InputBox( _
                        Prompt:="Адрес для массовой замены", _
                        Title:="Замена по списку", _
                        Default:=replaceRn.Address(True, True, xlA1, True), _
                        Type:=8)
        Err.Clear
        On Error GoTo 0
        ' Если пользователь отменил выделение - выйдем из макроса с предупреждением
        If Not inputRn Is Nothing Then
            Set replaceRn = inputRn
        Else
            MsgBox "Диапазон не выбран", vbCritical
            Exit Sub
        End If
    End With
    
    ' Для каждой пары заменяемых значений сделаем замену
    For Each rrow In replacementsRn.Rows
        replaceRn.Replace What:=rrow.Cells(1, 1).Value, Replacement:=rrow.Cells(1, 2).Value
    Next rrow
    
    ' Выведем сообщение о завершении работы (можно убрать)
    MsgBox "Done!", vbInformation
End Sub
[/vba]

Прикрепляю сам файл. Он сильно упрощен, но содержит суть проблемы.
Что можно сделать чтоб не было таких месяцев как 52 при замене месяца 1 на 5 при массовой замене?

Автор - selles-2013
Дата добавления - 08.11.2022 в 14:33
selles-2013 Дата: Вторник, 08.11.2022, 14:52 | Сообщение № 2
Группа: Пользователи
Ранг: Прохожий
Сообщений: 8
Репутация: 0 ±
Замечаний: 0% ±

Что-то код переводится? :(
 
Ответить
СообщениеЧто-то код переводится? :(

Автор - selles-2013
Дата добавления - 08.11.2022 в 14:52
Pelena Дата: Вторник, 08.11.2022, 15:30 | Сообщение № 3
Группа: Админы
Ранг: Местный житель
Сообщений: 19392
Репутация: 4537 ±
Замечаний: ±

Excel 365 & Mac Excel
Для оформления кода используйте кнопку # на панели инструментов при редактировании поста.
Исправила на первый раз


"Черт возьми, Холмс! Но как??!!"
Ю-money 41001765434816
 
Ответить
СообщениеДля оформления кода используйте кнопку # на панели инструментов при редактировании поста.
Исправила на первый раз

Автор - Pelena
Дата добавления - 08.11.2022 в 15:30
selles-2013 Дата: Вторник, 08.11.2022, 15:34 | Сообщение № 4
Группа: Пользователи
Ранг: Прохожий
Сообщений: 8
Репутация: 0 ±
Замечаний: 0% ±

Спасибо!
 
Ответить
СообщениеСпасибо!

Автор - selles-2013
Дата добавления - 08.11.2022 в 15:34
Pelena Дата: Вторник, 08.11.2022, 15:40 | Сообщение № 5
Группа: Админы
Ранг: Местный житель
Сообщений: 19392
Репутация: 4537 ±
Замечаний: ±

Excel 365 & Mac Excel
Попробуйте строчку
[vba]
Код
replaceRn.Replace What:=rrow.Cells(1, 1).Value, Replacement:=rrow.Cells(1, 2).Value
[/vba]
немного дополнить
[vba]
Код
replaceRn.Replace What:=rrow.Cells(1, 1).Value, Replacement:=rrow.Cells(1, 2).Value, LookAt:=xlWhole
[/vba]


"Черт возьми, Холмс! Но как??!!"
Ю-money 41001765434816
 
Ответить
СообщениеПопробуйте строчку
[vba]
Код
replaceRn.Replace What:=rrow.Cells(1, 1).Value, Replacement:=rrow.Cells(1, 2).Value
[/vba]
немного дополнить
[vba]
Код
replaceRn.Replace What:=rrow.Cells(1, 1).Value, Replacement:=rrow.Cells(1, 2).Value, LookAt:=xlWhole
[/vba]

Автор - Pelena
Дата добавления - 08.11.2022 в 15:40
selles-2013 Дата: Четверг, 17.11.2022, 13:44 | Сообщение № 6
Группа: Пользователи
Ранг: Прохожий
Сообщений: 8
Репутация: 0 ±
Замечаний: 0% ±

Спасибо большое.

Все так и есть.
 
Ответить
СообщениеСпасибо большое.

Все так и есть.

Автор - selles-2013
Дата добавления - 17.11.2022 в 13:44
  • Страница 1 из 1
  • 1
Поиск:

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