Интересное копирование....

Программирование на Visual Basic for Applications
sonata
Постоялец
Постоялец
 
Сообщения: 321
Зарегистрирован: 31.07.2002 (Ср) 13:18
Откуда: Russia

Интересное копирование....

Сообщение sonata » 19.05.2003 (Пн) 14:51

Есть 2 файла, причем информация для второго частично берется из первого,
и, как вы понимаете, там есть столбцы, которые совпадают,
но они жестко зафиксированы,т.е. мне приходится руками
тупо переносить информацию из одного файла в другой.
Хочется автоматизировать данный процесс, если известно следующее:
Данные второго файла(куда я должна заносить информацию из первого),
соответствуют данным из первого файла так:
F1=A1&" "&B1
B1=N1
K1=M1
G1=D1
Вопрос можно ли написать такую функцию или процедуру:
я выделяю строчку в первом файле, например Row(9),
нажимаю заветную кнопку , по которой он мне копирует необходимые данные,
потом тоже нажимаю кнопку в вставляю эти данные во второй файл,
туда, куда мне нужно...
Возможно ли такое осуществить?
Очень была бы признательна за советы....

SergeySV
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 124
Зарегистрирован: 17.04.2003 (Чт) 14:39
Откуда: Россия, Москва

Re: Интересное копирование....

Сообщение SergeySV » 19.05.2003 (Пн) 16:43

sonata писал(а):Есть 2 файла, причем информация для второго частично берется из первого,
и, как вы понимаете, там есть столбцы, которые совпадают,
но они жестко зафиксированы,т.е. мне приходится руками
тупо переносить информацию из одного файла в другой.
Хочется автоматизировать данный процесс, если известно следующее:
Данные второго файла(куда я должна заносить информацию из первого),
соответствуют данным из первого файла так:
F1=A1&" "&B1
B1=N1
K1=M1
G1=D1
Вопрос можно ли написать такую функцию или процедуру:
я выделяю строчку в первом файле, например Row(9),
нажимаю заветную кнопку , по которой он мне копирует необходимые данные,
потом тоже нажимаю кнопку в вставляю эти данные во второй файл,
туда, куда мне нужно...
Возможно ли такое осуществить?
Очень была бы признательна за советы....


А какие проблемы?
1. Скопировать строку активной ячейки (даже все строку выделять не надо, это макрос может за тебя сделать):
ActiveSheet.Rows(ActiveCell.Row).Copy

2. Вставить туда, где стоишь:
ActiveCell.EntireRow.Insert ' эту строку можно убрать, тогда поверх будет вставлять, а так смещая строки вниз.
ActiveSheet.Rows(ActiveCell.Row).Select
ActiveSheet.Paste

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

RayShade
Scarmarked
Scarmarked
Аватара пользователя
 
Сообщения: 5511
Зарегистрирован: 02.12.2002 (Пн) 17:11
Откуда: Russia, Saint-Petersburg

Сообщение RayShade » 19.05.2003 (Пн) 17:54

Хм, а что если сделать так:



Код: Выделить всё
sub CopyCells(srcfile as string, dstfile as string, srcsheet as string, dessheet as string, rownum as long)
set srcbook = workbooks.open (srcfile)
set dstbook = workbooks.open (dstfile)
set srcsheet = srcbook.sheets(srcsheet)
set dstsheet = dstbook.sheets(dessheet)

with dstsheet
.range("F" &rownum).value = srcscheet.range("A"&rownum).value & " " & srcscheet.range("B"&rownum).value
.range("B"&rownum).value = srcsheet.range("N"&rownum).value
.range("K"&rownum).value = srcsheet.range("M"&rownum).value
.range("G"&rownum).value = srcsheet.range("D"&rownum).value
end with
end sub



Ну в общем примерно такая идея :) Открывается две ексельные книги и на указанных листах в указанном ряду производятся нужные преобразования.
Пример:
Код: Выделить всё
CopyCells "c:\1.xls", "c:\2.xls","МойЛист", "МойНовыйЛист",9

sonata
Постоялец
Постоялец
 
Сообщения: 321
Зарегистрирован: 31.07.2002 (Ср) 13:18
Откуда: Russia

Сообщение sonata » 20.05.2003 (Вт) 11:34

Этот код вставить в файл 1.xls или 2.xls?
И как его вызвать, это же не функция, а процедура?
Очень прошу help me !!!

RayShade
Scarmarked
Scarmarked
Аватара пользователя
 
Сообщения: 5511
Зарегистрирован: 02.12.2002 (Пн) 17:11
Откуда: Russia, Saint-Petersburg

Сообщение RayShade » 20.05.2003 (Вт) 11:49

Вставлять без разницы куда.

