Vba excel умножить ячейки

Artem7777

0 / 0 / 0

Регистрация: 21.04.2013

Сообщений: 63

1

21.04.2013, 23:43. Показов 6501. Ответов 4

Метки нет (Все метки)


Студворк — интернет-сервис помощи студентам

Начал познавать vba excel, и столкнулся с такой проблемой:

Visual Basic
1
2
3
4
5
Sub qq()
For i = 0 To 10
Cells(i, 1) = Cells(i, 1) * 2
Next i
End Sub

Пожалуйста помогите разобраться в чем ошибка)))))



0



Programming

Эксперт

94731 / 64177 / 26122

Регистрация: 12.04.2006

Сообщений: 116,782

21.04.2013, 23:43

Ответы с готовыми решениями:

Умножение двух ячеек в VBA
Написал код, но код увы выдает ошибку. Может быть числа нужно как-нибудь обьявить? Скриншот…

Умножение двух стобцов
Добрый день.
Возникла проблема, нужно сделать макрос чтобы умножить 2 столбца с Листа2 (С2:С21…

Закрашивание ячеек Excel
Добрый день, подскажите пожалуйста. Вот наброски кода.
dim gel as Range
Set CEO =…

Перемешивание ячеек в excel
Добрый день!
У меня есть таблица (примерно 1000 строк).
Необходимо перемешать ячейки случайным…

4

4377 / 661 / 36

Регистрация: 17.01.2010

Сообщений: 2,134

22.04.2013, 00:07

2

Не знаю, но сначало попробуйте после sub …() обьявить



0



andriyChieri

7 / 2 / 0

Регистрация: 13.04.2013

Сообщений: 60

22.04.2013, 00:25

3

попробуй значение ячейки умножать через переменную

Добавлено через 1 минуту

Visual Basic
1
2
3
4
5
6
7
8
9
Sub qq()
For i = 0 To 10
переменная=Cells(i, 1)
переменная=переменная*2
 
 
Cells(i, 1)=переменная
Next i
End Sub



0



15136 / 6410 / 1730

Регистрация: 24.09.2011

Сообщений: 9,999

22.04.2013, 00:29

4

Ячейки нумеруются с 1 , а не с 0.



1



4377 / 661 / 36

Регистрация: 17.01.2010

Сообщений: 2,134

22.04.2013, 00:31

5

Переменную тоже нужно обьявить. И желательно соответствующего типа.

Добавлено через 53 секунды
Ослеп. Тут такие дамы интересные…



0



Арифметические (математические) операторы, использующиеся в VBA Excel. Их предназначение, особенности вычислений, приоритет в выражениях.

Обзор арифметических операторов

Операторы Описание
Оператор «+» Сложение двух чисел или объединение двух строк (для объединения строк предпочтительнее использовать оператор «&»)
Оператор «-» Вычитание (определение разности двух чисел) или отрицание (отражение отрицательного значения числового выражения: -15, -a)
Оператор «*» Умножение двух чисел
Оператор «/» Деление двух чисел (деление на 0 приводит к ошибке)
Оператор «^» Возведение числа в степень
Оператор «» Целочисленное деление
Оператор «Mod» Возвращает остаток от деления двух чисел

Особенности операторов «» и «Mod»

Перед вычислением целочисленного результата или остатка от деления двух чисел делимое и делитель округляются. Причем, используется бухгалтерское округление:

  • -3.5 => -4
  • -2.5 => -2
  • -1.5 => -2
  • -0.5 => 0
  • 0.5 => 0
  • 1.5 => 2
  • 2.5 => 2
  • 3.5 => 4

Следующие строки вызовут ошибку «Division by zero» («Деление на ноль»):

a = 3 Mod 0.5

a = 3 (2 2.5)

Чтобы избежать ошибок, когда требуется общепринятое математическое округление, округляйте делитель и делимое с помощью оператора WorksheetFunction.Round.

Приоритет арифметических операторов

Приоритет определяет очередность выполнения математических операторов в одном выражении. Очередность выполнения арифметических операторов в VBA Excel следующая:

  1. «^» – возведение в степень;
  2. «» – отрицание;
  3. «*» и «/» – умножение и деление;1
  4. «» – целочисленное деление;
  5. «Mod» – остаток от деления двух чисел;
  6. «+» и «» – сложение и вычитание.2

1 Если умножение и деление выполняются в одном выражении, то каждая такая операция выполняется слева направо в порядке их следования.
2 Если сложение и вычитание выполняются в одном выражении, то каждая такая операция выполняется слева направо в порядке их следования.

Для переопределения приоритета выполнения математических операторов в VBA Excel используются круглые скобки. Сначала выполняются арифметические операторы внутри скобок, затем — операторы вне скобок. Внутри скобок приоритет операторов сохраняется.

a = 3 ^ 2 + 1 ‘a = 10

a = 3 ^ (2 + 1) ‘a = 27

a = 3 ^ (2 + 1 * 2) ‘a = 1

Формулировка задачи:

Начал познавать vba excel, и столкнулся с такой проблемой:

Пожалуйста помогите разобраться в чем ошибка)))))

