Страницы: 1
RSS
VBA цикл, перебор значений
 
Добрый день.

Прошу подсказать, форумчане. Опишу потребность:
Во вложении файл с некоторыми данными Водителей. Самих водителей может быть как 2, так и 20, и 50, количество столбцов фиксировано. Нужно чтобы макрос выполнял некоторые действия (Приводил к общему виду, сжигал пробелы, и тд) например в ФИО, далее переходил к должности, производил какие-либо действия, переходил на следующий столбец и т.д. После окончания всех действий в каждом из столбцов, он должен спуститься на строку вниз и произвести все те же самые действия. И делать так до тех пор пока значения в столбце A не станут равны Empty. Как наступает Empty то break;

С синтаксисом VBA видимо совсем не дружу, не могу описать переменные и цикл.
 
Для 50-ти строк и 9-ти столбцов достаточно так
Код
Sub amauri8()
Dim lRow&
lRow = Cells(Rows.Count, 1).End(xlUp).Row   'последняя ячейка с данными в 1-м столбце
For I = 2 To lRow
    Cells(I, 1) = Trim(Cells(I, 1)) 'какие-то действия с ячейкой 1-го столбца
    Cells(I, 2) = Trim(Cells(I, 2)) 'какие-то действия с ячейкой 2-го столбца
    '........................................................................
    Cells(I, 9) = Trim(Cells(I, 9)) 'какие-то действия с ячейкой 9-го столбца
Next
End Sub
Согласие есть продукт при полном непротивлении сторон
 
Цитата
amauri8 написал:
Как наступает Empty то break
Вроде и по-русски, но частично )
 
Sanja,

Спасибо, это почти то что нужно и очень сильно помогло мне, но есть другие вопросы( я выделил их жирным шрифтом, остальные мысли вслух)
1. А почему для 50 строк? Где-то в коде указано ограничение? Просто как я понимаю он должен до последней ячейки все перебирать со значения, вплоть до 1048576, или это не так?

2. Задача была такого типа: Нужно в столбце B исправить "Российская Федерация", "Россия" и прочие возможные варианты на "РФ". Но в другом столбце, этого делать не нужно. Сейчас столкнулся с проблемой что он исправляет то что нужно исправить не в конкретном столбце, а во всех вообще столбцах.

Пример ниже в окошке с кодом человечьими словами: "Столбец который содержит в себе серию паспорта приводим к текстовому значению. Потому что некоторые серии начинаются с нуля и в других вариантах числовых форматов эти нули исчезают. Далее в этом же столбце убираем точки, потому что некоторые "не хорошие партнеры" догадываются скинуть в общем формате серию = ".0378". Поэтому в этом столбце нам нужно избавиться от точек.  По фрагменту кода представленному ниже, он сожгет все точки еще и в столбце "Кем выдан" "Гражданство" и вообще везде до куда дойдет, хотя там уже точки быть должны, это другая сфера ответственности.

Как объяснить экселю что точки нужно жечь только в 5 столбце, а при переходе на 4, 3, 6 и тд, break?

Решение которое я вижу: поставить адресацию в самом действии: Cells(I, 5).Replace.. и далее по тексту.

Оно прекрасно конечно работает, но есть ли способ описать Cells (I, 5) как самостоятельную переменную чтобы можно было обращаться к ней напрямую?

В теории это должно выглядеть так:
Dim Кем_выдан as String
Кем_выдан = Cells(I, 7)

Но на практике не работает)))

Кем_выдан.Replace ... и тд. Или это не будет иметь практического смысла и лучше обращаться через (I, x) ?

Код
    Cells(I, 5).NumberFormat = "@" ' серия паспорта
    
        Cells.Replace What:=".", Replacement:="", LookAt:=xlPart, _
    SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
    ReplaceFormat:=False
    
    Cells(I, 7) = Trim(Cells(I, 7)) ' Кем выдан
Изменено: amauri8 - 04.08.2019 16:17:39
 
amauri8, а с какой целью Вы процитировали целиком всё сообщение? Даже подпись захватили.
Вернитесь в своё сообщение и удалите то, что Вы ошибочно считаете цитатой.
 
Цитата
amauri8 написал: 1. А почему для 50 строк? Просто как я понимаю он должен до последней ячейки все перебирать со значения, вплоть до 1048576, или это не так?
50 - это указали Вы в стартовом сообщении
Цитата
amauri8 написал: Самих водителей может быть как 2, так и 20, и 50
это во-первых. Или это не так? Но в макросе сделан перебор до последней ячейке с данными
Цитата
Sanja написал: lRow = Cells(Rows.Count, 1).End(xlUp).Row   'последняя ячейка с данными в 1-м столбце
если она (ячейка с данными) будет в 1048576 строке, то цикл будет продолжаться до нее.
Цитата
amauri8 написал: 2. Задача была такого типа: ... Как объяснить экселю что точки нужно жечь только в 5 столбце, а при переходе на 4, 3, 6 и тд, break?
Нет, задача была совсем другая
Цитата
amauri8 написал: Нужно чтобы макрос выполнял некоторые действия... производил какие-либо действия, ...и т.д.
и в моем макросе, функция Trim приведена как пример этих самых, каких-либо, действий. Можете заменять их на нужные Вам
Изменено: Sanja - 04.08.2019 15:51:45
Согласие есть продукт при полном непротивлении сторон
 
Цитата
Юрий М написал:
Вернитесь в своё сообщение и удалите то, что Вы ошибочно считаете цитатой.
Убрал подпись. На самом деле с правилами форумов не знаком, и как правильно ответить целиком на сообщение не знаю. Поэтому извините и скорректируйте, сейчас нормально выглядит? Или если отвечаешь на все сообщение, нужно использовать какой-то другой инструмент?
 
amauri8, цитата - часть текста, на которой хотите сделать акцент. Зачем Вы процитировали код? Или думаете, что Sanja его не помнит? ))
Хотите обратиться по имени - для этого есть специальная кнопка. Она так и называется - "Имя"
Вернитесь и удалите то, что процитировали - не нужно захламлять сообщения.
 
Да, другой. Называется "клавиатура". А внизу страницы есть поле для ввода текста.
 
Цитата
Sanja написал:
Нет, задача была совсем другая
Это одна и та же задача, возможно просто описываю ее по разному.
Цитата
amauri8 написал:
Нужно чтобы макрос выполнял некоторые действия (Приводил к общему виду, сжигал пробелы, и тд)
Если у нас таких действий ни одно в каждом столбце, а несколько. Например: сжечь пробелы, поменять знаки. Имеет ли смысл вводить для этого переменную? Или обращаться через адреса ячеек?
 
Юрий М, А так норм? Удалить цитату было довольно - таки сложно, но я вроде справился.
 
Нормально.
По вопросу: если для одной и той же ячейки требуется выполнить несколько разных операций, то, чтобы каждый раз не указывать ячейку, используйте конструкцию With - End with
 
Юрий М, Спасибо большое за помощь.
Страницы: 1
Наверх