Только значение миф excel

I’m trying to copy values from a table to a Range, in Excel using vba Macros, but I dont want the table format, only its values. How can I achieve this?

Here is part of the code:

    'Source range
    Set r = Sheets("Sheet1").Range("Table1")

    'Destination range
    Set dest = Range(.Cells(linhaAtual, 1), .Cells(linhaAtual + r.Rows.Count - 1, 5))

    r.Copy Destination:= dest

asked Jun 18, 2014 at 20:59

pablo.vix's user avatar

You can skip the copy command altogether by assigning the values of the source range to your destination range:

'Source range
Set r = Sheets("Sheet1").Range("Table1")
'Destination range
Set dest = Range(.Cells(linhaAtual, 1), .Cells(linhaAtual + r.Rows.Count - 1, 5))

dest.Value = r.Value

answered Jun 19, 2014 at 12:47

MP24's user avatar

MP24MP24

3,07721 silver badges23 bronze badges

1

I believe you are looking for the functionality of pasting values. You can record it, or use what I have done below. (from recording so selecting is in there, which will make it run slower, but you aren’t looping so it is only constant time being added).

Selection.Copy
        'Select your destination like range("destination").select
        Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
            :=False, Transpose:=False

answered Jun 18, 2014 at 21:11

Kory's user avatar

KoryKory

3081 silver badge7 bronze badges

1

I assume you want to copy from «Sheet1» to «Sheet1» — of course you can make this a parameter and loop through all your sheets

Dim rSource as range 'Source Range
Dim rDest as range   'Target Range - It should be the same dimension
Dim wbSource as workbook 'Source Workbook
Dim wbTarget as workbook 'Target Workbook
Dim myRange as string

myRange = "A:G" ' It is an example, you can make it dynamic

'add new workbook
    Workbooks.Add
    Set wbTarget = ActiveWorkbook

'Set the Source Range
    Set rSource = wbSource.Sheets("Sheet1").Range(myRange)

'Destination Range
    Set rDest = wbTarget.Sheets("Sheet1").Range(myRange)

'Copy values only
    rSource.Copy
    rDest.PasteSpecial xlPasteValues

answered Oct 8, 2018 at 17:20

pbou's user avatar

pboupbou

2782 silver badges13 bronze badges

You need to use the pastespecial command as shown below.

'Source range
Set r = Sheets("Sheet1").Range("Table1")

'Destination range
Set dest = Range(.Cells(linhaAtual, 1), .Cells(linhaAtual + r.Rows.Count - 1, 5))

r.Copy 
dest.pastespecial paste:=xlPasteValues

answered Jun 18, 2014 at 21:15

gtwebb's user avatar

gtwebbgtwebb

2,9713 gold badges13 silver badges22 bronze badges

r.Copy
dest.pastespecial xlPastevalues

answered Jun 18, 2014 at 21:19

user2649602's user avatar

1

I achieve a solution that works.

There follows the code:

    Set r = Sheets("Criteria").Range("CriteriaTable")

    Set dest = Range(.Cells(linhaAtual, 1), .Cells(linhaAtual + r.Rows.Count - 1, 5))
    Sheets("Criteria").Activate
    r.Select
    Selection.Copy
    Sheets("Load").Activate
    dest.Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False

answered Jun 20, 2014 at 15:28

pablo.vix's user avatar

pablo.vixpablo.vix

2,0432 gold badges15 silver badges12 bronze badges

Use the Range.Value method. Its like setting a variable a = 1. Where you think of it as copying 1 to a. So…

Range2.value = Range1.value

or

Worksheets("historical").Range("A1:F15").Value =  Worksheets("actuals").Range("A1:F15").Value

Here I’m copying some data in worksheet actual to some historical worksheet. Or if you prefer setting the value of one range to another range.

Saurabh Bhandari's user avatar

answered Jan 30, 2018 at 4:08

RHH1095's user avatar

RHH1095RHH1095

791 silver badge4 bronze badges

You can skip the copy command altogether as MP24 said .. his suggestion worked for me after modifyibg the last line from «value» to «formula» as follows

Set r = Sheets(«Sheet1»).Range(«Table1»)
Set dest = Range(.Cells(linhaAtual, 1), .Cells(linhaAtual +
r.Rows.Count — 1, 5))

dest.formula = r.formula

answered Aug 1, 2022 at 6:42

Jawali M's user avatar

Pekin

1

Копировать только значения

11.02.2013, 12:00. Показов 32819. Ответов 4

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


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

Добрый день.

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

PureBasic
1
Sheets("Sheets"1).Range(sCopyAddress).Copy wsDataSheet.Cells(lLastRowMyBook, 1).Offset(, lCol)

Что надо изменить в этой строке, чтобы вставлялись только значения?

Programming

Эксперт

94731 / 64177 / 26122

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

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

11.02.2013, 12:00

4

Скрипт

5468 / 1148 / 50

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