Код к задаче: «Умножение двух ячеек в excel»

textual

Sub qq()
For i = 0 To 10
переменная=Cells(i, 1)
переменная=переменная*2
 
 
Cells(i, 1)=переменная
Next i
End Sub

Полезно ли:

5   голосов , оценка 4.600 из 5

Умножение диапазона ячеек на число

Xpert

Дата: Четверг, 15.02.2018, 14:33 |
Сообщение № 1

Группа: Проверенные

Ранг: Форумчанин

Сообщений: 103


Репутация:

0

±

Замечаний:
0% ±


Excel 2013

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

 

Ответить

and_evg

Дата: Четверг, 15.02.2018, 14:38 |
Сообщение № 2

Группа: Проверенные

Ранг: Обитатель

Сообщений: 416


Репутация:

72

±

Замечаний:
0% ±


Excel 2007

Xpert, Добрый день.
В начале работы макроса:
[vba]

Код

Application.ScreenUpdating = False

[/vba]
в конец:
[vba]

Код

Application.ScreenUpdating = True

[/vba]

А ещё лучше избавится от «Селектов»

Сообщение отредактировал and_evgЧетверг, 15.02.2018, 14:39

 

Ответить

китин

Дата: Четверг, 15.02.2018, 14:39 |
Сообщение № 3

Группа: Модераторы

Ранг: Экселист

Сообщений: 6973


Репутация:

1063

±

Замечаний:
0% ±


Excel 2007;2010;2016

вначале кода
[vba]

Код

Application.ScreenUpdating = False
    Application.CutCopyMode = False
    Application.DisplayAlerts = False

[/vba]

в конце кода
[vba]

Код

Application.ScreenUpdating = True
    Application.CutCopyMode = True
    Application.DisplayAlerts = True

[/vba]


Не судите очень строго:я пытаюсь научиться
ЯД 41001877306852

 

Ответить

Xpert

Дата: Четверг, 15.02.2018, 14:42 |
Сообщение № 4

Группа: Проверенные

Ранг: Форумчанин

Сообщений: 103


Репутация:

0

±

Замечаний:
0% ±


Excel 2013

and_evg, китин, спасибо!
Глаз радуется и отдыхает yes

Сообщение отредактировал XpertЧетверг, 15.02.2018, 16:12

 

Ответить

Xpert

Дата: Четверг, 15.02.2018, 15:13 |
Сообщение № 5

Группа: Проверенные

Ранг: Форумчанин

Сообщений: 103


Репутация:

0

±

Замечаний:
0% ±


Excel 2013

А ещё лучше избавится от «Селектов»

Я только в начале пути изучения VBA, таких тонкостей не знаю.

 

Ответить

китин

Дата: Четверг, 15.02.2018, 15:31 |
Сообщение № 6

Группа: Модераторы

Ранг: Экселист

Сообщений: 6973


Репутация:

1063

±

Замечаний:
0% ±


Excel 2007;2010;2016


Не судите очень строго:я пытаюсь научиться
ЯД 41001877306852

Сообщение отредактировал китинЧетверг, 15.02.2018, 15:32

 

Ответить

Xpert

Дата: Понедельник, 12.03.2018, 14:58 |
Сообщение № 7

Группа: Проверенные

Ранг: Форумчанин

Сообщений: 103


Репутация:

0

±

Замечаний:
0% ±


Excel 2013

Здравствуйте, дамы и господа.
Немного подкорректировал и оптимизировал свой макрос, но столкнулся с проблемой: при указании фиксированных диапазонов ячеек, всё работает нормально(см.»Пример»), а если вводить именованный диапазон, выскакивает ошибка(см. «Пример(именован)»).
Дело в том, что точно неизвестно, какой диапазон будет применим в тех или иных случаях, поэтому мне нужно, чтобы макрос ориентировался именно на динамический(изменяющийся) а не на фиксированный диапазон.
Подскажите, можно ли это как-то реализовать?

 

Ответить

Manyasha

