Страницы: 1
RSS
Ошибочные действия макроса при копировании и вставке данных
 

Всем добрый день. Нужна помощь. Есть организация у которой есть удаленные подразделения, которые направляют в организацию ежесуточно данные на 8 утра и 8 вечера. Сведения направляются книгами Excel, состоящими из нескольких листов, у всех подразделений одинаковая форма книг. Разработал макрос который открывает файл нужного подразделения, копирует из него данные и вставляет в обобщенный файл формуемый на 8 утра или 8 вечера. Для определения области копирования и вставки использую именованные списки.

Проблема - код для всех подразделений одинаковый, но только в одном подразделении и только с одного листа книги иногда происходит ошибка. Копируемая область состоит из 2-х строк. но макрос вставляет только одну, хотя в копируемом файле заполнены обе строки. При повторном запуске макроса вставка происходит правильно. Что это, глюк Excel?

Часть макроса вставки и копирования данных:

Windows("ПЧ1.xlsm").Activate

'активация окна строевки ПЧ1

Application.Goto Sheets("ЧПО, ВПО, ДПО").Range("ВПО_ПЧ1_на_20ч")

'перейти (выделить) именованный диапазон ячеек ПЧ1 на 20 часов на листе "ЧПО, ВПО, ДПО"

Selection.Copy

'копировать именованный диапазон

'

Windows("Отряд.xlsm").Activate

'активация окна строевки отряда

Application.Goto Sheets("ЧПО, ВПО, ДПО").Range("ВПО_ПЧ1_ОФПС")

'перейти (выделить) именованный диапазон ячеек ПЧ1 в файле отряда на листе "ЧПО, ВПО, ДПО"

Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False

'в выделенный именованный диапазон вставить скопированную область из ПЧ1

 
если гранаты изменить на лимоны, а танки на мандарины, то возможно ли приложить пример?
 
Ваш Ник противоречит Правилам форума. Исправьте
Согласие есть продукт при полном непротивлении сторон.

Контакты, благодарности
 
Кросс на Кибере (там создана раньше) с моим ответом
Изменено: Jack Famous - 06.12.2023 16:49:02
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Вы предлагаете явное обращение к диапазону ".Range("Xm:Yn")", а я использую именованные списки, так как количество подразделений может меняться и будет изменения в диапазонах вставки. Сейчас обрабатывается 15 файлов с четырьмя листами, на которых по 2-4 именованных диапазонов копирования. Все с этим кодом работают отлично, и только в одном файле один диапазон копируется с ошибкой, но при повторном запуске макроса он копируется правильно. Не могу поймать логику не правильного копирования, так как это происходит не всегда и не я провожу обработку.
 
ifirewolf, приветствую.

Лично я максимально избегаю Copy+Paste в Excel - это и не эстетично (портится системный Clipboard), и при вставке огромных объёмов данных гарантированно приводит к сбою в копировании.

Попробуйте изменить код на такой (насколько я понял, нужно копировать значения, без форматирования и пр.):
Код
' объект-источник = книга строевки ПЧ1
Set wbSource = Workbooks("ПЧ1.xlsm")

' объект-приемник = книга строевки отряда
Set wbDest = Workbooks("Отряд.xlsm")
    
''' можно сохранить именованный диапазон-источник в промежуточный 2D-массив...
''' aSource = wbSource.Sheets("ЧПО, ВПО, ДПО").Range("ВПО_ПЧ1_на_20ч").Value
''' ...с возможностью дальнейшей проверки/обработки:
''' For i = 1 To UBound(aSource, 1)
'''     For j = 1 To UBound(aSource, 2)
'''         aSource(i, j) = -aSource(i, j)
'''     Next j
''' Next i
    
' копировать в именованный диапазон-приемник:

' напрямую:
wbDest.Sheets("ЧПО, ВПО, ДПО").Range("ВПО_ПЧ1_ОФПС").Value = wbSource.Sheets("ЧПО, ВПО, ДПО").Range("ВПО_ПЧ1_на_20ч").Value

''' или же из промежуточного массива:
''' wbDest.Sheets("ЧПО, ВПО, ДПО").Range("ВПО_ПЧ1_ОФПС").Value = aSource

' в конце использования объекты лучше уничтожить:
Set wbSource = Nothing
Set wbDest = Nothing
 
andypetr, огромное спасибо, прямая передача значений это то что нужно!
Страницы: 1
Наверх