Excel макрос запись в другой файл

 

Добрый день!
Прошу подсказать, как можно при помощи макроса вставить данные с одного файла в другой файл, при этом не открывая другой файл.
В файле Book1 есть данные которые будут меняться. Как сделать так чтобы в файл Book2 они вставлялись подряд (вниз каждый раз — ниже и ниже) и при этом только те, где в файле Book1 в столбце Date есть данные.

Прикрепленные файлы

  • Book2.xlsx (8.08 КБ)
  • Book1.xlsx (9.56 КБ)

 

Hugo

Пользователь

Сообщений: 23249
Регистрация: 22.12.2012

Практически никак. Теоретически делали на ADO, но там всякие ограничения, я не особо разбираюсь…
А вот если можно всёж открывать, тогда… Но ведь нельзя! :)
P.S. Хотя думаю что ADO тоже открывает файл, только совсем незаметно.

Изменено: Hugo22.03.2017 17:54:30

 

Мотя

Пользователь

Сообщений: 3218
Регистрация: 25.12.2012

В связи с чем такие требования к файлу Book2?

 

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

 

Wanschh

Пользователь

Сообщений: 231
Регистрация: 10.01.2017

Уважаемый The_Priest  в другой, но похожей теме рекомендовал ознакомиться:

с этим

Возможно, это Ваш случай.

 

Hugo

Пользователь

Сообщений: 23249
Регистрация: 22.12.2012

Так там  — ПОЛУЧИТЬ. А тут — ПОЛОЖИТЬ!

 

Мотя

Пользователь

Сообщений: 3218
Регистрация: 25.12.2012

Сделайте Book2 транзитным файлом. В своем личном файле делайте обновления из транзитного файла.

 

Колеги, можите пожалуйста продемонстрировать это на моем примере? Не совсем понимаю значения «транзитный файл». И как делать эти обновления. Спасибо.

 

Hugo

Пользователь

Сообщений: 23249
Регистрация: 22.12.2012

Вообще формулы можно спрятать защитой листа. Другое дело насколько эта защита надёжна…

 

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

 

kuklp

Пользователь

Сообщений: 14868
Регистрация: 21.12.2012

E-mail и реквизиты в профиле.

Ни вставить, ни прочитать ничего не открывая файл невозможно. Ни через какие АДО. Разве что силой мысли :D

Я сам — дурнее всякого примера! …

 

То есть по факту выход только тот чтобы делать все в одном файле?

 

PowerBoy

Пользователь

Сообщений: 141
Регистрация: 13.01.2014

#13

23.03.2017 11:44:02

Цитата
kuklp написал:
Ни вставить, ни прочитать ничего не открывая файл невозможно

ТС имеет ввиду не открывая файл в экселе. Через ADO он спокойно считает всю информацию,не открывая его в экселе.

Excel + SQL = Activetables

 

Мотя

Пользователь

Сообщений: 3218
Регистрация: 25.12.2012

#14

23.03.2017 11:45:19

Цитата
AlexBosenko написал:
Не совсем понимаю значения «транзитный файл».

Транзитный пассажир (трансферный пассажир) — пассажир любого типа транспорта, который находится в определенной точке временно, с целью того, чтобы продолжить свой путь дальше через какой-то промежуток времени. ;)

 

PowerBoy

Пользователь

Сообщений: 141
Регистрация: 13.01.2014

#15

23.03.2017 12:12:15

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

Код
Public Sub RefreshData()
'Created using add-in ActiveTables
Dim strConnection As String
Dim strSQL As String
strConnection = IIf(Val(Application.Version) < 12, "OLEDB;Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Replace(ThisWorkbook.FullName, "Book2.xlsm", "Book1.xlsx") & ";Extended Properties='Excel 8.0;HDR=YES;IMEX=3';", "OLEDB;Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & Replace(ThisWorkbook.FullName, "Book2.xlsm", "Book1.xlsx") & ";Extended Properties='Excel 12.0;HDR=YES;IMEX=3';")
strSQL = "SELECT   Date,  Jan,  Feb,  Mar,  Apr,  May,  Jun,  Jul,  Aug,  Sep,  Oct,  Nov,  Dec  FROM   [Аркуш1$]"
With ThisWorkbook.ActiveSheet
    .UsedRange.Clear
    With .QueryTables.Add(strConnection, .Range("A1"), strSQL)
         .Refresh False
         .Delete
    End With
End With
End Sub

Изменено: PowerBoy23.03.2017 12:19:48

Excel + SQL = Activetables

 

kuklp

Пользователь

Сообщений: 14868
Регистрация: 21.12.2012

E-mail и реквизиты в профиле.

#16

23.03.2017 12:40:28

Цитата
PowerBoy написал:
ТС имеет ввиду не открывая файл в экселе

похвально, что Вы умеете читать мысли ТС  ;)

Цитата
AlexBosenko написал:
вставить данные с одного файла в другой файл, при этом не открывая другой файл.

Лично я понял это так, что первый файл уже открыт. И для меня сомнительно преимущество привлечения сторонней библиотеки(OLEDB), при этом же все равно файл 2 нужно открыть. Почему просто не открыть второй файл макросом из первого, запузырить туда все что надо, сохранить и закрыть его, скрывая все эти действа с экрана? И примеров такому на форуме несть числа.
А SQL-запросы есть смысл применять только на ОЧЕНЬ больших объемах данных. Ну или если язык SQL родней и привычней Васика :D

Я сам — дурнее всякого примера! …

 

Все равно работает только когда Book2 открыта.

И как написать чтобы эти данные падали в нужные ячейки и каждый раз когда задействовался макрос данные в Book2 накапливались а не заменялись?

 

AlexBosenko

Пользователь

Сообщений: 195
Регистрация: 02.09.2016

#18

23.03.2017 13:24:53

Вот пишу такой код. Но данные вставляются в виду ошибке. В чем может быть причина?

Код
Sub Get_Value_From_Close_Book()
    Dim sShName As String, sAddress As String, vData
    Application.ScreenUpdating = False
    Workbooks.Open "W:Business AnalysisPaymentPR projectTestBook2.xlsm" '"
    sAddress = "A1:M100"
       vData = Sheets("Sheet2").Range(sAddress).Value
    ActiveWorkbook.Close False
     If IsArray(vData) Then
        [B1:M100].Resize(UBound(vData, 1), UBound(vData, 2)).Value = vData
    Else
        [B1:M100] = vData
    End If
     Application.ScreenUpdating = True
End Sub
 

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

Программисты — это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!

 

Игор, спасибо. Но как это сделать при «на кодах»? Логику эту я понимаю, и как раз о такой логике я писал сначала. Но вот в кодах (макросах) слабоват.
Прошу отобразить, если есть возможность, на примере. Спасибо.

 

