Страницы: 1
RSS
Скопировать данные из закрытой книги в разные ячейки и листы
 
Здравствуйте помогите сократить следующий макрос
Код
Sub Get_Value_From_Close_Book2()
    Dim sShName As String, sAddress As String, vData
    Dim objCloseBook As Object
    'Отключаем обновление экрана
    Application.ScreenUpdating = False
    Set objCloseBook = GetObject("C:\Книга12.xlsm")
    sAddress = "G8" 'или одна ячейка - "A1"
    'получаем значение
    vData = objCloseBook.Sheets("Лист1").Range(sAddress).Value
    objCloseBook.Close False
    'Записываем данные на активный лист книги,
    'с которой запустили макрос
    If IsArray(vData) Then
        [G8].Resize(UBound(vData, 1), UBound(vData, 2)).Value = vData
    Else
        [G8] = vData
    End If
    Set objCloseBook = GetObject("C:\Книга12.xlsm")
    sAddress = "I10" 'или одна ячейка - "A1"
    'получаем значение
    vData = objCloseBook.Sheets("Лист1").Range(sAddress).Value
    objCloseBook.Close False
    'Записываем данные на активный лист книги,
    'с которой запустили макрос
    If IsArray(vData) Then
        [I10].Resize(UBound(vData, 1), UBound(vData, 2)).Value = vData
    Else
        [I10] = vData
    End If
    Set objCloseBook = GetObject("C:\Книга12.xlsm")
    sAddress = "C14" 'или одна ячейка - "A1"
    'получаем значение
    vData = objCloseBook.Sheets("Лист2").Range(sAddress).Value
    objCloseBook.Close False
    'Записываем данные на активный лист книги,
    'с которой запустили макрос
    If IsArray(vData) Then
        [C14].Resize(UBound(vData, 1), UBound(vData, 2)).Value = vData
    Else
        [C14] = vData
    End If
    Application.ScreenUpdating = True
End Sub
Данный макрос копирует данные из закрытой книги в активную, и почему то в этой части:
Код
    Set objCloseBook = GetObject("C:\Книга12.xlsm")
    sAddress = "C14" 'или одна ячейка - "A1"
    'получаем значение
    vData = objCloseBook.Sheets("Лист2").Range(sAddress).Value
    objCloseBook.Close False
    'Записываем данные на активный лист книги,
    'с которой запустили макрос
    If IsArray(vData) Then
        [C14].Resize(UBound(vData, 1), UBound(vData, 2)).Value = vData
    Else
        [C14] = vData
    End If
    Application.ScreenUpdating = True
он копирует на "Лист1", а надо на "Лист2"
 
Ячейка без указвзания родителя принадлежит активному листу. Нужно указать лист:
Код
Worksheets("Лист2").Range("C14")...
 
ОК, сделал так
Код
    If IsArray(vData) Then
        Sheets("Лист2").[C14].Resize(UBound(vData, 1), UBound(vData, 2)).Value = vData
    Else
        Sheets("Лист2").[C14] = vData
А как, компактней сделать весь макрос
Изменено: Voltz - 02.01.2020 15:18:12
 
Код
With Sheets("Лист2").Cells(14, 3)
    If IsArray(vData) Then
        .Resize(UBound(vData), UBound(vData, 2)).Value = vData
    Else
        .Value = vData
    End If
End With
 
А, если несколько разных ячеек?
 
Цитата
Voltz написал:
А как, компактней сделать весь макрос
Добрый день!
Может попробуете забирать в массив адреса и значения ячеек,
затем в одном получении объекта делать копирование и
только потом закрывать объект.
 
Код
With Sheets("Лист2")
     .Cells(14, 3)...
     .Cells(5, 4)...
 
Я правильно вставил Ваш код
Код
    Set objCloseBook = GetObject("C:\Книга12.xlsm")
With Sheets("Лист2").Cells(14, 3)
    If IsArray(vData) Then
        .Resize(UBound(vData), UBound(vData, 2)).Value = vData
    Else
        .Value = vData
    End If
End With
Если да, то он не копирует
Изменено: Voltz - 02.01.2020 16:13:04
 
Сделал так
Код
    Set objCloseBook = GetObject("C:\Книга12.xlsm")
    vData = objCloseBook.Sheets("Лист2").Range("C14", "C15").Value
    objCloseBook.Close False
    'Записываем данные на активный лист книги,
    'с которой запустили макрос
    If IsArray(vData) Then
        Sheets("Лист2").Range("C14", "C15").Resize(UBound(vData, 1), UBound(vData, 2)).Value = vData
    Else
        Sheets("Лист2").Range("C14", "C15") = vData
    End If
Изменено: Voltz - 02.01.2020 17:53:46
 
Вот тут
Цитата
Voltz написал:
Set objCloseBook = GetObject("C:\Книга12.xlsm")
   vData = objCloseBook.Sheets("Лист2").Range("C14", "C15").Value
вы указываете, из какой книги брать данные, а тут
Цитата
Voltz написал:
Set objCloseBook = GetObject("C:\Книга12.xlsm")
With Sheets("Лист2").Cells(14, 3)
почему-то стесняетесь.
Изменено: RAN - 02.01.2020 19:01:42
 
Voltz,попробуйте такой макрос, поменьше кода. Если необходимо много значений из разных листов брать, то думаю целесообразно будет
конструкцию With со словариком использовать.
Код
Sub Get_Value_From_Close_Book()
    Dim sShName As String, vAddress, vData
    Dim objCloseBook As Object
    'Отключаем обновление экрана
    Application.ScreenUpdating = False
    Set objCloseBook = GetObject("C:\Users\Мария\Downloads\Книга12.xlsm")
    vAddress = Array("G8", "I10", "C14")
    'получаем значения
    vData0 = objCloseBook.Sheets("Лист1").Range("G8").Value
    vData1 = objCloseBook.Sheets("Лист1").Range("I10").Value
    vData2 = objCloseBook.Sheets("Лист2").Range("C14").Value
    vData = Array(vData0, vData1, vData2)
    objCloseBook.Close False
    'Записываем данные на активный лист книги,
    'с которой запустили макрос
    For i = 0 To UBound(vData)
        If IsArray(vData(i)) Then
            Range(vAddress(i)).Resize(UBound(vData(i), 1), UBound(vData(i), 2)).Value = vData(i)
        Else
            Range(vAddress(i)) = vData(i)
        End If
    Next
    Application.ScreenUpdating = True
End Sub

Изменено: Smurov - 02.01.2020 19:14:34
 
Smurov, в Вашем коде
Код
Sheets("Лист2").Range("C14")
он копирует на Sheets("Лист1").Range("C14")
 
Voltz, Ну правильно, как в Вашем первоначальном посте - 'Записываем данные на активный лист книги, с которой запустили макрос.
Я понял, что Вы все три значения хотите вставить на один лист, т.е. на Лист1
Страницы: 1
Наверх