#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 снова «полезен»… Вы можете отформатировать эти столбцы как текст в целевых таблицах, это должно быть исправлено. Или дополните эти значения одинарными кавычками в исходных данных.