Excel range copy - IT Новости из мира ПК
Remkomplekty.ru

IT Новости из мира ПК
5 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Excel range copy

VBA Excel. Переменная диапазона ячеек (As Range)

Присвоение диапазона ячеек объектной переменной в VBA Excel. Адресация ячеек в переменной диапазона и работа с ними. Определение размера диапазона. Примеры.

Присвоение диапазона ячеек переменной

Чтобы переменной присвоить диапазон ячеек, она должна быть объявлена как Variant, Object или Range:

Чтобы было понятнее, для чего переменная создана, объявляйте ее как Range.

Присваивается переменной диапазон ячеек с помощью оператора Set:

В выражении Range(Cells(3, 4), Cells(26, 18)) вместо чисел можно использовать переменные.

Для присвоения диапазона ячеек переменной можно использовать встроенное диалоговое окно Application.InputBox, которое позволяет выбрать диапазон на рабочем листе для дальнейшей работы с ним.

Адресация ячеек в диапазоне

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

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

Индексация строк и столбцов начинается с левой верхней ячейки. В диапазоне этого примера содержится 5 строк и 5 столбцов. На пересечении 2 строки и 4 столбца находится ячейка с индексом 9. Обратиться к ней можно так:

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

обращение к первой строке присвоенного диапазона размерностью 5х5:

и обращение к первому столбцу присвоенного диапазона размерностью 5х5:

Работа с диапазоном в переменной

Работать с диапазоном в переменной можно точно также, как и с диапазоном на рабочем листе. Все свойства и методы объекта Range действительны и для диапазона, присвоенного переменной. При обращении к ячейке без указания свойства по умолчанию возвращается ее значение. Строки

равнозначны. В обоих случаях информационное сообщение MsgBox выведет значение ячейки с индексом 6.

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

Преимущество работы с диапазоном ячеек в объектной переменной заключается в том, что все изменения, внесенные в переменной, применяются к диапазону (который присвоен переменной) на рабочем листе.

Пример 1 – работа со значениями

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

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

Пример 2 – работа с форматами

Продолжаем работу с тем же диапазоном рабочего листа «C6:E8»:

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

Пример 3 – копирование и вставка диапазона из переменной

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

Скопировать и вставить диапазон полностью со значениями и форматами можно при помощи метода Copy, указав место вставки (ячейку) на рабочем листе.

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

Copy Paste in VBA

Copy Paste in VBA is similar to what we do in excel worksheet, like we can copy a value and paste it to another cell also we can use paste special to paste only the values, similarly in VBA we use the copy method with range property to copy a value from one cell to other and to paste the value we use the worksheet function paste special or paste method.

How to Copy Paste in VBA?

Below are some examples of how to copy paste in excel using VBA.

The basic thing we do in excel is we copy, we cut, and we paste the data from one cell to another cell. It requires no special introduction as well. However, while learning VBA coding is important to understand the same concept in coding language. Copy Paste in VBA is the routine task we do in the day in day in excel. In order to copy first, we need to decide which cell to copy.

Example #1 – Copy and Paste Values Using Range Object

Assume you have the word “Excel VBA” in the cell A1.

Let’s say for an example if you want to copy the cell A1 we can use VBA RANGE object.

Code:

The moment you reference the cell we can see all the properties and methods with it. So select the method “Copy”.

Code:

After selecting the method press space key to see the argument of the Copy method.

It says Destination.

This is nothing but where do you want to copy paste values in VBA without selecting the PASTE method.

If we are pasting in the same sheet we can select the cell by using Range object. Let us say if we want to paste the value in B3 cell we can put the destination as “Range(“B3”)”.

Code:

This will copy the data from cell A1 and paste in the cell B3.

We can also use the below method to paste the data.

Code:

First, we will copy & select the data from cell A1 and paste in the cell B3.

Example #2 – Copy to another Worksheet in the Same Workbook

Now if we want to copy paste the value from the different worksheet using VBA macro then in the Destination argument we need to reference the sheet name by using WORKSHEETS object then mention the range of cells in that WORKSHEET. Below code will do the job.

Code:

If we want to copy the data from a particular sheet and want to paste in another particular sheet, we need to mention both the sheets names.

Firstly we need to mention the copying sheet.

Then in the Destination argument, we need to mention the targeted worksheet name and range of the cell.