Колеги, окей. Подскажите пожалуйста следующее:
Во вложении файл. На первом листе данные, которые предпологается что будут меняться каждый раз.
Как сделать так, чтобы с первого листа эти данные копировались на второй лист как значения и чтобы эти скопированные данные на Листе2 вставлялись по накоплению?
При этом копировать нужно только те строчки, где в столбце Date стоит дата.
Спасибо.

Прикрепленные файлы

  • Book1.xlsm (16.75 КБ)

Изменено: AlexBosenko23.03.2017 14:16:39

 

Ігор Гончаренко

Пользователь

Сообщений: 13746
Регистрация: 01.01.1970

#22

23.03.2017 14:07:11

однако…
читаем #1:

Цитата
как можно при помощи макроса вставить данные с одного файла в другой файл, при этом не открывая другой файл

смотрим #18
судя по названию процедуры Sub Get_Value_From_Close_Book() и по тому, что в ней написано, Вы открываете файл и пытаетесь (именно пытаетесь, потому что попытка неудачна) прочитать значения из диапазона А1:М100 листа Sheet2 и тут же закрываете этот файл.
так вот
1. вот это
Sheets(«Sheet2»).Range(sAddress).Value
— это обращение к указанному диапазону указанного листа, но в КНИГЕ, В КОТОРОЙ НАПИСАН МАКРОС, а не в той, что вы открыли двумя строками выше.
если в книге с этим макросом нет листа с именем «Sheet2» — вот тут все и рухнет, а даже если есть, то Вы взяли значение не из только что открытой книги, а из той, в которой лежит приведенный Вами макрос.
2. возвращаясь к тому что написано в #1: так Вам нужно ВЗЯТЬ данные из другой книги или ПОЛОЖИТЬ данные в другую книгу? или Вы решили выяснить кто тут самый смышленый на «планете» и по Вашим ребусам сможет слепить нужный код

Программисты — это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!

 

Hugo

Пользователь

Сообщений: 23249
Регистрация: 22.12.2012

#23

23.03.2017 14:11:01

Цитата
Ігор Гончаренко написал:
но в КНИГЕ, В КОТОРОЙ НАПИСАН МАКРОС, а не в той,

— это смотря где лежит код, может быть и так, а может и иначе. А где код — это мне неизвестно…

 

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

Прикрепленные файлы

  • Book1.xlsm (16.75 КБ)

Изменено: AlexBosenko23.03.2017 14:18:12

 

извините, «загнался»
Sheets(«Sheet2»).Range(sAddress).Value — обратится к листу «Sheet2» активной в данный момент книги, а активна та, что Вы только что открыли
но вопрос что за задачу Вы решаете остается открытым.

Программисты — это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!

 

Hugo

Пользователь

Сообщений: 23249
Регистрация: 22.12.2012

#26

23.03.2017 14:29:09

Цитата
Ігор Гончаренко написал:
активной в данный момент книги

если код в стандартном модуле. А если в модуле книги, как некоторые любят? :)
Файл видеть не могу пока…

 

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

Прикрепленные файлы

  • Book1.xlsm (16.75 КБ)

 

осталось выяснить в чем суть задачи

Программисты — это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!

 

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

Прикрепленные файлы

  • Book1.xlsm (21.79 КБ)

Программисты — это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!

 

AlexBosenko

Пользователь

Сообщений: 195
Регистрация: 02.09.2016

#30

23.03.2017 16:39:02

Игор, спасибо большое. Но как сделать: Чтобы копиросалось не все, а только те строчки где есть дата (то есть в столбце Date)?
И как сделать, чтобы каждый раз нажимая кнопку, в Листе2 данные заполнялись вниз и вниз, а не просто заменялись?

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

Sub Название_Макроса()

'Выделить диапазон который необходимо скопировать
Range("A1:F52").Select
'Скопировать то, что выделено
Selection.Copy
ChDir "путь к папке где лежит файл в который необходимо скопировать"
Workbooks.Open Filename:= "Название файла, который находится в папке, путь к которой указан выше"
'Выделить начальную ячейку в которую необходимо вставить скопированные данные
Range("A6").Select
'Вставить данные
ActiveSheet.Paste
'сохранить текущую книгу
ActiveWorkbook.Save
'Закрыть книгу
ActiveWorkbook.Close
End Sub

Вариант 2: В открывшейся книге запускаем макрос, чтобы он открыл нужную нам книгу, скопировал от туда нужные нам данные и вставил в нашу открытую книгу, закрыв файл из которого эти данные были скопированы

Sub Название_Макроса2()
'Открываем файл с которого нужно скопировать данные
Workbooks.Open Filename:="C:Данные.xlsx"

'Скопировать нужный диапазон в открывшейся книге на листе 1
Workbooks("Данные.xlsx").Worksheets("Лист1").Range("A16:E16").Copy
'Активируем нужную нам книгу
Workbooks("Книга1.xlsm").Activate

'Выделяем и вставляем скопированные данные в ячейку А1
ActiveWorkbook.Worksheets("Лист1").Range("A1").Select
ActiveSheet.Paste

'Закрываем книгу откуда мы скопировали данные
Workbooks("Данные.xlsx").Close

End Sub

Еще пример — Скопировать диапазоны данных из активной открытой книги Excel нескольких листов (в нашем примере 3-х листов) в другую книгу, которая хранится в определенном месте. Данные будут вставлены как значения, плюс будут перенесены форматы ячеек.

Sub Копируем_листы_в_другую_книгу()
Dim bookconst As Workbook
Dim abook As Workbook
Set abook = ActiveWorkbook 'присваиваем перменную активной книге
Set bookconst = Workbooks.Open("C:UsersUserDesktop1.xlsx") 'присваиваем перменную книге куда необходимо копировать данные

'переходим в активную книгу откуда необходимо скопировать данные
abook.Worksheets("Лист1").Activate
Range("A1:I23").Copy 'копируем определенный диапазон листа, укажите свой диапазон
bookconst.Worksheets("Лист1").Activate 'активируем лист куда необходимо вставить данные
Range("A1:I23").Select 'встаем на ячейку А1
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
'вставляем только форматы ячеек
Selection.PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, _
SkipBlanks:=False, Transpose:=False
'второй лист
abook.Worksheets("Лист2").Activate
Range("A1:I23").Copy
bookconst.Worksheets("Лист2").Activate
Range("A1:I23").Select 'выделяем диапазон
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
'вставляем только форматы ячеек
Selection.PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, _
SkipBlanks:=False, Transpose:=False
'третий лист
abook.Worksheets("Лист3").Activate
Range("A1:I23").Copy
bookconst.Worksheets("Лист3").Activate
Range("A1:I23").Select 'выделяем диапазон
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
'вставляем только форматы ячеек
Selection.PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, _
SkipBlanks:=False, Transpose:=False
'сохранить текущую книгу
bookconst.Save
'Закрыть книгу
bookconst.Close
abook.Activate

End Sub

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

Спасибо за внимание.

Kassia

4 / 1 / 0

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

Сообщений: 108

1

10.02.2015, 15:58. Показов 24312. Ответов 23

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


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

