Копирование данных из открытой книги с разными названиями, Копирование данных из открытой книги в постоянную книгу в определенный лист, в выделенную ячейку
Требуется макрос для копирования данных из одной открытой книги в другую открытую. Книга из которой надо брать данные из определенной ячейки имеет разные названия, но всегда в составе книги один лист "МАРШРУТ". Надо копировать данные из ячейки A5 в определенную книгу в определенный лист, в выделенную ячейку и транспонировать данные диапазона H11: H125 из книги с листом "МАРШРУТ" в диапазон который начинается со следующей ячейки, в которой скопированы данные описанные выше.
evgeniygeo, Во вложении 2 файла. Нужно чтобы из книги с листом "МАРШРУТ", данные переносились в книгу с листом "КАТАЛОГ" по нажатию кнопки. Данные про которые я описывал в своем сообщении.
Sub Из_МАРШРУТА_с_любовью()
Dim shMarsh As Worksheet: Set shMarsh = GetSheet("МАРШРУТ"): If shMarsh Is Nothing Then Exit Sub
Dim shCatal As Worksheet: Set shCatal = GetSheet("КАТАЛОГ"): If shCatal Is Nothing Then Exit Sub
Dim arr As Variant
arr = myTranspose(shMarsh.Range("H11:H125"))
shCatal.Parent.Activate
shCatal.Activate
With ActiveCell.EntireRow
.Cells(1, 1).Value = shMarsh.Range("A5").Value
.Cells(1, 2).Resize(1, UBound(arr, 2)).Value = arr
End With
End Sub
Private Function myTranspose(rr As Range) As Variant
Dim arr As Variant
arr = rr.Value
Dim brr As Variant
ReDim brr(1 To UBound(arr, 2), 1 To UBound(arr, 1))
Dim ya As Long
Dim xa As Long
For ya = 1 To UBound(arr, 1)
For xa = 1 To UBound(arr, 2)
brr(xa, ya) = arr(ya, xa)
Next
Next
myTranspose = brr
End Function
Private Function GetSheet(sheetName As String) As Worksheet
Dim sh As Worksheet
Dim index_wb As Long
On Error Resume Next
For index_wb = Workbooks.Count To 1 Step -1
Set sh = Workbooks(index_wb).Worksheets(sheetName)
If Not sh Is Nothing Then
Set GetSheet = sh
Exit For
End If
Next
On Error GoTo 0
End Function
А можно чуть усложнить? 1. Чтобы данные копировались не в выделенную ячейку, а в первую свободную 2. При копировании проверялось есть ли такое же название. Если есть то данные не переносились бы
Sub Из_МАРШРУТА_с_любовью()
Dim shMarsh As Worksheet: Set shMarsh = GetSheet("МАРШРУТ"): If shMarsh Is Nothing Then Exit Sub
Dim shCatal As Worksheet: Set shCatal = GetSheet("КАТАЛОГ"): If shCatal Is Nothing Then Exit Sub
With shCatal
If WorksheetFunction.CountIfs(.Columns(1), shMarsh.Range("A5").Value) = 0 Then
Dim arr As Variant
arr = myTranspose(shMarsh.Range("H11:H125"))
Dim yc As Long
yc = .Cells(.Rows.Count, 1).End(xlUp).Row + 1
.Cells(yc, 1).Value = shMarsh.Range("A5").Value
.Cells(yc, 2).Resize(1, UBound(arr, 2)).Value = arr
Application.Goto .Cells(yc, 1)
End If
End With
End Sub
Private Function myTranspose(rr As Range) As Variant
Dim arr As Variant
arr = rr.Value
Dim brr As Variant
ReDim brr(1 To UBound(arr, 2), 1 To UBound(arr, 1))
Dim ya As Long
Dim xa As Long
For ya = 1 To UBound(arr, 1)
For xa = 1 To UBound(arr, 2)
brr(xa, ya) = arr(ya, xa)
Next
Next
myTranspose = brr
End Function
Private Function GetSheet(sheetName As String) As Worksheet
Dim sh As Worksheet
Dim index_wb As Long
On Error Resume Next
For index_wb = Workbooks.Count To 1 Step -1
Set sh = Workbooks(index_wb).Worksheets(sheetName)
If Not sh Is Nothing Then
Set GetSheet = sh
Exit For
End If
Next
On Error GoTo 0
End Function
Sub Из_МАРШРУТА_с_любовью()
From_marsh True
End Sub
Sub Из_МАРШРУТА_без_любви()
From_marsh False
End Sub
Private Sub From_marsh(checkPresence As Boolean)
Dim shMarsh As Worksheet: Set shMarsh = GetSheet("МАРШРУТ"): If shMarsh Is Nothing Then Exit Sub
Dim shCatal As Worksheet: Set shCatal = GetSheet("КАТАЛОГ"): If shCatal Is Nothing Then Exit Sub
With shCatal
If checkPresence Then
If WorksheetFunction.CountIfs(.Columns(1), shMarsh.Range("A5").Value) > 0 Then Exit Sub
End If
Dim arr As Variant
arr = myTranspose(shMarsh.Range("H11:H125"))
Dim yc As Long
yc = .Cells(.Rows.Count, 1).End(xlUp).Row + 1
.Cells(yc, 1).Value = shMarsh.Range("A5").Value
.Cells(yc, 2).Resize(1, UBound(arr, 2)).Value = arr
Application.Goto .Cells(yc, 1)
End With
End Sub
Private Function myTranspose(rr As Range) As Variant
Dim arr As Variant
arr = rr.Value
Dim brr As Variant
ReDim brr(1 To UBound(arr, 2), 1 To UBound(arr, 1))
Dim ya As Long
Dim xa As Long
For ya = 1 To UBound(arr, 1)
For xa = 1 To UBound(arr, 2)
brr(xa, ya) = arr(ya, xa)
Next
Next
myTranspose = brr
End Function
Private Function GetSheet(sheetName As String) As Worksheet
Dim sh As Worksheet
Dim index_wb As Long
On Error Resume Next
For index_wb = Workbooks.Count To 1 Step -1
Set sh = Workbooks(index_wb).Worksheets(sheetName)
If Not sh Is Nothing Then
Set GetSheet = sh
Exit For
End If
Next
On Error GoTo 0
End Function
написал: Sub Из_МАРШРУТА_с_любовью() Dim shMarsh As Worksheet: Set shMarsh = GetSheet("МАРШРУТ"): If shMarsh Is Nothing Then Exit Sub Dim shCatal As Worksheet: Set shCatal = GetSheet("КАТАЛОГ"): If shCatal Is Nothing Then Exit Sub
With shCatal If WorksheetFunction.CountIfs(.Columns(1), shMarsh.Range("A5").Value) = 0 Then Dim arr As Variant arr = myTranspose(shMarsh.Range("H11:H125"))
Dim yc As Long yc = .Cells(.Rows.Count, 1).End(xlUp).Row + 1 .Cells(yc, 1).Value = shMarsh.Range("A5").Value .Cells(yc, 2).Resize(1, UBound(arr, 2)).Value = arr
Ак как такой макрос осуществить но из открытой книги в закрытую? Вот пытаюсь даже с двумя активными книгами сделать, но данные почему то переносит на 501 строку, хотя в макросе прописано в первую свободную. Из книги "Ввод данных" с листа "Данные" в книгу "Тест" лист "ЗАКАЗЫ". И это происходит из за того что в первом столбце формула в ячейках
val_kaz, Кто вам мешает определить последнюю ячейку в другой колонке (B), например так:
Код
Dim yc As Long
yc = .Cells(.Rows.Count, 2).End(xlUp).Row + 1
или так:
Код
Dim yc As Long
yc = .Columns("B").Find(what:="*", _
LookIn:=xlValues, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlPrevious, MatchCase:=False, SearchFormat:=False).Row + 1
По мимо копи - паст надо ещё вникать в код, если вы заинтересованы в этом. Если конечно-же вам удобнее при каждом чихе бегать на форум то другое дело и по другому будут к вам относится.
написал: val_kaz , Кто вам мешает определить последнюю ячейку в другой колонке (B), например так:Код Dim yc As Long yc = .Cells(.Rows.Count, 2).End(xlUp).Row + 1или так:Код Dim yc As Long yc = .Columns("B").Find(what:="*", _ LookIn:=xlValues, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlPrevious, MatchCase:=False, SearchFormat:=False).Row + 1По мимо копи - паст надо ещё вникать в код, если вы заинтересованы в этом. Если конечно-же вам удобнее при каждом чихе бегать на форум то другое дело и по другому будут к вам относится.
У меня написан макрос который добавляет в свободные ячейки с 3 по 11 колонку. Но он не добавляет потому что в колонке 1 на все 500 строк есть формула. Если удалить формулы из 1-й колонки то с 3 по 11 колонку данные заполняются как надо. Есть решение о том как переносить все данные из последней ячейки 1-й колонки в пустую ячейку этой колонки? Ваш код тут вообще не причем. У меня и так определяет последнюю ячейку нужных колонок и вносит все отлично если бы не заполненный ячейки именно формулой в 1-й колонке
val_kaz написал: данные почему то переносит на 501 строку, хотя в макросе прописано в первую свободную.
???
Цитата
val_kaz написал: У меня и так определяет последнюю ячейку нужных колонок и вносит все отлично если бы не заполненный ячейки именно формулой в 1-й колонке
val_kaz написал: Что мне дает определение последней ячейки в колонке B?
М-да...
Цитата
val_kaz написал: Вот пытаюсь даже с двумя активными книгами сделать, но данные почему то переносит на 501 строку, хотя в макросе прописано в первую свободную.
я нахожу последнюю строку в колонке 3. Какая разница в моем случае в колонке 2 находить или в 3? При любом раскладе если в колонке 1 формулы на 500 строк то данные в остальные колонки могут только наполняться начина с 501 строки Вот макрос. Все работает когда в 1 колонке нет формулы. Если можете помочь то помогите с макросом который вставляет в первую пустую строку данные из предыдущей.
Код
Sub Наполнение_данными()
Dim shMarsh As Worksheet: Set shMarsh = GetSheet("Данные"): If shMarsh Is Nothing Then Exit Sub
Dim shCatal1 As Worksheet: Set shCatal1 = GetSheet("ЗАКАЗЫ"): If shCatal1 Is Nothing Then Exit Sub
Application.ScreenUpdating = False
With shCatal1
Dim yc As Long
yc = .Cells(.Rows.Count, 1).End(xlUp).Row + 1
.Cells(yc, 3).Value = shMarsh.Range("A3").Value
'.Cells(yc, 4).Value = shMarsh.Range("B3").Value
'.Cells(yc, 5).Value = shMarsh.Range("C3").Value
'.Cells(yc, 6).Value = shMarsh.Range("D3").Value
'.Cells(yc, 7).Value = shMarsh.Range("E3").Value
'.Cells(yc, 8).Value = shMarsh.Range("F3").Value
'.Cells(yc, 9).Value = shMarsh.Range("G3").Value
'.Cells(yc, 10).Value = shMarsh.Range("H3").Value
'.Cells(yc, 11).Value = shMarsh.Range("I3").Value
End With
End Sub