So the code should like this.

Code:

Example #3 – Copy from One Workbook to another Workbook

We have seen how to copy from worksheet to another worksheet in the same workbook. But we can also do this from one workbook to another workbook.

Take a look at the below code.

Code:

Firstly it will copy the data from the worksheet “Sheet1” in the workbook “Book1.xlsx” from the cell A1.

Then it will activate the workbook “Book 2.xlsx”.

In the active workbook, it will select the worksheet “Sheet 2”

Now in the active sheet, it will paste

Alternative Way for using Copy Paste in VBA

We have one more alternative way of having the data from one cell to another cell. Assume you have the word “Excel VBA” in the cell A1 and you need the same to come in cell B3.

One method we have seen is using the VBA copy and paste method, now I will show you one of the alternative ways. Look at the below piece of code to understand.

Читать еще:  Достать аудиодорожку из видео

Code:

The above says whatever the value is there in the cell A1 should be equal to the value in the cell B3.

Even though this is not a copy and paste method still adds more value to our coding knowledge.

Top Ways of VBA Copy and Paste as Values

Now we will see different ways of VBA copy and paste values. Assume you are in the cell A1 as shown in the below image.

  • If we want to copy and paste we need to reference the cell here, rather we can just use a property of Selection. Copy method.

Code:

OR

  • If you want to copy the entire used range of the worksheet you can use below code.

Code:

This will copy the entire used range in the worksheet “Sheet1” and will paste the same in the worksheet “Sheet2”

Recommended Articles

This has been a guide to VBA Copy Paste. Here we discuss the top ways to Copy and Paste in VBA along with examples & downloadable excel template. Below are some useful excel articles related to VBA –

Excel в Delphi. Работа с объектом Range (диапазон)

Сегодняшняя статья блога будет целиком посвящена работе с Excel Range или, говоря другими словами — работе с диапазонами ячеек Excel.

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

План статьи:

1. Что такое Range и как его получить?

Согласно официальному определению Microsoft, Range :

представляет собой ячейки, строки, столбцы, набор ячеек, содержащих один или более смежных блоков ячеек, или 3-D диапазон.

Однако это определение не исключает того, что объектом Range может выступать и одна ячейка (Cell) листа. Таким образом, чтобы получить в свое распоряжение объект Range, можно выполнить следующие операции c объектом Excel в Delphi:

Если Вам неудобно в какой-либо ситуации использовать буквенные обозначение ячеек или Вы привыкли до этого момента иметь дело только с отдельными ячейками (Cells), то объект Range можно получить например вот так:

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

2. Свойства объекта Excel Range.

Рассмотрим основные свойства объекта Range и их применение работе в Excel в Delphi.

Вначале перечислю свойства, которые будут далее рассмотрены в статье.

Formula

Возвращает или помещает в диапазон формулу.

Value

Возвращает или устанавливает значение для диапазона.Свойство Value замечательно тем, что с помощью него можно записать в ячейки абсолютно любые данные, особо не задумываясь о формате данных. Например, запишем в ячейки диапазона строку, число типа integer и число типа single: чтобы каждый раз не повторяться в листингах и не писать одни и те же элементы по 100 раз, будем считать, что в переменной Sheet уже содержится ссылка на активный лист (ActiveWorkSheet) активной книги (ActiveWorkBook) Excel (MyExcel)

Как видите, обращение к ячейкам было одно и то же и нигде я не приводил данный к какому-то типу — записал в ячейки всё как есть.

Если Вы хотите записать в весь диапазон Range одно и то же значение, то просто выполните:

и получите одну и ту же строку «Hello World!» в десяти ячейках Excel, но такие операции очень редко необходимы при работе с Excel в Delphi. Зато очень часто необходимо воспользоваться другой стороной свойства Value — прочитать большой объем данных из книги Excel за один прием и получить весь массив данных в Delphi. Операция чтения данных из Excel в Delphi более проста, чем Вам может показаться на первый взгляд. Проведем обратную операцию — прочитаем данные из Excel:

Как видите здесь мы за один прием прочитали данные сразу из трех ячеек Excel и отобразили их в сообщении. Этот прием чтения на порядок более скоростной, чем, например чтение содержимого каждой ячейки (Cells) в отдельности.