Добрый день! Знаю тут много тем про копирование данных. Но я так и не нашла по теме. Вобщем мне надо из разных файлов собрть ин6формацию в один.
Я сделала это так:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
iPath = ActiveWorkbook.Path
Workbooks.Open Filename:=iPath + "Иркутская.xlsx"
Workbooks("Иркутская.xlsx").Worksheets("Таблица1").Range("C331").Copy
Workbooks("Общая.xlsm").Activate
ActiveWorkbook.Worksheets("Лист1").Range("D3").Select
ActiveSheet.Paste
Workbooks("Иркутская.xlsx").Close
 
iPath = ActiveWorkbook.Path
Workbooks.Open Filename:=iPath + "Иркутская.xlsx"
Workbooks("Иркутская.xlsx").Worksheets("Таблица1").Range("C332").Copy
Workbooks("Общая.xlsm").Activate
ActiveWorkbook.Worksheets("Лист1").Range("E3").Select
ActiveSheet.Paste
Workbooks("Иркутская.xlsx").Close
 
iPath = ActiveWorkbook.Path
Workbooks.Open Filename:=iPath + "Иркутская.xlsx"
Workbooks("Иркутская.xlsx").Worksheets("Таблица1").Range("C333").Copy
Workbooks("Общая.xlsm").Activate
ActiveWorkbook.Worksheets("Лист1").Range("F3").Select
ActiveSheet.Paste
Workbooks("Иркутская.xlsx").Close

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



0



Казанский

15136 / 6410 / 1730

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

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

10.02.2015, 16:50

2

Цитата
Сообщение от Kassia
Посмотреть сообщение

Вобщем каждый раз открываю и закрываю файл чтобы вытащить значение одной ячейки

Интересно, а когда Вы вручную копируете ячейки из одного файла в другой, Вы тоже каждый раз файл закрываете? Ну хотя бы так:

Visual Basic
1
2
3
4
5
6
7
8
9
iPath = ActiveWorkbook.Path
Workbooks.Open Filename:=iPath + "Иркутская.xlsx"
Workbooks("Иркутская.xlsx").Worksheets("Таблица1").Range("C331").Copy _
    Workbooks("Общая.xlsm").Worksheets("Лист1").Range("D3")
Workbooks("Иркутская.xlsx").Worksheets("Таблица1").Range("C332").Copy _
    Workbooks("Общая.xlsm").Worksheets("Лист1").Range("E3")
Workbooks("Иркутская.xlsx").Worksheets("Таблица1").Range("C333").Copy _
    Workbooks("Общая.xlsm").Worksheets("Лист1").Range("F3")
Workbooks("Иркутская.xlsx").Close



1



Hugo121

6875 / 2807 / 533

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

Сообщений: 8,562

10.02.2015, 17:39

3

Если нужны только данные без попугаев/форматов, то думаю сработает так:

Visual Basic
1
2
3
4
5
6
    Dim wb As Object, a()
    iPath = ActiveWorkbook.Path
    Set wb = Workbooks.Open(iPath & "Иркутская.xlsx")
    a = wb.Worksheets("Таблица1").Range("C331:C333").Value
    wb.Close 0
    Workbooks("Общая.xlsm").Worksheets("Лист1").Range("D3:F3").Value = Application.Transpose(a)



1



4 / 1 / 0

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

Сообщений: 108

10.02.2015, 19:03

 [ТС]

4

Нет так я не могу D3:F3 вставить потому что там значения вставлять нужно через одну ячейку. Но спасибо за поомщь)
А вот еще вопрос как мне отобрать эти значения по поиску. то есть если допустим я не знаю конкретной ячейки или они меняются. но знаю код продукта?

код продукта (столбец С) количество (столбец В)
3408 56
4590 59
3470 5768
4546 5675
4654 9898
4456 232

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

if kod = 3408 then … ?



0



6875 / 2807 / 533

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

Сообщений: 8,562

10.02.2015, 20:21

5

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



0



chumich

2079 / 1232 / 464

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

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

10.02.2015, 20:42

6

Цитата
Сообщение от Kassia
Посмотреть сообщение

вот как мне так записать : найди код такой то и вытащи значение из столбца В и вставь это значение в

Visual Basic
1
2
3
For i = 1 To ThisWorkbook.ActiveSheet.Cells.Find(What:="*", SearchDirection:=xlPrevious, SearchOrder:=xlByRows).Row
If Cells (i,3) = "ваше значение" Then "место куда надо вставить" = Cells (i,2)
Next i



0



4 / 1 / 0

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

Сообщений: 108

11.02.2015, 16:36

 [ТС]

7

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



0



6875 / 2807 / 533

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

Сообщений: 8,562

11.02.2015, 17:35

8

Поясните каким образом «ячейки могут меняться» — потому что есть несколько вариантов действий, но думаю проще всего использовать ВПР() (можно в макросе).
Но в любом случае важно знать как они могут меняться — чтоб найти с гарантией и чтоб не городить лишнего.



0



4 / 1 / 0

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

Сообщений: 108

11.02.2015, 19:33

 [ТС]

9

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



0



6875 / 2807 / 533

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

Сообщений: 8,562

11.02.2015, 22:11

10

Так как раз ВПР и пойдёт.



0



6875 / 2807 / 533

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

Сообщений: 8,562

11.02.2015, 22:21

11

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

Ну а если коды известны — то конечно нужно искать по коду, чтоб например не спутать газовое топливо с газировкой Хотя вместо *газ* можно писать *газ*топливо*

Вложения

Тип файла: xlsx 1.xlsx (12.7 Кб, 37 просмотров)



0



4 / 1 / 0

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

Сообщений: 108

12.02.2015, 18:33

 [ТС]

12

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



0



6875 / 2807 / 533

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

Сообщений: 8,562

12.02.2015, 18:59

13

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



0



Alexander_LA

0 / 0 / 0

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

Сообщений: 8

04.08.2015, 10:32

14

Помогите пожалуйста найти ошибку:

Код открывает выбранный пользователем файл и копирует данные из него в заданное место. Но работало-работало и вдруг перестало, не могу понять в чем дело. Выдает то out of range, то error 1004.

P.S. Таких кнопок считывающих данные с других файлов 4, вставляют на 4 разных листа.

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
Sub Кнопка2_Щелчок() ' Загрузка предварительной заявки 
    MainName = ActiveWorkbook.Name
    If Cells(3, 3) <> Empty Then
    MsgBox "Очистите поле"
    Exit Sub
    Else
adres_svod_zayavka_rb = GetFilePath("Выберите файл Предварительной заявки", , "Документы Excel", "*.xlsx, *.xls") ' запрашиваем имя файла
    If adres_svod_zayavka_rb = "" Then Exit Sub    ' выход, если пользователь отказался от выбора файла
    Workbooks.Open Filename:=adres_svod_zayavka_rb
    Filename = ActiveWorkbook.Name
    Workbooks(Filename).Worksheets("Лист1").Range("A1:LA200").Copy
    With Workbooks(MainName)
        .Activate
        .Worksheets("Заявка РБ").Range("С2:LC201").PasteSpecial Paste:=xlPasteValues
    End With
    Application.CutCopyMode = False
    Workbooks(Filename).Close SaveChanges = False
    Cells(2, 2).Select
    End If