Сообщений: 3,514

11.02.2013, 12:14

2

Вариант № 1:

Visual Basic
1
2
3
4
5
6
Sub Procedure_1()
 
    Range("A1").Copy
    Range("B1").PasteSpecial Paste:=xlPasteValues
 
End Sub

Вариант № 2:

Visual Basic
1
2
3
4
5
Sub Procedure_2()
 
    Range("B1").Value = Range("A1").Value
 
End Sub

Примечание

С большими диапазонами ячеек быстрее работает PasteSpecial, чем второй вариант.



1



Pekin

11.02.2013, 12:26

3

@Скрипт

Спасибо за предлагаемые решения.

Моя проблема в том, что мне необходимо минимально изменить приведенный код, поскольку весь код громоздкий и используется множество команд (в приведенном коде, например, используется Offset) и вероятность проблем с новым кодом высока

Хотел бы увидеть предложение к конкретному коду (именно по нему не могу найти как выполнить данную задачу)

Watcher_1

356 / 162 / 27

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

Сообщений: 350

11.02.2013, 12:40

4

Visual Basic
1
2
Sheets("Sheets1").Range(sCopyAddress).Copy
wsDataSheet.Cells(lLastRowMyBook, 1).Offset(, lCol).PasteSpecial Paste:=xlPasteValues



1



2 / 2 / 0

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

Сообщений: 46

16.10.2019, 09:20

5

не работает…

пишет ошибку expected end of statement



0



В приложении Excel все данные как правило находятся в ячейках на листах, с которыми макросы работают как с базой данных. Поэтому, начинающему программисту VBA важно понимать как читать значения из ячейки Excel в переменные или массивы и, наоборот, записывать какие-либо значения на лист в ячейки.

Обращение к конкретной ячейке

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

Полный путь к ячейке A1 в Книге1 на Листе1 можно записать двумя вариантами:

  • С помощью Range
  • С помощью Cells

Пример 1: Обратиться к ячейке A3 находящейся в Книге1 на Листе1

Workbooks("Книга1.xls").Sheets("Лист1").Range("A3") ' Обратиться к ячейке A3
Workbooks("Книга1.xls").Sheets("Лист1").Cells(3, 1) ' Обратиться к ячейке в 3-й строке и 1-й колонке (A3)

Однако, как правило, полный путь редко используется, т.к. макрос работает с Книгой, в которой он записан и часто на активном листе. Поэтому путь к ячейке можно сократить и написать просто:

Пример 2: Обратиться к ячейке A1 в текущей книге на активном листе

Range("A1")
Cells(1, 1)

Если всё же путь к книге или листу необходим, но не хочется его писать при каждом обращении к ячейкам, можно использовать конструкцию With End With. При этом, обращаясь к ячейкам, необходимо использовать в начале «.» (точку).

Пример 3: Обратиться к ячейке A1 и B1 в Книге1 на Листе2.

With Workbooks("Книга1").Sheets("Лист2")
  ' Вывести значение ячейки A1, которая находится на Листе2
  MsgBox .Range("A1")
  ' Вывести значение ячейки B1, которая находится на Листе2
  MsgBox .Range("B1")
End With

Так же, можно обратиться и к активной (выбранной в данный момент времени) ячейке.

Пример 4: Обратиться к активной ячейке на Листе3 текущей книги.

Application.ActiveCell ' полная запись
ActiveCell ' краткая запись

Чтение значения из ячейки

Есть 3 способа получения значения ячейки, каждый из которых имеет свои особенности:

  • Value2 — базовое значение ячейки, т.е. как оно хранится в самом Excel-е. В связи с чем, например, дата будет прочтена как число от 1 до 2958466, а время будет прочитано как дробное число. Value2 — самый быстрый способ чтения значения, т.к. не происходит никаких преобразований.
  • Value — значение ячейки, приведенное к типу ячейки. Если ячейка хранит дату, будет приведено к типу Date. Если ячейка отформатирована как валюта, будет преобразована к типу Currency (в связи с чем, знаки с 5-го и далее будут усечены).
  • Text — визуальное отображение значения ячейки. Например, если ячейка, содержит дату в виде «число месяц прописью год», то Text (в отличие от Value и Value2) именно в таком виде и вернет значение. Использовать Text нужно осторожно, т.к., если, например, значение не входит в ячейку и отображается в виде «#####» то Text вернет вам не само значение, а эти самые «решетки».

По-умолчанию, если при обращении к ячейке не указывать способ чтения значения, то используется способ Value.

Пример 5: В ячейке A1 активного листа находится дата 01.03.2018. Для ячейки выбран формат «14 марта 2001 г.». Необходимо прочитать значение ячейки всеми перечисленными выше способами и отобразить в диалоговом окне.