Дата: Вторник, 13.03.2018, 11:56 |
Сообщение № 8

Группа: Модераторы

Ранг: Старожил

Сообщений: 2198


Репутация:

898

±

Замечаний:
0% ±


Excel 2010, 2016

Xpert, здравствуйте.
Диапазон у Вас строится на листе1, а в макросе вы его ищете на листе2.
Еще нужно проверить, содержит ли диапазон ячейки, например так:
[vba]

Код

On Error Resume Next
Set x = Sheets(«Лист1»).Range(«Диапазон»)
Debug.Print IsEmpty(x)

[/vba]


ЯД: 410013299366744 WM: R193491431804

 

Ответить

InExSu

Дата: Вторник, 13.03.2018, 23:07 |
Сообщение № 9

Группа: Друзья

Ранг: Ветеран

Сообщений: 646


Репутация:

96

±

Замечаний:
0% ±


Excel 2010

Привет!
[vba]

Код

Sub Макрос()
‘…
    arr1() = Sheets(«Лист2»).Range(«Диапазон»).Value

[/vba]
а на Лист2 нет Range(«Диапазон»)

а если Вы его там создадите, то в коде листа выдаст ошибку
Private Sub Worksheet_Change(ByVal Target As Range)
[vba]

Код

‘…
  If Not Intersect(Target, Range(«Диапазон»)) Is Nothing Then Call copie

[/vba]


Разработчик Битрикс24 php, Google Apps Script, VBA Excel

 

Ответить

Xpert

Дата: Среда, 14.03.2018, 11:53 |
Сообщение № 10

Группа: Проверенные

Ранг: Форумчанин

Сообщений: 103


Репутация:

0

±

Замечаний:
0% ±


Excel 2013

Manyasha, InExSu, спасибо.
Сделал как вы сказали, ошибка исчезла…по отдельности каждый макрос(Макрос и Copie) работает, а вот с модуля листа не запускаются.
%)
В модуле листа код такой:

[vba]

Код

Private Sub Worksheet_Change(ByVal Target As Range)
Application.EnableEvents = False
    Dim rng As Range: Set rng = [C1]
    On Error Resume Next
Set x = Sheets(«Лист1»).Range(«Диапазон»)
Debug.Print IsEmpty(x)
  If Not Intersect(rng, Target) Is Nothing Then Макрос
  If Not Intersect(x, Target) Is Nothing Then Call copie
    Application.EnableEvents = True
End Sub

[/vba]

Макрос:

[vba]

Код

Sub Макрос()
Dim arr1(), arrRes()
Dim i As Long
    arr1() = Sheets(«Лист1»).Range(«Данные»).Value
    ReDim arrRes(1 To UBound(arr1, 1), 1 To 1)
     For i = 1 To UBound(arr1, 1) Step 1
        arrRes(i, 1) = arr1(i, 1) * (1 + Range(«C1»).Value)
    Next i
    Sheets(«Лист1»).Range(«A2»).Resize(UBound(arrRes, 1)).Value = arrRes()
End Sub

[/vba]

и макрос Copie

[vba]

Код

Sub copie()
    Application.ScreenUpdating = False
    Application.CutCopyMode = False
    Application.DisplayAlerts = False
    On Error Resume Next
    Set x = Sheets(«Лист1»).Range(«Данные»)
    Debug.Print IsEmpty(x)
    x.copy
    Sheets(«Лист2»).Range(«A2»).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
       Sheets(«Лист1»).Select
    Application.ScreenUpdating = False
    Application.CutCopyMode = False
    Application.DisplayAlerts = False
End Sub

[/vba]

Голову сломал, но не получается.

Сообщение отредактировал XpertСреда, 14.03.2018, 11:54

 

Ответить

InExSu

Дата: Среда, 14.03.2018, 13:03 |
Сообщение № 11

Группа: Друзья

Ранг: Ветеран

Сообщений: 646


Репутация:

96

±

Замечаний:
0% ±


Excel 2010


Пожалуйста, приложите новый файл


Разработчик Битрикс24 php, Google Apps Script, VBA Excel

 

Ответить

Mikael

Дата: Среда, 14.03.2018, 14:06 |
Сообщение № 12

Группа: Пользователи

Ранг: Участник

Сообщений: 80


Репутация:

31

±

Замечаний:
0% ±


Excel 2010

Всем доброго дня!
Xpert, а Вам обязательно использовать второй лист и именованный диапазон?
Попробуйте такой вариант:
[vba]

Код