End Sub
 
Function GetFilePath(Optional ByVal Title As String = "Выберите файл для загрузки", _
                     Optional ByVal InitialPath As String = "c:", _
                     Optional ByVal FilterDescription As String = "Книги Excel", _
                     Optional ByVal FilterExtention As String = "*.xls*") As String
    ' функция выводит диалоговое окно выбора файла с заголовком Title,
    ' начиная обзор диска с папки InitialPath
    ' возвращает полный путь к выбранному файлу, или пустую строку в случае отказа от выбора
    ' для фильтра можно указать описание и расширение выбираемых файлов
    On Error Resume Next
    With Application.FileDialog(msoFileDialogOpen)
        .ButtonName = "Выбрать": .Title = Title: .InitialFileName = InitialPath
        .Filters.Clear: .Filters.Add FilterDescription, FilterExtention
        If .Show <> -1 Then Exit Function
        GetFilePath = .SelectedItems(1): PS = Application.PathSeparator
    End With
End Function



0



6875 / 2807 / 533

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

Сообщений: 8,562

04.08.2015, 11:00

15

1. А нет ли MISSING в референсах ВБА?
2. Я бы не использовал переменную Filename
3. Код можно чуть подправить, избавиться от селектов, активаций и даже копи.



0



0 / 0 / 0

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

Сообщений: 8

04.08.2015, 11:01

16

Цитата
Сообщение от Hugo121
Посмотреть сообщение

MISSING в референсах

простите, а что это?

Цитата
Сообщение от Hugo121
Посмотреть сообщение

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

как?



0



Hugo121

6875 / 2807 / 533

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

Сообщений: 8,562

04.08.2015, 11:09

17

Вроде где-то так (не проверял ессно…)

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Sub Кнопка2_Щелчок() ' Загрузка предварительной заявки
Dim wb As Object, a()
    If Cells(3, 3) <> Empty Then
    MsgBox "Очистите поле"
    Exit Sub
    Else
    adres_svod_zayavka_rb = GetFilePath("Выберите файл Предварительной заявки", , "Документы Excel", "*.xlsx, *.xls") ' запрашиваем имя файла
    If adres_svod_zayavka_rb = "" Then Exit Sub    ' выход, если пользователь отказался от выбора файла
    Set wb = Workbooks.Open(adres_svod_zayavka_rb)
    a = wb.Worksheets("Лист1").Range("A1:LA200").Value
    wb.Close 0
    Worksheets("Заявка РБ").Range("С2").Resize(UBound(a), UBound(a, 2)).Value = a
    End If
End Sub

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

Цитата
Сообщение от Alexander_LA
Посмотреть сообщение

простите, а что это?

В редакторе VBA идёте Tools->References и смотрите — если есть, то снимаете галки или устанавливаете компоненты.



0



0 / 0 / 0

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

Сообщений: 8

04.08.2015, 11:28

18

С одним файлом сработало, а второй — снова выдал out of range.



0



6875 / 2807 / 533

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

Сообщений: 8,562

04.08.2015, 11:31

19

Подозреваю что не те файлы открываете… *.xls нужно исключить, не уследил, виноват…



0



0 / 0 / 0

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

Сообщений: 8

04.08.2015, 11:44

20

Цитата
Сообщение от Hugo121
Посмотреть сообщение

*.xls нужно исключить, не уследил, виноват…

Да вроде уже открывает и *.xls. Чего с ним могут быть проблемы?

По моему помогло! Спасибо большое!

А может еще подскажете как втянуть строки из txt файла по этому же принципу?



0



IT_Exp

Эксперт

87844 / 49110 / 22898

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

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

04.08.2015, 11:44

20

Excel для Microsoft 365 Excel для Microsoft 365 для Mac Excel 2021 Excel 2021 для Mac Excel 2019 Excel 2019 для Mac Excel 2016 Excel 2016 для Mac Excel 2013 Excel 2010 Excel 2007 Еще…Меньше

Если книга содержит макрос Visual Basic для приложений(VBA),который вы хотите использовать в другом месте, вы можете скопировать модуль, содержащий этот макрос, в другую открытую книгу с помощью редактора Visual Basic(VBE).

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

  • Чтобы Windows, перейдите в меню Параметры > >Настроить ленту.

  • Для Macперейдите на Excel > параметры… >ленты & панели инструментов.

  • Затем в разделе Настройка ленты в разделе Основные вкладкиубедитесь в том, что в разделе Разработчик.

Общие сведения о макросах и VBA

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

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

  • Макрос можно записать с помощью команды Запись макроса на вкладке Разработчик.

  • Макрос записуется на языке программирования VBA.

  • Вы можете проверить и изменить макрос в редакторе Visual Basic, которое открывается Excel. Вот пример окна VBE для Windows:

    Модуль, содержащий два макроса, которые хранятся в Модуле1 в Книге1

Макрос с именами MakeCellGreen и SetRowHeight находится в модуле Module1,который хранится в книге Book1.

Копирование модуля из одной книги в другую

  1. Откройте книгу, содержаную макрос, который вы хотите скопировать, и книгу, в которую вы хотите его скопировать.

  2. На вкладке Разработчик щелкните Visual Basic, чтобы открыть редактор Visual Basic редактора.

  3. В редакторе Visual Basic меню Вид выберите Project проводник Изображение кнопкиили нажмите CTRL+R .

  4. В области Project проводника перетащите модуль, содержащий макрос, который нужно скопировать в 9-ю книгу. В этом случае мы копируете Module1 из Book2.xlsm в Book1.xlsm.
     

    Окно проекта VBA

  1. Модуль1, скопирован из Book2.xlsm

  2. Копия модуля1, скопированная в Book1.xlsm

Дополнительные сведения

Вы всегда можете задать вопрос специалисту Excel Tech Community или попросить помощи в сообществе Answers community.

Нужна дополнительная помощь?

Макрос для переноса данных из одного файла в другой

Omeg

Дата: Четверг, 17.01.2013, 16:37 |
Сообщение № 1

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

Ранг: Прохожий

Сообщений: 6


Репутация:

0

±

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


Помогите пожалуйста.
Очень нужен макрос, но нет опыта в написании. Автоматическим макросом не получается выполнить все требования.
Суть в чем: есть два файла – форма 1 и форма 2 (общий список) Необходимо данные из файла №1 перенести в общий список (Форма 2). Файл 1 всегда стандартный, меняется только данные.
Алгоритм такой: Сначала копируется в форму 2 номер исполнительного листа, если он уже есть в списке, то находит эту строку и меняет ее, если нет в списке – с новой строки создает запись. Далее в эту строку подтягивает все остальные данные с формы 1 (ФИО, основной долг, удержания….все по таблице). В конце строки вставляет текущую дату.
Не могу понять как это все сотворить, помогите у кого есть возможность и знания

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