Ещё одно простенькое свойство объекта Range — возвращает текст из ячейки. Самое главное отличие от свойства Value Text возвращает string только для чтения и использовать это свойство для чтения большого объема данных, как в предыдущем примере — ни в коем случае нельзя, так как переменная Val вернет значение Null.

Column

Возвращает номер первого столбца в первой области, в указанном диапазоне. Свойство только для чтения.

Чтобы продемонстрировать свойство в действии, давайте создадим такие диапазоны как показано на рисунке:

То есть каждый из диапазонов Range будет содержать по две несвязанные друг с другом области (Area). Причем первая область диапазона Range будет начинаться в столбце А, а первая область второго диапазона (Range 2) — в столбце B.

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

Листинг процедуры создания двух несвязных диапазонов Range следующий:

Так, в случае с первым Range Column вернет нам значение 1, а для второго Range — значение 2.

Columns

В отличие от предыдущего свойства, Columns возвращает не простое число, а объект Range, представляющий собой один столбец из всего диапазона.

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

Для демонстрации воспользуемся предыдущим примером, изменим только окончание:

В итоге в каждый из столбцов диапазона должна записаться строка с номером этого столбца, результат представлен на рисунке. Как видите, в цикле все столбцы обработались «насквозь», хотя Range не содержал в себе столбец D.

Comment

Возвращает объект Comment для Range. В данном случае Range должен определять одну ячейку.

Для демонстрации свойства не будем заходить в Excel, поработаем с приложением прямо из Delphi. Для этого воспользуемся методом AddComment. То есть сначала запишем комментарий в ячейку, а потом прочитаем его используя свойство Comment:

Address

Возвращает реальный адрес диапазона Range. Например для диапазона ячеек, заданных вот таким образом:

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

Помимо перечисленных выше свойств к объекту Range применимы все свойства, описанный в статье об изменении внешнего вида ячеек Excel, т.е. borders, color и пр.

3. Методы объекта Excel Range.

Теперь рассмотрим несколько полезных методов, которые могут Вам пригодиться при работе с Excel в Delphi.

CheckSpelling

Проверяет грамматику в выбранном диапазоне и при нахождении ошибок выводит окно для замены. Замечательной особенностью этого метода является то, что окно замены появляется даже при скрытом окне Excel, то есть, когда свойство Visible у объекта Excel равно false.

Вызывается метод без каких-либо дополнительных параметров:

PrintPreview

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

не забывайте включить свойство Visible у Excel:

Читать еще:  Excel vba value

AutoFill

Автоматическое заполнение диапазона ячеек на основе данных из другого диапазона.

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

В результате лист Excel примет следующий вид:

Как видите все столбцы второго диапазона Range заполнились значениями из диапазоны Source.

При использовании этого метода следует иметь в виду, что диапазон-источник (в нашем случае — это source) по одному из измерений должен совпадать с источником назначения. В приведенном примере совпадает размерность по строкам (в обоих диапазонах их шесть). Если размерности диапазонов не совпадают, то возникает исключительная ситуация.

При использовании метода мы использовали одну из констант в параметре TypexlFillDefault = 0. Используя её мы скопировали данные один-к-одному. Дополнительно Вы можете использовать следующие константы при автозаполнении:

AutoFit

Изменяет ширину или высоту ячеек диапазона для наилучшего представления данных.

Приведет и изменению ширины столбца А таким образом, чтобы число было полностью видно на листе.

Методы очистки данных диапазона Range

Есть несколько различных методов очистки содержимого диапазона Range при работе с Excel в Delphi.

1. Clear

Удаляет все данные из диапазона.

2. ClearComments

Удаляет все комментарии в диапазоне Range.

3. ClearContents

Удаляет все формулы из диапазона Range

4. ClearFormats

Очищает форматы в диапазоне Range

5. ClearNotes

Очищает все заметки в диапазоне Range

Методы работы с буфером обмена Excel

1. Copy

Копирует содержимое диапазона Range в буфер обмена или в другой диапазон.

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

А для того, чтобы вставить данные из буфера обмена существует ещё один метод

2. PasteSpecial

При определении параметра Paste следует использовать следующие константы:

При использовании параметра Operation следует использовать следующие константы:

Теперь рассмотрим применение метода на примере. В качестве исходных данных возьмем данные из предыдущего примера, но для вставки используем метод PasteSpecial:

После выполнения этой операции все данные вставятся в диапазон Range2, т.к. диапазон до вставки был пуст, то данные скопировались один-к-одному.

3. Cut

Вырезает данные и при необходимости вставляет их в новый диапазон. Метод работает аналогично методу Copy, но с последующим удалением данных из источника.

Merge

Объединение ячеек диапазона.

Для новичков, только начинающих постигать азы работы с excel в Delphi этот метод в какой-то момент становится камнем преткновения :). Дело в том, что очень часто возникает необходимость объединить часть ячеек листа для записи в объединенную область большого количества данных или длинной строки. В Excel есть такой метод Union, который и отвечает за объединение — им-то и пробуют пользоваться многие. А метод Union при вызове из Delphi применительно к диапазону Range вызывает исключительную ситуацию. Про Merge люди либо не знают, либо забывают. А использовать его достаточно просто:

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

Я пытаюсь скопировать значения из таблицы в диапазон, в Excel используя vba Macros, но мне не нужен формат таблицы, только ее значения. Как я могу этого достичь?

7 Ответов

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

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

Вы должны использовать команду pastespecial, как показано ниже.

Я предполагаю, что вы хотите скопировать из «Sheet1» в «Sheet1» — конечно, вы можете сделать это параметром и пройтись по всем вашим листам

Я добиваюсь решения, которое работает.

Есть следующий код:

Используйте метод Range.Value. Это похоже на установку variable a = 1 . Где вы думаете об этом как о копировании 1 В a. So.

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

Похожие вопросы:

Я новичок в excel macros. Я хочу скопировать выбранный диапазон в clip board. Ниже приведена ссылка, где присутствует Половинное решение,оно дает выход во всплывающем окне msg. Excel VBA получить.

Я пытаюсь скопировать все данные столбца из диапазона столбцов A:AU одного excel в другой excel в том же диапазоне столбцов A:AU , в котором я написал код . Оба excel расположены в разных местах.

Я использую следующий код в Excel VBA, чтобы скопировать лист Excel для расчета: Dim Store1Sheet() As Variant Store1Sheet = Range(A1:D99) Пожалуйста, посоветуйте, как скопировать несколько листов.

Я очень новичок в vba и в основном использую его только при изменении значения диапазона (предварительно записав скрипт с помощью макроса в excel). Поскольку я добавляю / удаляю строки в excel, мне.

Мне нужно скопировать некоторый диапазон excel из листа исходного файла excel и вставить его на лист целевого файла excel, пропустив пустые ячейки, скопированные из исходного файла excel.

Мне нужно открыть txt-файлы muliple из той же папки и скопировать их содержимое в один файл excel (например, шаблон), чтобы изменить значения, а затем скопировать измененные значения из excel в.

Я хочу скопировать данные из одного уже открытого экземпляра Excel в другой экземпляр Excel в VBA. Я пытался: Option Explicit Sub copy_paste() Dim destination_sanitized As String Dim fs As New.

Как быстро скопировать весь Excel спред-лист в другой Excel спред-лист по значению? И как быстро скопировать некоторые листы из Excel спред-листа в другой Excel спред-лист по значению? Без.

Я хочу изменить значение диапазона (источник) и вставить в другой диапазон (назначение) в excel vba. Обратите внимание, что прямые косые черты могут отличаться в источнике. Например, я хочу сделать.

У меня есть набор данных в excel из 71 столбцов. Мне нужно скопировать только 7 столбцов из них после применения автоматического фильтра на исходном листе ( RAS(Offshore) ) к целевому листу( Dst ).

Как из Excel обратиться к другому приложению

Иногда бывает необходимо перенести что-то из Excel в другое приложение. Я возьму для примера Word. Например скопировать ячейки и вставить. Обычно мы это так и делаем — скопировали в Excel, открыли Word — вставили. Но сделать это при помощи кода чуть сложнее, хотя если разобраться никаких сложностей нет. Ниже приведен пример кода, который открывает Word, открывает в нем определенный документ, копирует данные из Excel и вставляет в открытый документ Word.