Private Sub Worksheet_Change(ByVal Target As Range)

        If Not Intersect(Target, [c1]) Is Nothing Then
        Dim arr, li&, lmp#, rng As Range
        Set rng = Intersect([a1].EntireColumn, ActiveSheet.UsedRange)
        With Application
            .Calculation = xlCalculationManual
            .ScreenUpdating = False: .EnableEvents = False

                        arr = rng.Value
            .Undo: lmp = [c1]: .Undo

                        For li = 1 To UBound(arr)
                If Not IsEmpty(arr(li, 1)) Then arr(li, 1) = arr(li, 1) / (1 + lmp) * (1 + [c1])
            Next li

                        rng.Value = arr

                        .Calculation = xlCalculationAutomatic
            .ScreenUpdating = True: .EnableEvents = True
        End With
    End If

    End Sub

[/vba]

 

Ответить

Xpert

Дата: Среда, 14.03.2018, 20:32 |
Сообщение № 13

Группа: Проверенные

Ранг: Форумчанин

Сообщений: 103


Репутация:

0

±

Замечаний:
0% ±


Excel 2013

Mikael, нет, необязательно.
Ваш вариант почти то, что надо.
Спасибо!

Сообщение отредактировал XpertСреда, 14.03.2018, 20:53

 

Ответить

Mikael

Дата: Среда, 14.03.2018, 22:15 |
Сообщение № 14

Группа: Пользователи

Ранг: Участник

Сообщений: 80


Репутация:

31

±

Замечаний:
0% ±


Excel 2010


Мне остается только догадываться, что значит «почти», но судя по Вашему коду, мне пришла в голову такая идея.
Upg:
[vba]

Код

Private Sub Worksheet_Change(ByVal Target As Range)

        With Application
        .Calculation = xlCalculationManual
        .ScreenUpdating = False: .EnableEvents = False

                Dim arr, li&, lmp#, rng As Range
        Set rng = Intersect([a1].EntireColumn, ActiveSheet.UsedRange)

                If Not Intersect(Target, [c1]) Is Nothing And Target.Count = 1 Then
            .Undo: lmp = [c1]: .Undo
            arr = rng.Value
            For li = 1 To UBound(arr)
                If Not IsEmpty(arr(li, 1)) And IsNumeric(arr(li, 1)) Then arr(li, 1) = arr(li, 1) / (1 + lmp) * (1 + [c1])
            Next li
            rng.Value = arr
        End If

                If Not Intersect(Target, rng) Is Nothing Then
            If Not IsEmpty(Target) Then Target.Value = Evaluate(Target.Address & «*» & Replace(CStr(1 + [c1]), «,», «.»))
        End If

                .Calculation = xlCalculationAutomatic
        .ScreenUpdating = True: .EnableEvents = True
    End With

    End Sub

[/vba]

Голову сломал, но не получается

Приложите свой файл

 

Ответить

Xpert

Дата: Четверг, 15.03.2018, 06:43 |
Сообщение № 15

Группа: Проверенные

Ранг: Форумчанин

Сообщений: 103


Репутация:

0

±

Замечаний:
0% ±


Excel 2013

Господа!
Прилагаю свой файл.
Ещё загвоздка в том, что при выставлении 0% в ячейке C1, значения в столбце А на листе 1 не возвращаются к первоначальным.

К сообщению приложен файл:

10.xlsm
(22.8 Kb)

 

Ответить

Xpert

Дата: Четверг, 15.03.2018, 06:47 |
Сообщение № 16

Группа: Проверенные

Ранг: Форумчанин

Сообщений: 103


Репутация:

0

±

Замечаний:
0% ±


Excel 2013

Мне остается только догадываться, что значит «почти», но судя по Вашему коду, мне пришла в голову такая идея.

Mikael, прошу прощения, сразу не пояснил: при удалении значений из диапазона ячеек в столбце А, вылазит ошибка, которой хотелось бы избежать.

 

Ответить

Mikael

Дата: Четверг, 15.03.2018, 11:05 |
Сообщение № 17

Группа: Пользователи

Ранг: Участник

Сообщений: 80


Репутация:

31

±

Замечаний:
0% ±


Excel 2010

Утречка всем!!! :)

не возвращаются к первоначальным.

Потому что Макрос() берет первоначальные данные на листе1, а у Вас эти данные на листе2
Поправьте на лист2 и line2:
[vba]

Код

    ‘1. Копирование данных из экселя в массивы.
    arr1() = Sheets(«Лист2»).Range(«Line2»).Value

[/vba]
Попробуйте. Если ошибка осталась, опишите подробнее Ваши действия, сделайте скрин ошибки.

 

