Vba excel умножение ячеек в excel

Vashcap

0 / 0 / 0

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

Сообщений: 4

1

Умножение двух стобцов

24.04.2016, 21:36. Показов 5856. Ответов 6

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


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

Добрый день.
Возникла проблема, нужно сделать макрос чтобы умножить 2 столбца с Листа2 (С2:С21 умножить на G2:G21) и показать результат на Листе3 (C2:C21) в Excel. Умножение отдельных ячеек получается делать, а колонок — нет. Я попробовал (код написал ниже), но у меня не получается.

Помогите пожалуйста. Заранее спасибо

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
Sub Кнопка7_Щелчок()
 
Dim A As Integer, B As Integer, C As Integer, X As Integer
 
For A = 2 To 21
 
B = Лист2.Cells(A, 3)
C = Лист2.Cells(A, 7)
X = B * C
 
Лист3.Cells(A, 3) = X
 
End Sub



0



Programming

Эксперт

94731 / 64177 / 26122

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

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

24.04.2016, 21:36

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

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

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

Sub qq()
For i = 0 To 10
Cells(i,…

Умножение двух матриц
TTimer идет перемножение матриц. Так вот из-за этого должно происходить вращение, а оно не…

Умножение двух списков
Всем привет. Нужно посимвольно перемножить 2 списка на DrScheme или Huskell.
Спасибою

6

45 / 45 / 15

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

Сообщений: 128

24.04.2016, 22:01

2

Что Вы хотите получить в результате? Если сумму произведений ячеек, то для этого есть функция СУММПРОИЗВ() и никакой макрос не нужен. Если столбец с построчным перемножением, то Вы его и получаете



1



0 / 0 / 0

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

Сообщений: 4

24.04.2016, 22:14

 [ТС]

3

Мне по заданию нужно сделать именно макрос. Мне нужно получить столбец с построчным перемножением, но мой макрос почему то ответом пишет только один результат в последней ячейке столбца



0



МВТ

45 / 45 / 15

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

Сообщений: 128

24.04.2016, 22:23

4

Лучший ответ Сообщение было отмечено Vashcap как решение

Решение

Да, не обратил внимания на то, что у Вас странно идет обращение к листам. Немного поправил

Visual Basic
1
2
3
4
5
6
7
8
9
10
Sub tt()
    Dim i As Long
    For i = 2 To 21
        With Worksheets("Лист2")
            'проверяем, являются ли числами данные в ячейках, если да, перемножаем
            If IsNumeric(.Cells(i, "C")) And IsNumeric(.Cells(i, "G")) Then _
            Worksheets("Лист3").Cells(i, "C") = .Cells(i, "C") * .Cells(i, "G")
        End With
    Next
End Sub



1



0 / 0 / 0

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

Сообщений: 4

24.04.2016, 22:29

 [ТС]

5

Огромное спасибо за помощь. Все работает



0



1 / 1 / 0

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

Сообщений: 80

16.02.2019, 22:07

6

Здравствуйте!
Ваш код супер!!
А как сделать так чтоб столбцы перемножались до тех пор пока есть значения хоть в одном



0



fever brain

oh my god

1454 / 793 / 161

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

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

Записей в блоге: 8

16.02.2019, 23:45

7

Название: 0.jpg
Просмотров: 69

Размер: 9.0 Кб

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Sub mcr()
    Dim d#, v, i&
    On Error Resume Next
    d = 1
    With Application.InputBox("Укажите колонки, столбцы или что у вас там....", Type:=8)
        For Each v In .Cells
            If IsEmpty(v) Then
                i = i + 1
                If i > 10 Then Exit Sub
            ElseIf IsNumeric(v) Then
                d = d * v
            End If
        Next
    End With
 
    MsgBox "Сумма = " & d
End Sub



0



IT_Exp

Эксперт

87844 / 49110 / 22898

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

Сообщений: 92,604

16.02.2019, 23:45

7

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

Начал познавать 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

Арифметические (математические) операторы, использующиеся в 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

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

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

 

Ответить

keong has already shown you one method but unfortunately that method requires one to do the calculation in another cell/range. If that is what you want then go with keong’s answer but if you want to do the calculation in the same range then continue reading below.

Here is another method which doesn’t use formulas or VBA.

Let’s say the range is A1:A10 and you want to multiply the entire range by 5

  1. Simply type 5 in any blank cell. You can delete that later.
  2. Copy that cell
  3. Select Range A1:A10
  4. Right click on it
  5. Click on Paste Special | Values - Multiply as shown below and you are done.

Before

enter image description here

After

enter image description here

Followup from comments

In case you do not want to use a temp cell to write 5 then you can directly set 5 in the clipboard and use it like this.

Option Explicit

Sub Sample()
    Dim ws As Worksheet
    Dim MyData As New DataObject
    Dim rng As Range

    Set ws = Sheet1
    Set rng = ws.Range("A1:A5")

    '~~> Put the number 5 in clipboard
    MyData.SetText 5
    MyData.PutInClipboard

    '~~> Get the data from clipboard
    MyData.GetFromClipboard

    rng.Formula = Application.Evaluate("=" & _
                                    rng.Address & _
                                    "*" & _
                                    Val(MyData.GetText))
End Sub

Like I mentioned, you don’t need VBA for this but if you still want to use VBA then you can use this instead of copying the data to the clipboard.

rng.Formula = Application.Evaluate("=" & rng.Address & "*" & MYNUMBER)

Where MYNUMBER is the variable which has the number that you want to multiply the range with.

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