Sub OpenWord() Dim objWrdApp As Object, objWrdDoc As Object ‘создаем новое приложение Word Set objWrdApp = CreateObject(«Word.Application») ‘Можно так же сделать приложение Word видимым. По умолчанию открывается в скрытом режиме ‘objWrdApp.Visible = True ‘открываем документ Word — документ «Doc1.doc» должен существовать Set objWrdDoc = objWrdApp.Documents.Open(«C:Doc1.doc») ‘Копируем из Excel диапазон «A1:A10» Range(«A1:A10»).Copy ‘вставляем скопированные ячейки в Word — в начала документа objWrdDoc.Range(0).Paste ‘закрываем документ Word с сохранением objWrdDoc.Close True ‘ False — без сохранения ‘закрываем приложение Word — обязательно! objWrdApp.Quit ‘очищаем переменные Word — обязательно! Set objWrdDoc = Nothing: Set objWrdApp = Nothing End Sub

Tips_Macro_OpenWord.xls (49,5 KiB, 4 453 скачиваний)

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

Читать еще:  Как создать список в excel 2020

Sub Check_OpenWord() Dim objWrdApp As Object On Error Resume Next ‘пытаемся подключится к объекту Word Set objWrdApp = GetObject(, «Word.Application») If objWrdApp Is Nothing Then ‘если приложение закрыто — создаем новый экземпляр Set objWrdApp = CreateObject(«Word.Application») ‘делаем приложение видимым. По умолчанию открывается в скрытом режиме objWrdApp.Visible = True Else ‘приложение открыто — выдаем сообщение MsgBox «Приложение Word уже открыто», vbInformation, «Check_OpenWord» End If End Sub

В принципе, активировать или вызвать(если закрыто) другое приложение Офиса можно одной строкой:

Sub Open_AnotherApp() Application.ActivateMicrosoftApp xlMicrosoftWord End Sub

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

По сути, методами CreateObject и GetObject можно обратиться к любому стороннему приложению(например Internet Explorer). Куда важнее при обращении к этим объектам знать объектную модель того приложения, к которому обращаетесь. Чтобы увидеть свойства и методы объектной модели приложения, можно в редакторе VBA подключить необходимую библиотеку, объявить переменную, назначив ей тип приложения. Покажу на примере того же Word-а.
Для начала открываем меню Tools — References :

Подключаем библиотеку:

Затем объявляем переменную и присваиваем ей тип нужного приложения:

Sub OpenWord() Dim objWrdApp As Word.Application Set objWrdApp = New Word.Application objWrdApp.Visible = True End Sub

Если теперь в редакторе, внутри этой процедуры в любом месте ниже объявления переменной набрать objWrdApp и точку, то сразу после ввода точки выпадет меню, в котором будут перечислены все доступные методы и свойства этого приложения.

Так же можно нажать F2 и через поиск найти Word и просмотреть все методы и свойства данного приложения.

Метод установки ссылки на библиотеку приложения через ToolsReferences называют еще ранним связыванием. Подобный метод позволяет создать ссылку на приложение быстрее и, как описано выше, предоставляет разработчику доступ к визуальному отображению свойств и методов объекта. Но есть существенный минус: если в своем коде Вы установите ссылку на Word 12 Object Libbary(Word 2007), то на ПК с установленным Word 2003 получите ошибку MISSING, т.к. Word 2003 относится к библиотеке Word 11 Object Libbary. Подробнее можно прочитать в статье Ошибка — Cant find project or library.
Метод же CreateObject еще называется методом позднего связывания. Применяя его не возникнет проблем с MISSING, очень часто возникающих при раннем связывании. Поэтому я рекомендовал бы при разработке использовать раннее связывание для удобства использования свойств и методов(если Вы их не знаете), а перед распространением приложения к коде заменить все именованные константы(типа wdLine) на числовые константы(для wdLine это 5) и применить позднее связывание. Посмотреть числовое значение константы можно просто записав её в коде, начать выполнение кода через F8 и навести курсор мыши на эту константу. Всплывающая подсказка покажет числовое значение. Так же можно отобразить окно Immediate(ViewImmediate Window или сочетание клавиш Ctrl + G ), записать вопросительный знак и вставить эту константу и нажать Enter :
?wdLine
ниже будет выведено числовое представление этой константы.
А заменять эти константы их числовыми значениями в случае с поздним связыванием необходимо, т.к. Excel не знает их значений.
Попробую пояснить поподробнее про эти константы и почему их надо заменять какими-то числами: при подключении библиотеки Wordа(Word 12 Object Libbary) мы так же подключаем и все свойства, методы и константы, которые доступны из Wordа. И их использование напрямую становится доступно из Excel и мы можем смело написать что-то вроде wbLine и Excel поймет эту константу. При позднем же связывании мы уже не подключаем библиотеки Word(во избежание ошибок совместимости) и как следствие — методы, свойства и константы Wordа для Excel становятся чем-то неизвестным и не документированным и мы получим ошибку «Variable not defined»(если включена директива Option Explicit) при попытке назначить свойство через wdLine. Если же Option Explicit не включена — то хоть ошибки не будет, но и код будет работать неверно, т.к. для неизвестной для Excel переменной wbLine будет назначено значение 0(Empty). Поэтому и надо все константы другого приложения заменять их числовыми значениями.