MsgBox Cells(1, 1)        ' выведет 01.03.2018
MsgBox Cells(1, 1).Value  ' выведет 01.03.2018
MsgBox Cells(1, 1).Value2 ' выведет 43160
MsgBox Cells(1, 1).Text   ' выведет 01 марта 2018 г.

Dim d As Date
d = Cells(1, 1).Value2    ' числовое представление даты преобразуется в тип Date
MsgBox d                  ' выведет 01.03.2018

Пример 6: В ячейке С1 активного листа находится значение 123,456789. Для ячейки выбран формат «Денежный» с 3 десятичными знаками. Необходимо прочитать значение ячейки всеми перечисленными выше способами и отобразить в диалоговом окне.

MsgBox Range("C1")        ' выведет 123,4568
MsgBox Range("C1").Value  ' выведет 123,4568
MsgBox Range("C1").Value2 ' выведет 123,456789
MsgBox Range("C1").Text   ' выведет 123,457р.

Dim c As Currency
c = Range("C1").Value2    ' значение преобразуется в тип Currency
MsgBox c                  ' выведет 123,4568

Dim d As Double
d = Range("C1").Value2    ' значение преобразуется в тип Double
MsgBox d                  ' выведет 123,456789

При присвоении значения переменной или элементу массива, необходимо учитывать тип переменной. Например, если оператором Dim задан тип Integer, а в ячейке находится текст, при выполнении произойдет ошибка «Type mismatch». Как определить тип значения в ячейке, рассказано в следующей статье.

Пример 7: В ячейке B1 активного листа находится текст. Прочитать значение ячейки в переменную.

Dim s As String
Dim i As Integer
s = Range("B1").Value2 ' успех
i = Range("B1").Value2 ' ошибка

Таким образом, разница между Text, Value и Value2 в способе получения значения. Очевидно, что Value2 наиболее предпочтителен, но при преобразовании даты в текст (например, чтобы показать значение пользователю), нужно использовать функцию Format.

Запись значения в ячейку

Осуществить запись значения в ячейку можно 2 способами: с помощью Value и Value2. Использование Text для записи значения не возможно, т.к. это свойство только для чтения.

Пример 8: Записать в ячейку A1 активного листа значение 123,45

Range("A1") = 123.45
Range("A1").Value = 123.45
Range("A1").Value2 = 123.45

Все три строки запишут в A1 одно и то же значение.

Пример 9: Записать в ячейку A2 активного листа дату 1 марта 2018 года

Cells(2, 1) = #3/1/2018#
Cells(2, 1).Value = #3/1/2018#
Cells(2, 1).Value2 = #3/1/2018#

В данном примере тоже запишется одно и то же значение в ячейку A2 активного листа.

Визуальное отображение значения на экране будет зависеть от того, какой формат ячейки выбран на листе.

Специальная вставка (метод PasteSpecial объекта Range) применяется в VBA Excel для вставки ячеек из буфера обмена с учетом заданных параметров.

Range.PasteSpecial (специальная вставка) – это метод, который вставляет диапазон ячеек, скопированный в буфер обмена, из буфера обмена в указанное место на рабочем листе с учетом заданных параметров специальной вставки.

Синтаксис

Range.PasteSpecial (Paste, Operation, SkipBlanks, Transpose)

Специальная вставка работает только с данными ячеек, скопированными в буфер обмена методом Range.Copy. При попытке применить метод Range.PasteSpecial к ячейкам, вырезанным в буфер обмена методом Range.Cut, возникает ошибка.

Параметры специальной вставки

Список параметров метода Range.PasteSpecial:

Параметры Описание
Paste Необязательный параметр. Константа из коллекции XlPasteType, указывающая на часть данных вставляемого диапазона, которую следует вставить. По умолчанию вставляются все данные.
Operation Необязательный параметр. Константа из коллекции XlPasteSpecialOperation, указывающая на математические операции, которые следует провести со скопированными данными и данными в ячейках назначения. По умолчанию вычисления не производятся.
SkipBlanks Необязательный параметр. Булево значение, которое указывает, вставлять ли в конечный диапазон пустые ячейки: True – не вставлять, False – вставлять (значение по умолчанию).
Transpose Необязательный параметр. Булево значение, которое указывает, следует ли транспонировать строки и столбцы при вставке диапазона: True – транспонировать, False – не транспонировать (значение по умолчанию).

Смотрите другой способ транспонировать диапазоны ячеек и двумерные массивы.

Константы XlPasteType

Список констант из коллекции XlPasteType, которые могут быть использованы в качестве аргумента параметра Paste:

Константа Значение Описание
xlPasteAll -4104 Вставка всех данных (по умолчанию).
xlPasteAllExceptBorders 7 Вставка всех данных, кроме границ.
xlPasteAllMergingConditionalFormats 14 Вставка всех данных со слиянием условных форматов исходного и нового диапазонов.
xlPasteAllUsingSourceTheme 13 Вставка всех данных с использованием исходной темы.
xlPasteColumnWidths 8 Вставка ширины столбцов.
xlPasteComments -4144 Вставка комментариев.
xlPasteFormats -4122 Вставка форматов исходного диапазона.
xlPasteFormulas -4123 Вставка формул.
xlPasteFormulasAndNumberFormats 11 Вставка формул и форматов чисел.
xlPasteValidation 6 Вставка правил проверки данных из ячеек исходного диапазона в новый диапазон.
xlPasteValues -4163 Вставка значений.
xlPasteValuesAndNumberFormats 12 Вставка значений и форматов чисел.

Константы XlPasteSpecialOperation

Список констант из коллекции XlPasteSpecialOperation, которые могут быть использованы в качестве аргумента параметра Operation:

Константа Значение Описание
xlPasteSpecialOperationAdd 2 Скопированные данные будут добавлены к значениям в ячейках назначения.
xlPasteSpecialOperationDivide 5 Скопированные данные разделят значения в ячейках назначения.
xlPasteSpecialOperationMultiply 4 Скопированные данные будут перемножены со значениями в ячейках назначения.
xlPasteSpecialOperationNone -4142 Вычисления не выполняются при вставке данных (по умолчанию).
xlPasteSpecialOperationSubtract 3 Скопированные данные будут вычтены из значений в ячейках назначения.

Примеры

Примеры копирования и специальной вставки актуальны для диапазона "A1:B8" активного листа, ячейки которого заполнены числами:

‘Копирование диапазона ячеек в буфер обмена:

Range(«A1:B8»).Copy

‘Специальная вставка только значений:

Range(«D1»).PasteSpecial Paste:=xlPasteValues

‘Специальная вставка с делением значений ячеек конечного

‘диапазона на значения ячеек диапазона из буфера обмена:

Range(«D1»).PasteSpecial Operation:=xlPasteSpecialOperationDivide

‘Специальная вставка только значений с транспонированием строк и столбцов:

Range(«G1»).PasteSpecial Paste:=xlPasteValues, Transpose:=True


Содержание

  1. Преобразование формул в значения
  2. Способ 1. Классический
  3. Способ 2. Только клавишами без мыши
  4. Способ 3. Только мышью без клавиш или Ловкость Рук
  5. Способ 4. Кнопка для вставки значений на Панели быстрого доступа
  6. Способ 5. Макросы для выделенного диапазона, целого листа или всей книги сразу
  7. Способ 6. Для ленивых
  8. VBA Excel. Вставка формулы в ячейку
  9. Свойство Range.FormulaLocal
  10. Свойство Range.FormulaR1C1Local
  11. 19 комментариев для “VBA Excel. Вставка формулы в ячейку”
  12. Чтение и запись значения ячейки в VBA
  13. Обращение к конкретной ячейке
  14. Чтение значения из ячейки
  15. Запись значения в ячейку

Преобразование формул в значения

Формулы – это хорошо. Они автоматически пересчитываются при любом изменении исходных данных, превращая Excel из «калькулятора-переростка» в мощную автоматизированную систему обработки поступающих данных. Они позволяют выполнять сложные вычисления с хитрой логикой и структурой. Но иногда возникают ситуации, когда лучше бы вместо формул в ячейках остались значения. Например:

  • Вы хотите зафиксировать цифры в вашем отчете на текущую дату.
  • Вы не хотите, чтобы клиент увидел формулы, по которым вы рассчитывали для него стоимость проекта (а то поймет, что вы заложили 300% маржи на всякий случай).
  • Ваш файл содержит такое больше количество формул, что Excel начал жутко тормозить при любых, даже самых простых изменениях в нем, т.к. постоянно их пересчитывает (хотя, честности ради, надо сказать, что это можно решить временным отключением автоматических вычислений на вкладке Формулы – Параметры вычислений).
  • Вы хотите скопировать диапазон с данными из одного места в другое, но при копировании «сползут» все ссылки в формулах.

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

Способ 1. Классический

Этот способ прост, известен большинству пользователей и заключается в использовании специальной вставки:

  1. Выделите диапазон с формулами, которые нужно заменить на значения.
  2. Скопируйте его правой кнопкой мыши – Копировать(Copy) .
  3. Щелкните правой кнопкой мыши по выделенным ячейкам и выберите либо значок Значения (Values) :


либо наведитесь мышью на команду Специальная вставка (Paste Special) , чтобы увидеть подменю:


Из него можно выбрать варианты вставки значений с сохранением дизайна или числовых форматов исходных ячеек.

В старых версиях Excel таких удобных желтых кнопочек нет, но можно просто выбрать команду Специальная вставка и затем опцию Значения (Paste Special — Values) в открывшемся диалоговом окне:

Способ 2. Только клавишами без мыши