_1.xlsx
(10.7 Kb)
·

_2—.xlsx
(35.6 Kb)

Сообщение отредактировал PelenaЧетверг, 17.01.2013, 16:51

 

Ответить

GWolf

Дата: Четверг, 17.01.2013, 18:03 |
Сообщение № 2

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

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

Сообщений: 34


Репутация:

3

±

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


Добрый вечер, уважаемый Omeg!

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


Путей к вершине множество. Этот один из многих…

 

Ответить

Omeg

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

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

Ранг: Прохожий

Сообщений: 6


Репутация:

0

±

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


Добрый вечер, уважаемый GWolf!
Пометил строки, количество которых может изменяться. Если это сильно осложняет положение, можно количество полей оставить в таком виде)
Спасибо что откликнулись, два дня сижу с книгой по VBA, но опыта нет, до этого не приходилась делать такие задачи. Очень трудно сразу сообразить что к чему((

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

0058050.xlsx
(10.8 Kb)

 

Ответить

GWolf

Дата: Четверг, 17.01.2013, 19:56 |
Сообщение № 4

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

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

Сообщений: 34


Репутация:

3

±

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


Доброй ночи, уважаемый Omeg!

Пока ждал от Вас ответа, набросал макрос для неизменного количества строк в файле-источнике:

полагаю, что в виду того, что Вы

Цитата (Omeg)

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

мой труд не будет бесполезен. Для случая с изменяющимися координатами «Итого начислено» и «Итого удержано» код будет несколько другим. Если будете иметь немного терпения то я таки и его Вам напишу!
С уважением GWolf.

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

_1.xlsm
(32.1 Kb)
·

_2-.xlsm
(33.4 Kb)


Путей к вершине множество. Этот один из многих…

Сообщение отредактировал GWolfЧетверг, 17.01.2013, 20:01

 

Ответить

Omeg

Дата: Четверг, 17.01.2013, 20:07 |
Сообщение № 5

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

Ранг: Прохожий

Сообщений: 6


Репутация:

0

±

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


Спасибо Огромное!!!!! Вы меня очень выручили!!!! Я бы не справился точно!!!
Уважаемы GWolf, если у вас будет свободное время и желание, напишите пожалуйста еще для случая с изменяющимися координатами «Итого начислено» и «Итого удержано».
Я Вам крайне благодарен! Вы правда меня очень выручили))

 

Ответить

GWolf

Дата: Четверг, 17.01.2013, 20:34 |
Сообщение № 6

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

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

Сообщений: 34


Репутация:

3

±

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


Цитата (Omeg)

для случая с изменяющимися координатами «Итого начислено» и «Итого удержано»

на скрепке.
В файле:
— по зеленой кнопке — с неизменными координатами;
— по смайлику «Улыбка» — с изменяющимися координатами «Итого начислено» и «Итого удержано»

Успехов! Обращайтесь…
С уважением GWolf.

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

9311104.xlsm
(33.1 Kb)


Путей к вершине множество. Этот один из многих…

Сообщение отредактировал GWolfЧетверг, 17.01.2013, 20:39

 

Ответить

Omeg

Дата: Четверг, 17.01.2013, 21:38 |
Сообщение № 7

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

Ранг: Прохожий

Сообщений: 6


Репутация:

0

±

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


Спасибо огромное!

 

Ответить

Omeg

Дата: Пятница, 18.01.2013, 13:23 |
Сообщение № 8

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

Ранг: Прохожий

Сообщений: 6


Репутация:

0

±

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


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

 

Ответить

GWolf

Дата: Понедельник, 21.01.2013, 08:37 |
Сообщение № 9

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

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

Сообщений: 34


Репутация:

3

±

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


Доброго дня, уважаемый Omeg!

Вы писали:

Цитата (Omeg)

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

Посмотрел код, действительно это моя недоработка, за что приношу свои извинения. Старый вариант кода: [vba]

Код

Sub AddInFlOu_Щелкнуть()
       ‘Ответ на нажатие смайлика «Улыбка»
       Dim tPath As String
       Dim wbOp As Object
       Dim stroka As String
       Dim flag As Boolean
       Dim nR As Long, nREndFrm As Long

                 Dim P_familija As String, P_imja  As String, P_otcestwo  As String
       Dim P_NomIspList  As String
       Dim P_SumOsnDolg  As String, P_SumUderj  As String, P_SumPerecisl  As String

                 nREndFrm = 4
       Do
           nREndFrm = nREndFrm + 1
       Loop While .Cells(nREndFrm, 1).Text <> «Итого удержано»

                 If nREndFrm = 65000 Then MsgBox «Что-то с формой не так!?» & Chr(10) & _
                      «Не могу найти ячейку в первой колонке» & Chr(10) & _
                      «с фразой <Итого удержано>», vbInformation + vbOKOnly, «Нештатное завершение!»

[/vba]

В строке [vba]

Код

Loop While .Cells(nREndFrm, 1).Text <> «Итого удержано»

[/vba] точка, с которой начинается «фраза» указывает что у «фразы» есть начало. Обычно это конструкция With … End With. В данном случае я счел нецелесообразным применение такой конструкции, но «фразу» не поправил — поторопился. Т.о. строка кода должена выглядеть так:
[vba]

Код

Loop While ThisWorkbook.ActiveSheet.Cells(nREndFrm, 1).Text <> «Итого удержано»

[/vba]

В прилагаемом файле ошибка мною исправлена.


Путей к вершине множество. Этот один из многих…

Сообщение отредактировал GWolfПонедельник, 21.01.2013, 08:43

 

Ответить

Omeg

Дата: Понедельник, 21.01.2013, 09:26 |
Сообщение № 10

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

Ранг: Прохожий

Сообщений: 6


Репутация:

0

±

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


Все заработало идеально!! Спасибо огромное за помощь!!!!

 

Ответить

Муля2010

Дата: Понедельник, 21.01.2013, 16:49 |
Сообщение № 11

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

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

Сообщений: 290


Репутация:

12

±

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


Цитата (Omeg)

Все заработало идеально!! Спасибо огромное за помощь!!!!
Все заработало идеально!! Спасибо огромное за помощь!!!!Omeg

Доброго дня всем!
Omeg
Если это возможно, выложите пожалуйста свой работающий файл на форум. А то у меня во вновь созданую книгу (на чистый лист) одна строка копируется , но только одна строка ИТОГов. А вот меняю ФИО на другое, чтобы продолжить список, и не копирует. Копирует только, когда вручную удаляю предыдущую строку.
В то же время, если я правильно понял условия задачи, новые даные, то есть, новая строка с другими даными, должна добавляться в список (ниже предыдущей).
А вот у ваш шаблон, совсем ничего не копирует.

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

