Решение специальной вставки списка объектов — ошибка времени выполнения 1004

#excel #vba #listobject

#excel #vba #listobject

Вопрос:

Я хотел бы переместить все данные из одной таблицы в 4 другие таблицы. Я получаю специальную ошибку, используя приведенный ниже код. Код довольно длинный, поэтому соответствующий фрагмент размещен ниже.

 Set tbl2 = ws1.ListObjects("Table2")
Set tbl3 = ws2.ListObjects("Table3")
Set tbl4 = ws3.ListObjects("Table4")
Set tbl5 = ws4.ListObjects("Table5")

For i = 1 To tbl1.ListRows.Count
    tbl1.ListRows(i).Range.Copy

    tbl2.ListRows.Add 1, True
    tbl2.ListRows(1).Range.PasteSpecial xlPasteFormats
    tbl2.ListRows(1).Range.Value = tbl1.ListRows(i).Range.Value

    tbl3.ListRows.Add 1, True
    tbl3.ListRows(1).Range.PasteSpecial xlPasteFormats
    tbl3.ListRows(1).Range.Value = tbl1.ListRows(i).Range.Value


    tbl4.ListRows.Add 1, True
    tbl4.ListRows(1).Range.PasteSpecial xlPasteFormats
    tbl4.ListRows(1).Range.Value = tbl1.ListRows(i).Range.Value

    tbl5.ListRows.Add 1, True
    tbl5.ListRows(1).Range.PasteSpecial xlPasteFormats
    tbl5.ListRows(1).Range.Value = tbl1.ListRows(i).Range.Value

Next i
 

«Ошибка времени выполнения 1004»:
Ошибка вставки специального класса диапазона

Эта ошибка вызывается первой специальной строкой вставки.

Есть идеи о том, как исправить эту проблему? Я некоторое время искал в stacked, но пока не нашел решения.

Спасибо!

Комментарии:

1. Обычно вы хотите что .Copy -то сразу перед тем, как идти, и PasteSpecial это — ListRows.Add теряет CutCopyMode ? tbl2 Имеет ли такое же количество столбцов, как tbl1 ?

2. Привет, Матье, спасибо за комментарий. Я сразу же переместил все pastespecial под копию, и она больше не выдает мне ошибку — отличные новости! — но для вычисления требуется значительное количество времени. Есть ли более чистый способ перемещения списка и его формата в другую таблицу?

3. Смотрите Ответ ниже; надеюсь, это поможет!

4. Вот важное замечание , которое следует иметь в виду при использовании PasteSpecial . Я знаю, что эта ситуация несколько раз сбивала меня с толку при отладке кода (в противном случае это сработало бы!).

Ответ №1:

Кажется, вы просто добавляете содержимое tbl1 к куче других таблиц.

Вместо использования буфера обмена скопируйте источник DataBodyRange в массив вариантов 2D:

 Dim content As Variant
content = tbl1.DataBodyRange.Value
 

Затем добавьте новую строку в пункт назначения:

 tbl2.ListRows.Add
 

И сбросьте свой 2D-массив в этом месте:

 tbl2.ListRows(tbl2.ListRows.Count).Range.Resize(UBound(content, 1)).Value = content
 

Промыть и повторить для каждой целевой таблицы… должно быть практически мгновенно.

Комментарии:

1. Привет, Матье, еще раз спасибо за вашу вчерашнюю помощь. Быстрый последующий вопрос. У меня есть столбец, содержащий текстовые значения типа «2-10» и «3-12», которые преобразуются в формат текстовой даты, например, «43477» и «43475», когда они перемещаются из одной таблицы в другую. Любые предложения о том, как сохранить исходный текст или преобразовать обратно?

2. @Dmegaffi ага, Excel снова «полезен»… Вы можете отформатировать эти столбцы как текст в целевых таблицах, это должно быть исправлено. Или дополните эти значения одинарными кавычками в исходных данных.