При некотором навыке, можно проделать всё вышеперечисленное вообще на касаясь мыши:

  1. Копируем выделенный диапазон Ctrl + C
  2. Тут же вставляем обратно сочетанием Ctrl + V
  3. Жмём Ctrl , чтобы вызвать меню вариантов вставки
  4. Нажимаем клавишу с русской буквой З или используем стрелки, чтобы выбрать вариант Значения и подтверждаем выбор клавишей Enter :

Способ 3. Только мышью без клавиш или Ловкость Рук

Этот способ требует определенной сноровки, но будет заметно быстрее предыдущего. Делаем следующее:

  1. Выделяем диапазон с формулами на листе
  2. Хватаем за край выделенной области (толстая черная линия по периметру) и, удерживая ПРАВУЮ клавишу мыши, перетаскиваем на пару сантиметров в любую сторону, а потом возвращаем на то же место
  3. В появившемся контекстном меню после перетаскивания выбираем Копировать только значения (Copy As Values Only) .

После небольшой тренировки делается такое действие очень легко и быстро. Главное, чтобы сосед под локоть не толкал и руки не дрожали 😉

Способ 4. Кнопка для вставки значений на Панели быстрого доступа

Ускорить специальную вставку можно, если добавить на панель быстрого доступа в левый верхний угол окна кнопку Вставить как значения. Для этого выберите Файл — Параметры — Панель быстрого доступа (File — Options — Customize Quick Access Toolbar) . В открывшемся окне выберите Все команды (All commands) в выпадающем списке, найдите кнопку Вставить значения (Paste Values) и добавьте ее на панель:

Теперь после копирования ячеек с формулами будет достаточно нажать на эту кнопку на панели быстрого доступа:

Кроме того, по умолчанию всем кнопкам на этой панели присваивается сочетание клавиш Alt + цифра (нажимать последовательно). Если нажать на клавишу Alt , то Excel подскажет цифру, которая за это отвечает:

Способ 5. Макросы для выделенного диапазона, целого листа или всей книги сразу

Если вас не пугает слово «макросы», то это будет, пожалуй, самый быстрый способ.

Макрос для превращения всех формул в значения в выделенном диапазоне (или нескольких диапазонах, выделенных одновременно с Ctrl) выглядит так:

Если вам нужно преобразовать в значения текущий лист, то макрос будет таким:

И, наконец, для превращения всех формул в книге на всех листах придется использовать вот такую конструкцию:

Код нужных макросов можно скопировать в новый модуль вашего файла (жмем Alt + F11 чтобы попасть в Visual Basic, далее Insert — Module). Запускать их потом можно через вкладку Разработчик — Макросы (Developer — Macros) или сочетанием клавиш Alt + F8 . Макросы будут работать в любой книге, пока открыт файл, где они хранятся. И помните, пожалуйста, о том, что действия выполненные макросом невозможно отменить — применяйте их с осторожностью.

Способ 6. Для ленивых

Если ломает делать все вышеперечисленное, то можно поступить еще проще — установить надстройку PLEX, где уже есть готовые макросы для конвертации формул в значения и делать все одним касанием мыши:

  • всё будет максимально быстро и просто
  • можно откатить ошибочную конвертацию отменой последнего действия или сочетанием Ctrl + Z как обычно
  • в отличие от предыдущего способа, этот макрос корректно работает, если на листе есть скрытые строки/столбцы или включены фильтры
  • любой из этих команд можно назначить любое удобное вам сочетание клавиш в Диспетчере горячих клавиш PLEX

Источник

VBA Excel. Вставка формулы в ячейку

Вставка формулы со ссылками в стиле A1 и R1C1 в ячейку (диапазон) из кода VBA Excel. Свойства Range.FormulaLocal и Range.FormulaR1C1Local.

Свойство Range.FormulaLocal

В качестве примера будем использовать диапазон A1:E10, заполненный числами, которые необходимо сложить построчно и результат отобразить в столбце F:

Примеры вставки формул суммирования в ячейку F1:

Пример вставки формул суммирования со ссылками в стиле A1 в диапазон F1:F10:

В этой статье я не рассматриваю свойство Range.Formula, но если вы решите его применить для вставки формулы в ячейку, используйте англоязычные функции, а в качестве разделителей аргументов — запятые (,) вместо точек с запятой (;):

После вставки формула автоматически преобразуется в локальную (на языке пользователя).

Свойство Range.FormulaR1C1Local

Формулы со ссылками в стиле R1C1 можно вставлять в ячейки рабочей книги Excel, в которой по умолчанию установлены ссылки в стиле A1. Вставленные ссылки в стиле R1C1 будут автоматически преобразованы в ссылки в стиле A1.

Примеры вставки формул суммирования со ссылками в стиле R1C1 в ячейку F1 (для той же таблицы):

Пример вставки формул суммирования со ссылками в стиле R1C1 в диапазон F1:F10:

Так как формулы с относительными ссылками и относительными по строкам ссылками в стиле R1C1 для всех ячеек столбца F одинаковы, их можно вставить сразу, без использования цикла, во весь диапазон.