1686785.rar
(37.4 Kb)


С ув. Муля!

 

Ответить

DiRT_ms

Дата: Вторник, 22.01.2013, 12:43 |
Сообщение № 12

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

Ранг: Прохожий

Сообщений: 1


Репутация:

0

±

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


Здраствуйте! У меня схожая проблема с Omeg, только порядок действий не много другой. Есть форма отчетности (в ней меняется только кол-во строк max значение 80 строк) и сводная таблица этих форм. Суть проблемы в том что бы загрузить данные из закрытого файла формы отчетности в открытый файл сводной таблицы.
Здесь на форуме нашел внушительный список макросов, среди которых есть вот такие:

Я думаю что эти макросы должны участвовать в данной выгрузке, но как их правильно применить не хватает навыков sad

Если кому не трудно, прошу поставить на путь истинный в написании данной задачи)

К сообщению прилагаю файл отчетной формы и сводной формы. Заранее спасибо тем кто откликнется:)

[admin]DiRT_ms, оформляйте коды тегами![/admin]

Сообщение отредактировал DiRT_msСреда, 23.01.2013, 10:27

 

Ответить

GWolf

Дата: Четверг, 31.01.2013, 13:29 |
Сообщение № 13

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

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

Сообщений: 34


Репутация:

3

±

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


Добрый день!

Цитата (DiRT_ms)

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

Если немножичко погуглить интернет, то можно выяснить следующую особенность: Если нам нужно загрузить из ЗАКРЫТОЙ книги данные, то мы эту книгу должны таки ОТКРЫТЬ, только не руками, а программно! Ну а дальше все как всегда: идем по записям ищем то, что нам нужно и переносим туда куда нужно. После такой «прогулки» незабываем книгу-источник ЗАКРЫТЬ, опять же программно!

Вы можете спросить: — Почему нет кода? — Ответ прост! Код есть! Сообщение № 4. Если кто не понял — спрашивайте — отвечу.


Путей к вершине множество. Этот один из многих…

Сообщение отредактировал GWolfЧетверг, 31.01.2013, 13:33

 

Ответить

alya

Дата: Вторник, 16.04.2013, 20:48 |
Сообщение № 14

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

Ранг: Прохожий

Сообщений: 2


Репутация:

0

±

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


Добрый день! Прощу о помощи. не могу объединить макрос переноса данных из одного файла в другой с функцией ВПР.
есть два файла (книга 1 и книга 2 — названия всегда разные). В книгу 1 нужно перенести данные по обещанной цене из книги 2.
Помогите кому не трудно.

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

_1.xls
(52.5 Kb)

Сообщение отредактировал alyaВторник, 16.04.2013, 20:56

 

Ответить

alya

Дата: Вторник, 16.04.2013, 20:50 |
Сообщение № 15

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

Ранг: Прохожий

Сообщений: 2


Репутация:

0

±

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


книга 2

Сообщение отредактировал alyaВторник, 16.04.2013, 20:56

 

Ответить

nur91

Дата: Суббота, 24.05.2014, 20:37 |
Сообщение № 16

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

Ранг: Прохожий

Сообщений: 2


Репутация:

0

±

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


Excel 2010

Всем, доброй ночи!
У меня есть маленькая проблема в работе макроса.
Суть задания: из файла «по бригадам.xls» найти итоговые суммы по определенным строкам и записать в файл «форма.xls». Это я реализовала.
А теперь проблемка. Например: нужно найти строку «Компенсация отпуска». В файле «по бригадам.xls» в 01 бригаде 00 участок такой записи нет, и значит в файле «форма.xls» должно быть пусто. А макрос находит эту запись в другой бригаде(03 бригада 02 участок) и записывает в 01 бригаду 00 участок.
Не могу понять как это сотворить,помогите у кого есть возможность и знания.

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

4747620.rar
(48.7 Kb)

 

Ответить

Макрос переноса данных из одного файла в другой

Автор Alexandrin, 28.01.2011, 12:12

« назад — далее »

Добрый день всем! Нужна помощь.
Требуется, чтобы при нажатии кнопки в файле «Исходные данные», который может находиться в любом месте, выделенные желтым данные вставлялись в пустую строку, следующую после последней заполненной строки. Файл «Итоговый файл» находится в строго определенном месте, таблица в нем дополняется из файлов, аналогичных указанному выше. Место, откуда нужно вставить данные, указано в ячейках формулами. Ссылки скорее всего работать не будут, но можно сориентироваться по номерам ячеек.


Посмотрите у Сержа (который 007) на форуме. Он, вроде, в друзьях с этим форумом, поэтому, надеюсь, что ссылка не будет считаться нарушением правил.
Там в топике Макрос «Copy_ROWs_to_EXT_FILE» я выкладывал решение — макрос, который копирует строки выбранных ячеек во внешний файл Excel.

С уважением, Алексей



Цитата: Alex_ST от 28.01.2011, 16:01
Посмотрите у Сержа (который 007) на форуме. Он, вроде, в друзьях с этим форумом, поэтому, надеюсь, что ссылка не будет считаться нарушением правил.
Там в топике Макрос «Copy_ROWs_to_EXT_FILE» я выкладывал решение — макрос, который копирует строки выбранных ячеек во внешний файл Excel.

А возможно сделать что бы бралось из 2 файлов источников?


Вы, кажется, чего-то не совсем поняли…
Макрос Copy_ROWs_to_EXT_FILE заносится в стандартный модуль файла-источника.
Вот, я немного добавил комментариев в код для его понимабельности:

Sub Copy_ROWs_to_EXT_FILE()   ' скопировать строки выделенных ячеек во внешний файл-накопитель
    '---------------------------------------------------------------------------------------
    ' Procedure    : Copy_ROWs_to_EXT_FILE
    ' Author       : KuklP & Alex_ST
    ' Topic_HEADER : Макрос "Copy_ROWs_to_EXT_FILE"
    ' Topic_URL    : http://www.excelworld.ru/forum/3-176-2008-16-1293625247
    ' DateTime     : 29.12.10, 15:20
    ' Purpose      : скопировать строки выделенных ячеек во внешний файл-накопитель
    ' Notes        : после работы макроса файл-накопитель становится невидимым в обычных окнах Excel (как надстройка или Personal.xls)
    '---------------------------------------------------------------------------------------
        If Not TypeName(Selection) = "Range" Then Exit Sub
        Dim lr&, wb As Workbook, lb As Workbook
        With Application: .ScreenUpdating = False: .DisplayAlerts = False: .EnableEvents = False: End With
        Set wb = GetObject("c:test.xls")   ' здесь нужно прописать полный путь к файлу-накопителю
        Set lb = ThisWorkbook
        lr = wb.Sheets(1).Cells(Rows.Count, 1).End(xlUp).Row ' lr - номер последней не пустой строки файла-накопителя
        Selection.EntireRow.Copy wb.Sheets(1).Cells(lr + 1, 1) ' вставить выбранные в файле-источнике строки после последней не пустой строки в файл-накопитель
        wb.Close (True)   ' закрыть файл-накопитель с сохранением
        With Application: .EnableEvents = True: .DisplayAlerts = True: .ScreenUpdating = True: End With
        Set wb = Nothing: Set lb = Nothing