Главная ошибка новичка
И хочу так же упомянуть про ошибку, которую очень часто совершают при обращении к одному приложению из другого. Допустим, необходимо скопировать из Word все данные в Excel. Часто начинающие делают это так:

Sub OpenWord() Dim objWrdApp As Object, objWrdDoc As Object ‘создаем новое приложение Word Set objWrdApp = CreateObject(«Word.Application») ‘Можно так же сделать приложение Word видимым. По умолчанию открывается в скрытом режиме ‘objWrdApp.Visible = True ‘открываем документ Word — документ «Doc1.doc» должен существовать Set objWrdDoc = objWrdApp.Documents.Open(«C:Doc1.doc») ‘Копируем из Word все данные, обращаясь к объекту Range документа Range.Copy ‘вставляем скопированное в ячейку А1 активного листа Excel ActiveSheet.Paste ‘закрываем документ Word без сохранения objWrdDoc.Close False ‘закрываем приложение Word objWrdApp.Quit ‘очищаем переменные Word — обязательно! Set objWrdDoc = Nothing: Set objWrdApp = Nothing End Sub

На строке Range.Copy обязательно получите ошибку от VBA, указывающую, что нужен аргумент для объекта. Можно попробовать добавить этот аргумент: Range(1).Copy. Но все равно получим ошибку. Можно, конечно, указать даже ячейки: Range(«A1»).Copy. Но это приведет к тому, что скопирована будет ячейка А1 активного листа Excel.
Все дело в том, что мы хотим скопировать данные из Word-а, выполняя при этом код из Excel. А у Excel тоже есть объект Range с другими аргументами. И если не указать какому приложению, листу или документу принадлежит Range, то по умолчанию он будет отнесен к тому приложению, из которого выполняется код. Т.е. к Excel. Если совсем кратко об этом — всегда надо указывать какому приложению или объекту принадлежит используемый объект или свойство. Правильно код должен выглядеть так:

Sub OpenWord() Dim objWrdApp As Object, objWrdDoc As Object ‘создаем новое приложение Word Set objWrdApp = CreateObject(«Word.Application») ‘Можно так же сделать приложение Word видимым. По умолчанию открывается в скрытом режиме ‘objWrdApp.Visible = True ‘открываем документ Word — документ «Doc1.doc» должен существовать Set objWrdDoc = objWrdApp.Documents.Open(«C:Doc1.doc») ‘Копируем из Word все данные, обращаясь к объекту Range документа ‘при этом перед Range явно указываем откуда его брать — из документа Word -objWrdDoc(«C:Doc1.doc») objWrdDoc.Range.Copy ‘вставляем скопированное из Word в активную ячейку активного листа Excel ActiveSheet.Paste ‘закрываем документ Word без сохранения objWrdDoc.Close False ‘закрываем приложение Word objWrdApp.Quit ‘очищаем переменные Word — обязательно! Set objWrdDoc = Nothing: Set objWrdApp = Nothing End Sub

Вместо Range ту же ошибку делают и с Selection(потому что Selection часто присутствует в записанных макрорекордером макросах), т.к. этот объект есть и в Excel и в Word и без явного указания приложения будет относится к приложению, в котором записано.

В приложенном файле код немного отличается от представленных выше — в нем можно посмотреть как вставить текст из ячеек в определенные(созданные заранее) закладки Word-а. Это удобно для создания бланков в Word и заполнения их через Excel
Скачать пример:

Tips_Macro_OpenWord.xls (49,5 KiB, 4 453 скачиваний)

Статья помогла? Поделись ссылкой с друзьями!

Ссылка на основную публикацию
ВсеИнструменты
Adblock
detector
×
×