Ответить

Xpert

Дата: Четверг, 15.03.2018, 20:28 |
Сообщение № 18

Группа: Проверенные

Ранг: Форумчанин

Сообщений: 103


Репутация:

0

±

Замечаний:
0% ±


Excel 2013

Mikael, гениально!
Всё работает как часы.
Огромное спасибо за участие!

 

Ответить

Xpert

Дата: Понедельник, 01.04.2019, 11:34 |
Сообщение № 19

Группа: Проверенные

Ранг: Форумчанин

Сообщений: 103


Репутация:

0

±

Замечаний:
0% ±


Excel 2013

Приветствую всех участников!
Подправил данный макрос для использования в рамках «умной таблицы». Вроде всё работает, но есть одно НО.
При вставке строк получается такая картина

формулы в Столбце 5 не копируются в новые строки. Появляются нули за пределами границ таблицы…

При удалении — такая:

Опять нули.

Помогите это исправить.

ПРимер прилагаю.

К сообщению приложен файл:

9125860.xlsm
(63.8 Kb)

Сообщение отредактировал XpertПонедельник, 01.04.2019, 11:35

 

Ответить

_Boroda_

Дата: Понедельник, 01.04.2019, 11:45 |
Сообщение № 20

Группа: Модераторы

Ранг: Местный житель

Сообщений: 16618


Репутация:

6465

±

Замечаний:
0% ±


2003; 2007; 2010; 2013 RUS

— Прочитайте Правила форума
— Создайте новую тему согласно п.5q Правил форума. Причем здесь умножение ячеек на число?
картинки не на Радикал нужно класть, а сюда, также, как и Excel файлы


Скажи мне, кудесник, любимец ба’гов…
Платная помощь:
Boroda_Excel@mail.ru
Яндекс-деньги: 41001632713405 | Webmoney: R289877159277; Z102172301748; E177867141995

 

Ответить

Создание простого макроса для перемножения столбца на заданный коэффициент.

Ранее уже публиковалась статья о том, как перемножить столбец на число:

Умножение столбцов таблицы Excel на выбранное число.

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

Ниже описано, как при помощи макроса можно перемножить выделенные ячейки на фиксированное число  в один клик.

Рассмотрим создание макроса.

Макрос будет состоять из 3 частей:

    • Создание формы для ввода данных (коэффициента);
    • Вызов окна для ввода числа;
    • Макрос перемножения при нажатии кнопки в окне.

    Первая часть: Вызов окна ввода коэффициента.

    Для начала следует создать окно, которое будет появляется при запуске макроса.

    Создается окно в панели разработчик:

    Второй этап:  вызов формы для ввода коэффициента.

    Sub Перемножение() ‘название макроса

    Okno.Show  ‘ вызов формы

    End Sub

    Третий этап: макрос для кнопки «Рассчитать».

    На кнопку «Рассчитать» записывается макрос:

    Private Sub CommandButton1_Click()

    If IsNumeric(TextBox1.Value) = False Then

    MsgBox «Неверный коэффициент. Введите число»

    Else

    For Each cell In Selection

    cell.Value = cell.Value * TextBox1.Value

    Next

    End If

    Okno.Hide

    End Sub

    ,где  If IsNumeric(TextBox1.Value) = False – проверяет чтобы введенный коэффициент был числом;

    MsgBox «Неверный коэффициент. Введите число» – выводит сообщение об ошибке ввода,

    For Each cell In Selection – цикл перебирает все ячейки из выделенного диапазона;

    cell.Value = cell.Value * TextBox1.Value – перемножает каждую ячейку на коэффициент (введенное число);

    Okno.Hide – закрывает форму для заполнения.

    Принцип работы макроса: После запуска макроса, появляется форма для внесения нужного коэффициента, на который перемножается диапазон.  В форму вносится число для перемножения и нажимается кнопка «Рассчитать». Макрос «привязанный» к кнопке, меняет значения в ячейка на перемноженные данные.

    Приведенный макрос перемножает значения как в вертикальном направлении (столбцы), так и в горизонтальном (строки).

    Если у Вас нет времени на написание макроса или  что-то не получается Вы можете скачать его вместе с нашей надстройкой по ссылке: http://ruexcel.ru/product/pack1/

    Видео с принципом работы макроса:

    Понравилась статья? Поделить с друзьями:
  • Vba excel умножение ячеек в excel
  • Vba excel удалить непечатаемые символы
  • Vba excel фильтр несколько условий
  • Vba excel удалить лист по имени
  • Vba excel фильтр на дату