End Sub

В файле-накопителе всего лишь в модуле книги прописывается обработка события Private Sub

Workbook_Open()
        If Me.Parent.Caption = Application.Caption Then Windows(Me.Name).Visible = True
End Sub

При этом число файлов-источников ничем не ограничено. Можно и два, и три, и четыре…

С уважением, Алексей


Цитата: Alex_ST от 28.01.2011, 16:01
…надеюсь, что ссылка не будет считаться нарушением правил.

Нет, Алекс, не будет ;)
Если ссылка по теме — то на любом нормальном форуме это не будет нарушением правил.


Цитата: Serge 007 от 28.01.2011, 22:44
Если ссылка по теме — то на любом нормальном форуме это не будет нарушением правил.

Ну, про все форумы это ты зря…
Например, на форуме про iPod’ы на iworld-club на меня модератор гневаться изволил, когда я там в конце ответа на вопрос одного из новичков посоветовал поподробнее посмотреть топик на форуме ipoding
При этом ни один из этих форумов я бы не отнёс к ненормальным. Оба очень толковые.

С уважением, Алексей


Цитата: Alex_ST от 29.01.2011, 23:27
…ни один из этих форумов я бы не отнёс к ненормальным. Оба очень толковые.

Толковый и нормальный — это разные понятия.
В рунете есть сайт киберфорум (я там тоже модератор). Очень толковый. Уровень постоянных участников минимум не ниже планетарного. Но ненормальный. Ссылки на другие форумы запрещены ВООБЩЕ. Почему — не знаю. Таково желание админа. Приходится ему подчиняться.


Цитата: Alex_ST от 28.01.2011, 20:51
Вы, кажется, чего-то не совсем поняли…
Макрос Copy_ROWs_to_EXT_FILE заносится в стандартный модуль файла-источника.
Вот, я немного добавил комментариев в код для его понимабельности:
Sub Copy_ROWs_to_EXT_FILE()   ' скопировать строки выделенных ячеек во внешний файл-накопитель
    '---------------------------------------------------------------------------------------
    ' Procedure    : Copy_ROWs_to_EXT_FILE
    ' Author       : KuklP & Alex_ST
    ' Topic_HEADER : Макрос "Copy_ROWs_to_EXT_FILE"
    ' Topic_URL    : http://www.excelworld.ru/forum/3-176-2008-16-1293625247
    ' DateTime     : 29.12.10, 15:20
    ' Purpose      : скопировать строки выделенных ячеек во внешний файл-накопитель
    ' Notes        : после работы макроса файл-накопитель становится невидимым в обычных окнах Excel (как надстройка или Personal.xls)
    '---------------------------------------------------------------------------------------
        If Not TypeName(Selection) = "Range" Then Exit Sub
        Dim lr&, wb As Workbook, lb As Workbook
        With Application: .ScreenUpdating = False: .DisplayAlerts = False: .EnableEvents = False: End With
        Set wb = GetObject("c:test.xls")   ' здесь нужно прописать полный путь к файлу-накопителю
        Set lb = ThisWorkbook
        lr = wb.Sheets(1).Cells(Rows.Count, 1).End(xlUp).Row ' lr - номер последней не пустой строки файла-накопителя
        Selection.EntireRow.Copy wb.Sheets(1).Cells(lr + 1, 1) ' вставить выбранные в файле-источнике строки после последней не пустой строки в файл-накопитель
        wb.Close (True)   ' закрыть файл-накопитель с сохранением
        With Application: .EnableEvents = True: .DisplayAlerts = True: .ScreenUpdating = True: End With
        Set wb = Nothing: Set lb = Nothing
End Sub

В файле-накопителе всего лишь в модуле книги прописывается обработка события Private Sub Workbook_Open()
        If Me.Parent.Caption = Application.Caption Then Windows(Me.Name).Visible = True
End Sub

При этом число файлов-источников ничем не ограничено. Можно и два, и три, и четыре…

Да, верно, извините. Просто ищу решение для копирования строк(но не все даннуе) из одного файла во второй и из третьего файла также во второй. Плюс еще есть свой сложности там. Уже цепляюсь за что то похожее.
https://forum.msexcel.ru/empty-t4785.0.html


Про строки понятно, но мне нужно вставлять не строки целиком, а конкретные ячейки в нужное место, как я указал в файле. Как Это сделать?


И как сделать, чтобы итоговый файл был виден?


Я же писАл, что в файле-накопителе в модуле книги необходимо прописать обработку события

Private Sub Workbook_Open()
       If Me.Parent.Caption = Application.Caption Then Windows(Me.Name).Visible = True
End Sub

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

Я в своём примере продемонстрировал общий принцип копирования данных (строки) во внешний файл в строку, следующую за последней занятой.
Кто вам мешает теперь чуть-чуть «подпилить» макрос под свои нужды чтобы копировалась не вся строка, а только отдельные её ячейки?

С уважением, Алексей


Цитата: Alex_ST от 30.01.2011, 22:04
Я же писАл, что файле-накопителе в модуле книги прописывается обработка события Private Sub Workbook_Open()
        If Me.Parent.Caption = Application.Caption Then Windows(Me.Name).Visible = True
End Sub

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

Я в своём примере продемонстрировал общий принцип копирования данных (строки) во внешний файл в строку, следующую за последней занятой.
Кто вам мешает теперь чуть-чуть «подпилить» макрос под свои нужды чтобы копировалась не вся строка, а только отдельные её ячейки?

С видимостью разобрался, спасибо  :) . Я просто не знаю, как в этом макросе прописать пути копирования нужных ячеек. Поэтому надеюсь на помощи форума  :)


Наверное, что-то типа этого:

