Страницы: 1
RSS
Перенос данных между двумя "умными" таблицами в VBA
 
Всем привет.
Есть задача - перенести с помощью макроса все данные из одной "умной" таблицы в другую.

На первый взгяд - ничего сложного, определяем объем первой таблицы, копируем, определяем последнюю строчку второй таблицы, вставляем в следующую строчку, очищаем первую таблицу. Это отлично работает, если таблицы обычные.
Проблема возникает если таблицы умные и изначально вторая таблица пуста. Макрос начинает вставлять данные не с о второй строки, а с третьей. (Если вторая таблица имеет записи все работает корректно).

Буду благодарен за помощь.
 
Цитата
telephone122 написал:
Проблема возникает если таблицы умные
это не проблема - это счастье:
Код
Sub tablecopy()
    Range("Таблица3").Copy Range("Таблица4[q]")
End Sub
Соблюдение правил форума не освобождает от модераторского произвола
 
Цитата
telephone122 написал:
Макрос начинает вставлять данные не с о второй строки, а с третьей
Как коллега buchlotnik выше или вы должны проверить «DataBodyRange» и рассчитать «ListRows» на этой основе.
 
buchlotnik, спасибо, но немного не то. данные переносятся только один раз, а мне надо чтобы в таблицу4 при каждом выполнении макроса добавлялись новые значения из таблицы3

ocet p, а можно чуть-чуьт по подробнее. А то я в VBA к сожалению почти полный ноль.
 
telephone122, вот тут разбирали проверку умной таблицы на пустоту
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
telephone122 написал:
немного не то
дык предупреждать надо:
Код
Sub tablecopy()
    Range("Таблица3").Copy Range("Таблица4[q]").Offset(Range("Таблица4").Rows.Count, 0)
End Sub
Соблюдение правил форума не освобождает от модераторского произвола
 
Цитата
telephone122 написал:
чуть-чуьт по подробнее
Например, три варианта на выбор:
Код
Option Explicit

Sub abc_xyz()
    Dim rws&, tbl
    Dim dtbdrng As Object
    
    With Sheets("Export")
        On Error Resume Next
            Set dtbdrng = .ListObjects.Item("Table3").DataBodyRange
        On Error GoTo 0
        If dtbdrng Is Nothing Then MsgBox "Net dannykh": Exit Sub
        tbl = dtbdrng.Value
        Set dtbdrng = Nothing
    End With
    
    'Variant I s "DataBodyRange" i "ListRows"
    With Sheets("Import")
        With .ListObjects.Item("Table4")
            On Error Resume Next
                Set dtbdrng = .DataBodyRange
            On Error GoTo 0
            If dtbdrng Is Nothing Then rws = 2 Else rws = .ListRows.Count + 2
            .Range.Cells(rws, 1).Resize(UBound(tbl, 1), UBound(tbl, 2)).Value = tbl
            tbl = Empty
            Set dtbdrng = Nothing
        End With
    End With
    
    'Variant II tol'ko s "ListRows"
    With Sheets("Import")
        With .ListObjects.Item("Table4")
            rws = .ListRows.Count + 2
            .Range.Cells(rws, 1).Resize(UBound(tbl, 1), UBound(tbl, 2)).Value = tbl
            tbl = Empty
        End With
    End With
    
    'Variant III - kod kollegi "buchlotnik"
    With Sheets("Import")
        With .ListObjects.Item("Table4")
            rws = .ListRows.Count
            If rws = 0 Then
                Sheets("Export").Range("Table3").Copy .Parent.Range("Table4[q]")
            Else
                .Range.Cells(rws + 2, 1).Resize(UBound(tbl, 1), UBound(tbl, 2)).Value = tbl
            End If
            tbl = Empty
        End With
    End With
End Sub

Пожалуйста, прочитайте тоже об этом:

ListObjects (или ListObjects.Item)
ListObjects(1).Resize (или ListObjects.Item(1).Resize)
DataBodyRange
ListColumns
ListColumns(x).TotalsCalculation
ListRows
ListRows.Add
TotalsRowRange
HeaderRowRange
 
Цитата
buchlotnik написал:
предупреждать надо
:)  Ну и вы не предупредили, что улучшите свой код ... написал бы по другому  :)  
 
Код
Sub copyTab3()
Dim LO1 As ListObject
Dim LO2 As ListObject

Set LO1 = Sheets("Export").ListObjects("Таблица3")
Set LO2 = Sheets("Import").ListObjects("Таблица4")
LO1.DataBodyRange.Copy
If LO2.DataBodyRange Is Nothing Then
    Sheets("Import").Cells(2, 1).PasteSpecial xlPasteValues
Else
    Sheets("Import").Cells(LO1.DataBodyRange.Rows.Count + 2, 1).PasteSpecial xlPasteValues
End If

End Sub

Изменено: Павел Запивахин - 19.08.2019 21:32:36
 
Добрый вечер! Подскажите плиз, очень нужна помощь  :cry:  как нужно скорректировать код, чтобы умная талица с одного листа переносилась в умную наблицу на втором листе, но данные вставлялись во второй столбец, т.к. в УТ на втором листе в первом столбце будет формула, чтобы автоматически нумеровать позиции.
Изменено: Елена М - 05.07.2021 11:41:22
 
Елена М, Елена М,покажите просто в файле желаемы результат...
Не бойтесь совершенства. Вам его не достичь.
 
Mershik, постаралась в файле показать как должно получиться
 
Код
Sub tablecopy()
    lr = Cells(Rows.Count, 2).End(xlUp).Row
    arr = Range("B3:G" & lr).Value
    With [РВ].ListObject
        If Not .DataBodyRange Is Nothing Then .DataBodyRange.Delete
    End With
    Sheets("Overtime").[B3].Resize(UBound(arr), UBound(arr, 2)) = arr
End Sub
Изменено: skais675 - 05.07.2021 14:19:29
 
skais675, спасибо, но смысл как раз в том, чтобы в первом столбце автоматически проставлялся номер п/п, а так получается ошибка(
 
Елена М, в чем ошибка? Вы ж сами сказали что пропишите туда формулу для проставления порядкового номера.
Я изменил диапазон вставки B3, думал Вы догадаетесь.
Изменено: skais675 - 05.07.2021 14:40:30
 
skais675, простите, это моя ошибка, только сейчас поняла. Моя ошибка в том, что вначале макрос удаляет все данные в УТ, соответственно у меня и формула слетает.
Тогда вопрос по-другому должен быть. Как перенести данные из одной таблицы в другую, чтобы во второй таблице строки нумеровались автоматически
 
Елена М, Посмотрите пример в #15, вписал формулу, она не удаляется и все работает как Вы хотели. При желании можно и без формулы, но при сортировке порядок нарушится, поэтому сделал как Вы просили с формулой.
Изменено: skais675 - 05.07.2021 14:42:51
 
skais675, спасибо огромное, все работает идеально  :)  
Страницы: 1
Наверх