Приветствую! Нужен макрос позволяющий найти текст "Электроды" в Excel и 1. если данные в ячейке справа ="т", то данные во второй ячейке справа от "электроды" отредактировать округлив до целого и умножив на 1000 т.е. не "0,00374", а "4". (D 22) 2. если данные в ячейке справа ="кг", то данные во второй ячейке справа от "электроды" отредактировать округлив до целого т.е. не "6,956", а "7". (D 23)
Приветствую! Нужен макрос позволяющий найти текст "Электроды" в Excel и 1. если данные в ячейке справа ="т", то данные во второй ячейке справа от "электроды" отредактировать округлив до целого и умножив на 1000 т.е. не "0,00374", а "4". (D 22) 2. если данные в ячейке справа ="кг", то данные во второй ячейке справа от "электроды" отредактировать округлив до целого т.е. не "6,956", а "7". (D 23)Yar4i4
Yar4i4, выделяете ячейки в столбике, в котором у Вас материалы и выполняете макрос [vba]
Код
Sub Red() Dim rng As Range For Each rng In Selection If rng = "Электроды" Then If rng.Offset(, 1) = "т" Then rng.Offset(, 2) = Round(rng.Offset(, 2) * 1000) Else If rng.Offset(, 1) = "кг" Then rng.Offset(, 2) = Round(rng.Offset(, 2)) End If End If End If Next rng End Sub
[/vba]
Yar4i4, выделяете ячейки в столбике, в котором у Вас материалы и выполняете макрос [vba]
Код
Sub Red() Dim rng As Range For Each rng In Selection If rng = "Электроды" Then If rng.Offset(, 1) = "т" Then rng.Offset(, 2) = Round(rng.Offset(, 2) * 1000) Else If rng.Offset(, 1) = "кг" Then rng.Offset(, 2) = Round(rng.Offset(, 2)) End If End If End If Next rng End Sub
данные во второй ячейке справа от "электроды" отредактировать округлив до целого и умножив на 1000 т.е. не "0,00374", а "4".
выполняем последовательно - округляем 0,00374 до целого, получаем 0, умножаем на 1000, получаем 0. Конечно, чисто по-человечески понятно, что имелось в виду наоборот - сначала умножаем, потом округляем.
Мой вариант макроса [vba]
Код
Sub tt() r1_ = Range("C" & Rows.Count).End(xlUp).Row For i = 20 To r1_ If Range("C" & i) = "т" Then Range("D" & i) = Round(Range("D" & i) * 1000, 0) ElseIf Range("C" & i) = "кг" Then Range("D" & i) = Round(Range("D" & i), 0) End If Next i End Sub
данные во второй ячейке справа от "электроды" отредактировать округлив до целого и умножив на 1000 т.е. не "0,00374", а "4".
выполняем последовательно - округляем 0,00374 до целого, получаем 0, умножаем на 1000, получаем 0. Конечно, чисто по-человечески понятно, что имелось в виду наоборот - сначала умножаем, потом округляем.
Мой вариант макроса [vba]
Код
Sub tt() r1_ = Range("C" & Rows.Count).End(xlUp).Row For i = 20 To r1_ If Range("C" & i) = "т" Then Range("D" & i) = Round(Range("D" & i) * 1000, 0) ElseIf Range("C" & i) = "кг" Then Range("D" & i) = Round(Range("D" & i), 0) End If Next i End Sub
Спасибо. Но я не вижу в макросе поиска "электроды". И последующего перехода к соседним ячейкам. У меня беда на переход от найденных "элекртодов" к соседним ячейкам
Спасибо. Но я не вижу в макросе поиска "электроды". И последующего перехода к соседним ячейкам. У меня беда на переход от найденных "элекртодов" к соседним ячейкамYar4i4
Доброе утро господа и дамы! Ещё один связанный вопрос по поиску ячеек с текстом и редактированием соседних ячеек: Всё тоже самое, но надо найти не конкретный текст "Элекстроды", а любой текст в ячейке (ячейку занятую любым содержанием) и эта ячейка самая нижняя в документе (листе). На примере: Всё тот же файл Excel с материалами (вложил), но надо найти самую нижнюю ячейку (D7) занятую любым текстом. И далее проследовать на три ячейки вниз (D10) и до упора влево (A10) и внести текст "Исполнитель____" (красным выделил в файле. ... т.е. высота документа с материалами меняется (в зависимости от количества материалов), а мне надо вносить стандартную "бороду" после самой нижней строки:
Доброе утро господа и дамы! Ещё один связанный вопрос по поиску ячеек с текстом и редактированием соседних ячеек: Всё тоже самое, но надо найти не конкретный текст "Элекстроды", а любой текст в ячейке (ячейку занятую любым содержанием) и эта ячейка самая нижняя в документе (листе). На примере: Всё тот же файл Excel с материалами (вложил), но надо найти самую нижнюю ячейку (D7) занятую любым текстом. И далее проследовать на три ячейки вниз (D10) и до упора влево (A10) и внести текст "Исполнитель____" (красным выделил в файле. ... т.е. высота документа с материалами меняется (в зависимости от количества материалов), а мне надо вносить стандартную "бороду" после самой нижней строки:
У меня беда на переход от найденных "элекртодов" к соседним ячейкам
Offset, например. Или определяем номер столбца (.Column) и прибавляем 1. Или еще что-нибудь придумать можно. Но зачем, если у Вас четко прописано, что менять нужно в столбце D?
У меня беда на переход от найденных "элекртодов" к соседним ячейкам
Offset, например. Или определяем номер столбца (.Column) и прибавляем 1. Или еще что-нибудь придумать можно. Но зачем, если у Вас четко прописано, что менять нужно в столбце D?
макрос выполнил, но обнаружил, что при умножении на 1000 меняется число, а единицы измерения остаются прежние ("тонны"). Это моё упущение - я не верно изложил суть своей проблемы, хотел облегчить Вам задачу, думал сам смогу отредактировать. Но не смог поменять "т" на "кг" в первой справа ячейке от "Электроды" в макросе.
макрос выполнил, но обнаружил, что при умножении на 1000 меняется число, а единицы измерения остаются прежние ("тонны"). Это моё упущение - я не верно изложил суть своей проблемы, хотел облегчить Вам задачу, думал сам смогу отредактировать. Но не смог поменять "т" на "кг" в первой справа ячейке от "Электроды" в макросе.Yar4i4
Sub tt() r1_ = Range("C" & Rows.Count).End(xlUp).Row For i = 20 To r1_ If Range("C" & i) = "т" Then Range("D" & i) = Round(Range("D" & i) * 1000, 0) Range("C" & i) = "кг" ElseIf Range("C" & i) = "кг" Then Range("D" & i) = Round(Range("D" & i), 0) End If Next i End Sub
[/vba]
Выделите столбец - Контрл h - и меняйте.
Или добавьте одну строку в марос [vba]
Код
Sub tt() r1_ = Range("C" & Rows.Count).End(xlUp).Row For i = 20 To r1_ If Range("C" & i) = "т" Then Range("D" & i) = Round(Range("D" & i) * 1000, 0) Range("C" & i) = "кг" ElseIf Range("C" & i) = "кг" Then Range("D" & i) = Round(Range("D" & i), 0) End If Next i End Sub
это приведет к смене всех "т" на "кг", но у меня ряд материала, который нужно считать в "тоннах" Например металлоконструкции мне нужно округлить до тысячных и оставить в тоннах, битумы также идут в тоннах округлённых до тысячных, Сваи стальные в тоннах округлённых до тысячных и другой материал. т.е. Металлоконструкция т 5,555 Сваи т 2,222
А Электроды, Пропан, Эмаль, Уайт-спирит и ряд других материалов идут в килограммах. (должны идти в кг по правилам оформления) т.е. Пропан кг 5 Уайт-спирит кг 2
это приведет к смене всех "т" на "кг", но у меня ряд материала, который нужно считать в "тоннах" Например металлоконструкции мне нужно округлить до тысячных и оставить в тоннах, битумы также идут в тоннах округлённых до тысячных, Сваи стальные в тоннах округлённых до тысячных и другой материал. т.е. Металлоконструкция т 5,555 Сваи т 2,222
А Электроды, Пропан, Эмаль, Уайт-спирит и ряд других материалов идут в килограммах. (должны идти в кг по правилам оформления) т.е. Пропан кг 5 Уайт-спирит кг 2Yar4i4
Сообщение отредактировал Yar4i4 - Пятница, 12.02.2016, 16:52
при умножении на 1000 меняется число, а единицы измерения остаются прежние ("тонны")
поправил =) [vba]
Код
Sub Red() Dim rng As Range For Each rng In Selection If rng = "Электроды" Then If rng.Offset(, 1) = "т" Then rng.Offset(, 1)="кг" rng.Offset(, 2) = Round(rng.Offset(, 2) * 1000) Else If rng.Offset(, 1) = "кг" Then rng.Offset(, 2) = Round(rng.Offset(, 2)) End If End If End If Next rng End Sub
при умножении на 1000 меняется число, а единицы измерения остаются прежние ("тонны")
поправил =) [vba]
Код
Sub Red() Dim rng As Range For Each rng In Selection If rng = "Электроды" Then If rng.Offset(, 1) = "т" Then rng.Offset(, 1)="кг" rng.Offset(, 2) = Round(rng.Offset(, 2) * 1000) Else If rng.Offset(, 1) = "кг" Then rng.Offset(, 2) = Round(rng.Offset(, 2)) End If End If End If Next rng End Sub
С электродами работает, но я не остановился и попробовал продолжить макрос с "Уайт-спирит". И он тоже работает, но поскольку я пришел к этому макросу методом (тыка) удаления строк на которые ругалась система, то не уверен, что всё верно сделал: [vba]
Код
' выделить строку с материалами Columns("B:B").Select
' электроды из тонн в кг Dim rng As Range For Each rng In Selection If rng = "Электроды" Then If rng.Offset(, 1) = "т" Then rng.Offset(, 1) = "кг" rng.Offset(, 2) = Round(rng.Offset(, 2) * 1000) Else If rng.Offset(, 1) = "кг" Then rng.Offset(, 2) = Round(rng.Offset(, 2)) End If End If End If Next rng
' Уайт-спирит из тонн в кг For Each rng In Selection If rng = "Уайт-спирит" Then If rng.Offset(, 1) = "т" Then rng.Offset(, 1) = "кг" rng.Offset(, 2) = Round(rng.Offset(, 2) * 1000) Else If rng.Offset(, 1) = "кг" Then rng.Offset(, 2) = Round(rng.Offset(, 2)) End If End If End If Next rng
[/vba] Проверьте пожалуйста. Буду добавлять цепочку таких материалов. Спасибо.
Столкнулся с проблемой. Макрос не работает, если в ячейке находятся не "Электроды", а "Электроды диаметром 4 мм Э42" или "Электроды диаметром 5 мм Э42А". Я конечно привожу все типичные марки электродов в виду "Электроды" (а потом запускаю Ваш макрос), но есть вероятность человеческого фактора (лишний пробел в наименовании материала).
С электродами работает, но я не остановился и попробовал продолжить макрос с "Уайт-спирит". И он тоже работает, но поскольку я пришел к этому макросу методом (тыка) удаления строк на которые ругалась система, то не уверен, что всё верно сделал: [vba]
Код
' выделить строку с материалами Columns("B:B").Select
' электроды из тонн в кг Dim rng As Range For Each rng In Selection If rng = "Электроды" Then If rng.Offset(, 1) = "т" Then rng.Offset(, 1) = "кг" rng.Offset(, 2) = Round(rng.Offset(, 2) * 1000) Else If rng.Offset(, 1) = "кг" Then rng.Offset(, 2) = Round(rng.Offset(, 2)) End If End If End If Next rng
' Уайт-спирит из тонн в кг For Each rng In Selection If rng = "Уайт-спирит" Then If rng.Offset(, 1) = "т" Then rng.Offset(, 1) = "кг" rng.Offset(, 2) = Round(rng.Offset(, 2) * 1000) Else If rng.Offset(, 1) = "кг" Then rng.Offset(, 2) = Round(rng.Offset(, 2)) End If End If End If Next rng
[/vba] Проверьте пожалуйста. Буду добавлять цепочку таких материалов. Спасибо.
Столкнулся с проблемой. Макрос не работает, если в ячейке находятся не "Электроды", а "Электроды диаметром 4 мм Э42" или "Электроды диаметром 5 мм Э42А". Я конечно привожу все типичные марки электродов в виду "Электроды" (а потом запускаю Ваш макрос), но есть вероятность человеческого фактора (лишний пробел в наименовании материала).Yar4i4
Сообщение отредактировал Manyasha - Понедельник, 15.02.2016, 17:03
Yar4i4, У Вас вроде бы всё правильно (работает же?). Ну а чтобы заменять если в ячейке не находится "Электроды", а строка содержит "Электроды", как составляющие, да и причём, если хотите, чтобы не зависело от регистра букв (заглавные или строчные) то можно так: [vba]
Код
Columns("B:B").Select
' электроды из тонн в кг Dim rng As Range For Each rng In Selection If instr(1, uCase(rng), uCase("Электроды")>0 Then If rng.Offset(, 1) = "т" Then rng.Offset(, 1) = "кг" rng.Offset(, 2) = Round(rng.Offset(, 2) * 1000) Else If rng.Offset(, 1) = "кг" Then rng.Offset(, 2) = Round(rng.Offset(, 2)) End If End If End If Next rng
[/vba] Но сразу Вас предупрежу, в столбце "B:B" могут быть строки, где этого нет необходимости делать, но есть строки содержащие "электроды", может возникнуть ошибка (некорректная обработка)... тут внимательно надо...
Yar4i4, У Вас вроде бы всё правильно (работает же?). Ну а чтобы заменять если в ячейке не находится "Электроды", а строка содержит "Электроды", как составляющие, да и причём, если хотите, чтобы не зависело от регистра букв (заглавные или строчные) то можно так: [vba]
Код
Columns("B:B").Select
' электроды из тонн в кг Dim rng As Range For Each rng In Selection If instr(1, uCase(rng), uCase("Электроды")>0 Then If rng.Offset(, 1) = "т" Then rng.Offset(, 1) = "кг" rng.Offset(, 2) = Round(rng.Offset(, 2) * 1000) Else If rng.Offset(, 1) = "кг" Then rng.Offset(, 2) = Round(rng.Offset(, 2)) End If End If End If Next rng
[/vba] Но сразу Вас предупрежу, в столбце "B:B" могут быть строки, где этого нет необходимости делать, но есть строки содержащие "электроды", может возникнуть ошибка (некорректная обработка)... тут внимательно надо...Roman777
Много чего не знаю!!!!
Сообщение отредактировал Roman777 - Суббота, 13.02.2016, 10:11
Красным подсвечивает строку макроса If instr(1, uCase(rng), uCase("Электроды")>0 Then и при воспроизведении макроса выскакивает "Can't execute code in break mode" Возможно в макросе идёт ссылка на наименование листа.
Я немного не понял как будет работать макрос в случае с "раствор цементный" и "растворитель". Если я пропишу в макросе "раствор", то макрос и на "растворитель" сработает, однако раствор идёт в метрах кубических (м3), а растворитель в тоннах или килограммах. Но мы же учитываем правую ячейку и макрос не перейдёт к условию замены (думается так).
Красным подсвечивает строку макроса If instr(1, uCase(rng), uCase("Электроды")>0 Then и при воспроизведении макроса выскакивает "Can't execute code in break mode" Возможно в макросе идёт ссылка на наименование листа.
Я немного не понял как будет работать макрос в случае с "раствор цементный" и "растворитель". Если я пропишу в макросе "раствор", то макрос и на "растворитель" сработает, однако раствор идёт в метрах кубических (м3), а растворитель в тоннах или килограммах. Но мы же учитываем правую ячейку и макрос не перейдёт к условию замены (думается так).Yar4i4
Сообщение отредактировал Yar4i4 - Понедельник, 15.02.2016, 06:54