Sub Copy_CELLS_to_EXT_FILE()   ' скопировать ячейки 1, 2, 3 из выбранной строки в ячейки 3, 2, 1 внешнего файла-накопителя
   If Not TypeName(Selection) = "Range" Then Exit Sub
   Dim DST_lr&, SRC_row& ' последняя занятая строка накопителя и строка источника, в которой выбрана любая ячейка
   Dim SRC_wbk As Workbook, DST_wbk As Workbook ' книги источника и накопителя
   With Application: .ScreenUpdating = False: .DisplayAlerts = False: .EnableEvents = False: End With
   Set DST_wbk = GetObject("c:test.xls")   ' здесь нужно прописать полный путь к файлу-накопителю
   Set SRC_wbk = ThisWorkbook
   DST_lr = DST_wbk.Sheets(1).Cells(Rows.Count, 1).End(xlUp).Row    ' DST_lr - номер последней не пустой строки файла-накопителя
   SRC_row = Selection.Row
   SRC_wbk.ActiveSheet.Cells(SRC_row, 1).Copy DST_wbk.Sheets(1).Cells(DST_lr + 1, 3)    ' данные из ячейки 1 источника вставить в ячейку 3 первой пустой строки накопителя
   SRC_wbk.ActiveSheet.Cells(SRC_row, 2).Copy DST_wbk.Sheets(1).Cells(DST_lr + 1, 2)    ' данные из ячейки 2 источника вставить в ячейку 2 первой пустой строки накопителя
   SRC_wbk.ActiveSheet.Cells(SRC_row, 3).Copy DST_wbk.Sheets(1).Cells(DST_lr + 1, 1)    ' данные из ячейки 3 источника вставить в ячейку 1 первой пустой строки накопителя
   DST_wbk.Close (True)   ' закрыть файл-накопитель с сохранением
   With Application: .EnableEvents = True: .DisplayAlerts = True: .ScreenUpdating = True: End With
   Set DST_wbk = Nothing: Set SRC_wbk = Nothing
End Sub

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

С уважением, Алексей


Желаю скорейшего выздоровления, а то у меня появился еще вопросик  :)
Как модернизировать макрос, чтобы он автоматически делал гиперссылку в ячейке 3 итогового файла на исходный файл?

Спасибо за помощь  :)


А вы попробуйте самостоятельно:
1. Макрорекордером записать процесс вставки гиперссылки на внешний файл.
2. Вставить соответствующие команды в процедуру Copy_CELLS_to_EXT_FILE

Да, и ещё, определитесь, что вы хотите получить в ячейке НАКОПИТЕЛЯ:
— внешнюю связь (формулу, ссылающуюся на некую ячейку ИСТОЧНИКА)
— гиперссылку — при «клике» на неё открывается ИСТОЧНИК

С уважением, Алексей



У меня такая строчка получилась:
DST_wbk.Sheets(1).Cells(DST_lr + 1, 3).Hyperlinks.Add Anchor:=Selection, Address: = «G:My DocumentsРаботаИсходные данные.xls»
Но что-то она не работает  :(

Но если даже она заработает, то на гиперссылке будет висеть фиксированный адрес, а мне нужен текущий адрес SRC_wbk.
Help me, please  :)


Цитата: Alexandrin от 01.02.2011, 14:31
У меня такая строчка получилась:
DST_wbk.Sheets(1).Cells(DST_lr + 1, 3).Hyperlinks.Add Anchor:=Selection, Address: = «G:My DocumentsРаботаИсходные данные.xls»
Но что-то она не работает  :(

Но если даже она заработает, то на гиперссылке будет висеть фиксированный адрес, а мне нужен текущий адрес SRC_wbk.
Help me, please  :)

С гиперссылкой разобрался, получилось вот так:
DST_wbk.Sheets(1).Hyperlinks.Add Anchor:=DST_wbk.Sheets(1).Cells(DST_lr + 1, 3), Address:=»G:My DocumentsРаботаИсходные данные.xls»  :D

Осталось сделать ее динамической


С гиперссылкой разобрался, получилось вот так:
DST_wbk.Sheets(1).Hyperlinks.Add Anchor:=DST_wbk.Sheets(1).Cells(DST_lr + 1, 3), Address:=»G:My DocumentsРаботаИсходные данные.xls»  :D

Осталось сделать ее динамической
[/quote]
Сделал так:
DST_wbk.Sheets(1).Hyperlinks.Add Anchor:=DST_wbk.Sheets(1).Cells(DST_lr + 1, 3), Address:=ThisWorkbook.Path
Всем спасибо


только добрался до компа…
Вижу, прогресс налицо.
Правда, меня смущает в вашем коде

Address:=ThisWorkbook.Path
ThisWorkbook.Path, вроде бы возвращает путь с файлу. При чём без финишного слэша.
Я хотел, но не успел предложить использовать

Address:=ThisWorkbook.FullName
тогда будет полный путь, включая имя файла

Но, может, я по причине высокой температуры что-то и путаю в синтаксисе и операндах гиперссылки.

С уважением, Алексей


Главное направить в нужное русло  :)

Действительно, открывает только папку. Поправил код.


sm_clap

С уважением, Алексей


Интересная тема!
А расширьте, пожалуйста вариации:
1. Например, я выделяю три ряда в источнике и хочу,  чтобы по выполнению макроса они попали в файл накопитель на аналогичные ряды (и накопитель при этом открылся и был виден).
2. Выделенный диапазон ячеек из источника в накопитель (с теми же условиями).

Заранее спасибо!  :)


Макрос «Copy_ROWs_to_EXT_FILE», на который я уже давал ссылку на первом листе топика копирует столько строк, сколько выбранные ячейки занимают в источнике. Если выберете три ячейки по вертикали, то три строки и скопируются.
Замените там поиск последней занятой строки

lr = wb.Sheets(1).Cells(Rows.Count, 1).End(xlUp).Row
на прямое её задание.

С уважением, Алексей


  • Профессиональные приемы работы в Microsoft Excel

  • Обмен опытом

  • Microsoft Excel

  • Макрос переноса данных из одного файла в другой

Teslenko_EA писал(а):Здравствуйте russian imigration.
1. Что значит «…файл …не открывается…», невозможно открыть архив или не подключается надстройка?
2. «создал переменную … проверил, переменная равна … » — а объект (файл), адрес которого содержит переменная, открывался ?

Добрый день, Евгений Teslenko_EA
Спасибо за ответ.
1. теперь все открывается. раньше писало, что файл по данному адресу не найден, то есть не удавалось скачать его.
2. нет, сам файл оставался закрытым. обязательно ли надо его открывать, чтобы прочитать из него данные? от постоянно требует обновлений данных, что не очень удобно (но, в принципе, с этим можно смириться)

Насчет переменной str я понял еще вчера во время попыток отладки. Что-то задумался и создал такую, а потом, увидев у себя код типа «str = str(ячейка в экселе)», сам удивился, как такое написал

ЗЫ. Еще раз спасибо, что подсказываете, в том числе и как общаться. По ходу у меня с этим проблемы :( Не обращаясь ни к кому конкретно, я подразумевал, что ответит тот, кто будет знать ответ…

mc-black, спасибо за ответ, но, в принципе, Ваш код совпал с кодом Teslenko_EA :)

@antonio souza 

I’m not a believer in macros or VBA routines, except as a last resort. So here’s what could be a different way to bring that data across, making use of the recently available FILTER dynamic array function. I added a criterion column to your leafnew sheet, to identify the rows in question.

You don’t describe how this request of yours fits into a bigger picture….and I don’t pretend that this could be a solution for all situations, so it may be that a macro is needed, and I’ll let others who are good at that chime in. My point is that a fairly simple formula can bring over those rows—I only wrote two formulas…the results «spill» down into adjacent rows, however many are required. No need to copy the formula, no need to copy and paste….

So I just wanted to make sure you’re aware of these new functions.

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