19 комментариев для “VBA Excel. Вставка формулы в ячейку”

Доброго времени суток.
Кто-нибудь подскажет, как написать в vba excel вот такую формулу: =»пример текста » & D1 в ячейку, где «пример текста » и D1 должна быть выражена в виде переменных. В итоге в ячейке должно отобразиться: пример текста 50 при условии, что d1=50

Привет, Nik!
Записываем формулу в ячейку «A1» , собрав ее из переменных:

Спасибо большое! Совсем из вида упустил, что можно применить Chr(34).

Ещё один вопрос, почему абсолютная ссылка получается =»Пример текста «&$D$1 , как сделать, что бы была относительная =»Пример текста «&D1 ?

Ещё раз большое спасибо за оперативность.

Здравствуйте. Помогите , пожалуйста. Возникает такая проблема: после замены части формулы с помощью функции Replace,значение в ячейке воспринимается как текст, а не как формула.
Команды

не помогли)). При этом, если подобную замену делать штатным экселевским Заменить, то полученный результат воспринимается как формула и вычисляется сразу.

Здравствуйте, Сусанна!
У меня работает так:

Огромное спасибо) В понедельник приду на работу, и обязательно попробую Ваш вариант.

Добрый вечер. Мне нужно использовать математические операции, опираясь только на переменные. Например:
Cells(i, SOH).Formula = (Cells(i, Stock_rep_date) + Cells(i, Consig_Stock_rep_date)) / 1
Но в ячейках получаются сами значения, а нужна формула с ссылками на ячейки Cells.

Здравствуйте, Дмитрий!
Cells(i, SOH).Formula = «=(» & Cells(i, Stock_rep_date).Address & «+» & Cells(i, Consig_Stock_rep_date).Address & «)/1»

Здравствуйте, Евгений!
Можете помочь?
Дано:
1. В ячейках D1 и D2 некие текстовые данные, которые необходимо объединить в ячейку D3
Range(«D3»).FormulaR1C1 = «=R[-2]C&R[-1]C»

2. Потом в Ячейку D4 получившийся результат вставить как значение
Range(«D3»).Copy
Range(«D4»).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False

3. И в ячейке D4 между данными вставить перенос на вторую строку. К примеру:
Range(«C4»).FormulaR1C1 = «Видеокарта» & Chr(10) & «GTX 3090») .

Но проблема в том, что данные неизвестны и могут меняться.
А объединить первый макрос с третьим у меня не получается.
Подскажите как можно одним макросом объединить данные двух ячеек сразу с переносом данных второй ячейки во вторую строку ячейки.

Здравствуйте!
Не совсем понял, что нужно, поэтому привожу пример, как объединить текст из двух ячеек (D1 и D2) в одну строку и как — в две:

Источник

Чтение и запись значения ячейки в VBA

В приложении Excel все данные как правило находятся в ячейках на листах, с которыми макросы работают как с базой данных. Поэтому, начинающему программисту VBA важно понимать как читать значения из ячейки Excel в переменные или массивы и, наоборот, записывать какие-либо значения на лист в ячейки.

Обращение к конкретной ячейке

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

Полный путь к ячейке A1 в Книге1 на Листе1 можно записать двумя вариантами:

  • С помощью Range
  • С помощью Cells

Пример 1: Обратиться к ячейке A3 находящейся в Книге1 на Листе1

Однако, как правило, полный путь редко используется, т.к. макрос работает с Книгой, в которой он записан и часто на активном листе. Поэтому путь к ячейке можно сократить и написать просто:

Пример 2: Обратиться к ячейке A1 в текущей книге на активном листе

Если всё же путь к книге или листу необходим, но не хочется его писать при каждом обращении к ячейкам, можно использовать конструкцию With End With. При этом, обращаясь к ячейкам, необходимо использовать в начале «.» (точку).

Пример 3: Обратиться к ячейке A1 и B1 в Книге1 на Листе2.

Так же, можно обратиться и к активной (выбранной в данный момент времени) ячейке.

Пример 4: Обратиться к активной ячейке на Листе3 текущей книги.

Чтение значения из ячейки

Есть 3 способа получения значения ячейки, каждый из которых имеет свои особенности:

  • Value2 — базовое значение ячейки, т.е. как оно хранится в самом Excel-е. В связи с чем, например, дата будет прочтена как число от 1 до 2958466, а время будет прочитано как дробное число. Value2 — самый быстрый способ чтения значения, т.к. не происходит никаких преобразований.
  • Value — значение ячейки, приведенное к типу ячейки. Если ячейка хранит дату, будет приведено к типу Date. Если ячейка отформатирована как валюта, будет преобразована к типу Currency (в связи с чем, знаки с 5-го и далее будут усечены).
  • Text — визуальное отображение значения ячейки. Например, если ячейка, содержит дату в виде «число месяц прописью год», то Text (в отличие от Value и Value2) именно в таком виде и вернет значение. Использовать Text нужно осторожно, т.к., если, например, значение не входит в ячейку и отображается в виде «#####» то Text вернет вам не само значение, а эти самые «решетки».