Вызвать:

Код: Выделить всё
sub MyCopy()
st = inputbox("Введите имя исходного файла:")
st1= inputbox("Введите имя получаемого файлa:")
st2 = inputbox("Введите имя исходного листа:")
st3= inputbox("Введите имя получаемого листа:")

rw= inputbox("Введите номер строки:")

if len(st)>0 and len(st1)> 0 then
copycells st,st1,st2,st3,rw
end if
end sub




И потом ALT+F8 и выбрать MyCopy

Rainbow
Человек-радуга
Человек-радуга
 
Сообщения: 543
Зарегистрирован: 13.05.2003 (Вт) 14:16

Сообщение Rainbow » 20.05.2003 (Вт) 13:02

Есть еще один симпатичный способ автоматизации.
В первом файле пишем макрос:

Код: Выделить всё
Sub CallMacro()
    Dim wb As Workbook
    Set wb = GetObject("<здесь путь ко второму файлу>")
   
    Dim r As Range
    Set r = ActiveSheet.Rows(ActiveCell.Row)
    wb.Application.Run "test2.xls!Module1.MyMacro", r
End Sub


Во втором файле (у меня он называется test2.xls) в Module1 добавляем процедурку с параметром типа Range:

Код: Выделить всё
Public Sub MyMacro(rngRow As Range)

а здесь забираем из rngRow значения, преобразуем их, как надо, и пихаем в нужную строчку (например, теущую в данном документе)...

End Sub


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

По-моему, красиво! :D

sonata
Постоялец
Постоялец
 
Сообщения: 321
Зарегистрирован: 31.07.2002 (Ср) 13:18
Откуда: Russia

Сообщение sonata » 20.05.2003 (Вт) 13:11

Спасибо за ответ,
Но, неужели нельзя обойтись без указания имени листа, а использовать текущий лист и в том и другом случае, и как тогда изменить код?
RayShade, очень была бы признательна за ответ...

sonata
Постоялец
Постоялец
 
Сообщения: 321
Зарегистрирован: 31.07.2002 (Ср) 13:18
Откуда: Russia

Сообщение sonata » 20.05.2003 (Вт) 14:20

Rainbow : Интересное решение...,
А какой примерно код во второй процедуре?
Очень прошу подскажите, плиз!

sonata
Постоялец
Постоялец
 
Сообщения: 321
Зарегистрирован: 31.07.2002 (Ср) 13:18
Откуда: Russia

Сообщение sonata » 20.05.2003 (Вт) 14:20

Вот здесь, что внутри?

Public Sub MyMacro(rngRow As Range)

а здесь забираем из rngRow значения, преобразуем их, как надо, и пихаем в нужную строчку (например, теущую в данном документе)...

End Sub

sonata
Постоялец
Постоялец
 
Сообщения: 321
Зарегистрирован: 31.07.2002 (Ср) 13:18
Откуда: Russia

Сообщение sonata » 20.05.2003 (Вт) 14:22

И если эти файлы лежат в одной папек, то путь одинаковый?

Sub CallMacro()
Dim wb As Workbook
Set wb = GetObject("test2.xls")

Dim r As Range
Set r = ActiveSheet.Rows(ActiveCell.Row)
wb.Application.Run "test2.xls!Module1.MyMacro", r
End Sub

sonata
Постоялец
Постоялец
 
Сообщения: 321
Зарегистрирован: 31.07.2002 (Ср) 13:18
Откуда: Russia

Re: Интересное копирование....

Сообщение sonata » 20.05.2003 (Вт) 15:08

SergeySV писал(а):
sonata писал(а):А какие проблемы?
1. Скопировать строку активной ячейки (даже все строку выделять не надо, это макрос может за тебя сделать):
ActiveSheet.Rows(ActiveCell.Row).Copy

2. Вставить туда, где стоишь:
ActiveCell.EntireRow.Insert ' эту строку можно убрать, тогда поверх будет вставлять, а так смещая строки вниз.
ActiveSheet.Rows(ActiveCell.Row).Select
ActiveSheet.Paste

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

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


SergeySV
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 124
Зарегистрирован: 17.04.2003 (Чт) 14:39
Откуда: Россия, Москва

Re: Интересное копирование....

Сообщение SergeySV » 21.05.2003 (Ср) 9:15

sonata писал(а):Просто значения нужно копировать тогда как массив...
Я не совсем поняла как решить мою проблему...



Можно конечно брать каждое значение из ячейки для того чтобы изменять его при копирование на другой лист/файл. Очень элегантно это изобразил модератор в примерах выше (красиво, не знал что можно range'ы так приравнивать).

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

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


Вернуться в VBA

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 13

    TopList