По-умолчанию, если при обращении к ячейке не указывать способ чтения значения, то используется способ Value.

Пример 5: В ячейке A1 активного листа находится дата 01.03.2018. Для ячейки выбран формат «14 марта 2001 г.». Необходимо прочитать значение ячейки всеми перечисленными выше способами и отобразить в диалоговом окне.

Пример 6: В ячейке С1 активного листа находится значение 123,456789. Для ячейки выбран формат «Денежный» с 3 десятичными знаками. Необходимо прочитать значение ячейки всеми перечисленными выше способами и отобразить в диалоговом окне.

При присвоении значения переменной или элементу массива, необходимо учитывать тип переменной. Например, если оператором Dim задан тип Integer, а в ячейке находится текст, при выполнении произойдет ошибка «Type mismatch». Как определить тип значения в ячейке, рассказано в следующей статье.

Пример 7: В ячейке B1 активного листа находится текст. Прочитать значение ячейки в переменную.

Таким образом, разница между Text, Value и Value2 в способе получения значения. Очевидно, что Value2 наиболее предпочтителен, но при преобразовании даты в текст (например, чтобы показать значение пользователю), нужно использовать функцию Format.

Запись значения в ячейку

Осуществить запись значения в ячейку можно 2 способами: с помощью Value и Value2. Использование Text для записи значения не возможно, т.к. это свойство только для чтения.

Пример 8: Записать в ячейку A1 активного листа значение 123,45

Все три строки запишут в A1 одно и то же значение.

Пример 9: Записать в ячейку A2 активного листа дату 1 марта 2018 года

В данном примере тоже запишется одно и то же значение в ячейку A2 активного листа.

Визуальное отображение значения на экране будет зависеть от того, какой формат ячейки выбран на листе.

Источник

Копирование только значений, без формул

julia5555

Дата: Среда, 21.03.2018, 09:15 |
Сообщение № 1

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

Ранг: Новичок

Сообщений: 16


Репутация:

0

±

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


Excel 2013

Здравствуйте! не получается оптимизировать макрос чтобы копировал только значения
Сначала я копирую определенный лист из другой книги

[vba]

Код

Sub CombineWorkbooks()
Dim filestoopen
Dim x As Integer
Application.ScreenUpdating = False
filestoopen = Application.GetOpenFilename(filefilter:=»All files(*.*),*.*», MultiSelect:=True, Title:=»Files to Merge»)
If TypeName(filestoopen) = «Boolean» Then
MsgBox «Файл не выбран»
Exit Sub
End If

x = 1
While x <= UBound(filestoopen)
Set importWB = Workbooks.Open(Filename:=filestoopen(x))
Sheets(«Свод»).Copy after:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count)
importWB.Close savechanges:=False
x = x + 1
Wend
Application.ScreenUpdating = True

End Sub

[/vba]

Затем я на новом листе собираю свод из текущих листов, все копируется но с формулами

[vba]

Код

Sub www()
    Dim ws As Worksheet, l&
    With Sheets(«Svod»)
        .UsedRange.Offset(9).ClearContents
        For Each ws In Worksheets
            If Not ws.Name = «Svod» Then
                     l = .Cells.Find(«*», [a20], xlValues, 1, 1, 2).Row + 1
                ws.UsedRange.Offset(9).Copy .Range(«a» & l)
                        End If
        Next
    End With
End Sub

[/vba]

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

 

Ответить

Roman777

Дата: Среда, 21.03.2018, 09:53 |
Сообщение № 2

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

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

Сообщений: 980


Репутация:

127

±

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


Excel 2007, Excel 2013

Используйте [vba][/vba] :msdn


Много чего не знаю!!!!

Сообщение отредактировал Roman777Среда, 21.03.2018, 09:54

 

Ответить

julia5555

Дата: Среда, 21.03.2018, 11:50 |
Сообщение № 3

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

Ранг: Новичок

Сообщений: 16


Репутация:

0

±

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


Excel 2013

Используйте
.PasteSpecial
:msdn

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

 

Ответить

Mikael

Дата: Среда, 21.03.2018, 12:32 |
Сообщение № 4

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

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

Сообщений: 80


Репутация:

31

±

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


Excel 2010

julia5555, добрый день!
А так пробовали?
[vba]

Код

Sub www()
    Dim ws As Worksheet, l&
    With Sheets(«Svod»)
        .UsedRange.Offset(9).ClearContents
        For Each ws In Worksheets
            If Not ws.Name = «Svod» Then
                l = .Cells.Find(«*», [a20], xlValues, 1, 1, 2).Row + 1
                ws.UsedRange.Offset(9).Copy
                .Range(«a» & l).PasteSpecial xlPasteValues
                Application.CutCopyMode = 0
            End If
        Next
    End With
End Sub

[/vba]

 

Ответить

julia5555

Дата: Среда, 21.03.2018, 13:17 |
Сообщение № 5

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

Ранг: Новичок

Сообщений: 16


Репутация:

0

±

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


Excel 2013

julia5555, добрый день!А так пробовали?

не выходит, прикрепляю файл
[moder]Не нужно цитировать весь пост целиком — это нарушение правил.[/moder]

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

4688776.xlsm
(75.1 Kb)

 

Ответить

Mikael

Дата: Среда, 21.03.2018, 13:26 |
Сообщение № 6

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

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

Сообщений: 80


Репутация:

31

±

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


Excel 2010

julia5555,
Попробуйте так:
[vba]

Код

Sub www_Mika()
    Dim ws As Worksheet, l&, aTmp
    With Sheets(«Svod»)
        .UsedRange.Offset(9).ClearContents
        For Each ws In Worksheets
            If Not ws.Name = «Svod» Then
                l = .Cells.Find(«*», [a20], xlValues, 1, 1, 2).Row + 1
                aTmp = ws.UsedRange.Offset(9).Value
                .Range(«a» & l).Resize(UBound(aTmp), UBound(aTmp, 2)).Value = aTmp
            End If
        Next
    End With
End Sub

[/vba]

UPD:
В Вашем файле проблема в 13 строке (17 на листе Svod) — уберите объединение ячеек

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

1416920.xlsm
(73.9 Kb)

Сообщение отредактировал MikaelСреда, 21.03.2018, 13:40

 

Ответить

julia5555

Дата: Среда, 21.03.2018, 14:13 |
Сообщение № 7

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

Ранг: Новичок

Сообщений: 16


Репутация:

0

±

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


Excel 2013

julia5555,Попробуйте так:

дааа, спасибо большое!
Не очень поняла почему мы пользовались[vba]

Код

.Range(«a» & l).Resize(UBound(aTmp), UBound(aTmp, 2)).Value = aTmp

[/vba] а не [vba]

Код

Range(«a» & l).PasteSpecial xlPasteValues

[/vba] щас буду читать, так как новичек в этой теме
Спасибо еще раз

 

Ответить

Mikael

Дата: Среда, 21.03.2018, 14:33 |
Сообщение № 8

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

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

Сообщений: 80


Репутация:

31

±

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


Excel 2010

Не очень поняла почему мы пользовались

это решение через массив, я загружаю все данные с листа ws сначала в массив, а потом выгружаю этот массив на лист Svod. Этот метод куда быстрее копирования-вставки.

Чтобы использовать .PasteSpecial:

В Вашем файле проблема в 13 строке (17 на листе Svod) — уберите объединение ячеек

 

Ответить

julia5555

Дата: Среда, 28.03.2018, 06:54 |
Сообщение № 9

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

Ранг: Новичок

Сообщений: 16


Репутация:

0

±

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


Excel 2013

Спасибо большое, разобралась и все работает

 

Ответить

Данный код добавляет в контекстное меню ячейки два новых действия:

1. Вставить только значения;
2. Вставить значения с транспонированием.

Нижеуказанный макрос лучше всего поместить в «личную книгу макросов» (PERSONAL)

В модуль «ЭтаКнига» файла PERSONAL вставляем:

Private Sub Workbook_Open()
  MyComBars
End sub

Также создаем новый модуль (в книге PERSONAL), в который помещаем следующий код:

Option Private Module
 
Sub MyComBars()
     Application.CommandBars("cell").Reset    'возвращаем стандартный ComBars
    With Application.CommandBars("cell").Controls.Add(Type:=1, Before:=5)
         .OnAction = "PasteValues"    ' назначаем кнопке макрос
        .Caption = "Вставить значения"
     End With
 
     With Application.CommandBars("cell").Controls.Add(Type:=1, Before:=6)
         .OnAction = "PasteTranspose"    ' назначаем кнопке макрос
        .Caption = "Вставить с транспонированием"
     End With
End Sub
 
Sub PasteValues()
On Error Resume Next
     Selection.PasteSpecial Paste:=xlPasteValues
End Sub
 
Sub PasteTranspose()
On Error Resume Next
     Selection.PasteSpecial Paste:=xlPasteAll, Transpose:=True
End Sub

by LightZ
 

  • 22788 просмотров

Не получается применить макрос? Не удаётся изменить код под свои нужды?

Оформите заказ у нас на сайте, не забыв прикрепить примеры файлов, и описать, что и как должно работать.

Понравилась статья? Поделить с друзьями:
  • Торг 12 скачать бланк word на одной странице
  • Только заполненные таблицу в excel
  • Торг 12 в excel одна страница
  • Только для этого раздела word
  • Торг 12 excel с формулами скачать