Макрос Excel скопировать/вставить диапазон в следующую доступную строку

Изучая Excel, я не могу выполнить какие-либо модификации этого кода. В «Q145:AE211» у меня есть данные, которые каждый раз меняются. Каждый раз, когда он меняется, я планирую сначала копировать его в «Q1:AE1», а затем каждый раз, пропуская одну ячейку для наглядности. Таким образом, если макрос запускается (по кнопке), то сначала он вставляет данные в «Q1: AE1», затем, если кнопка нажата еще раз, и если ячейки «заняты», следующая в «AF1: AS1» и т. д.

    Range("Q145:AE211").Select
    Selection.Copy
    
    If IsEmpty(Range("Q1:AE1")) Then

    Range("Q1").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
    :=False, Transpose:=False
Else
    Range("Q1" & Rows.Count).End(xlUp).Offset(17).Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
    :=False, Transpose:=False

End If

    Application.CutCopyMode = False

Помимо вопиющей проблемы, связанной с тем, что вы пытаетесь перейти от диапазона (Q11048576) - который на 10 миллионов выше максимального - вверх, почему вы идете снизу вверх, а не справа налево, если вы хотите двигаться вправо, т. е. Q1 :AE1 -> AF1:AT1 (от Q до AE длина 15, от AF до AS всего 14) ? Можно проверить, какой столбец является самым внешним, и сместить на 2, чтобы «пропустить одну ячейку», что сделало бы его Q1:AE1 -> AG1:AU1, если я не ошибаюсь. Дайте также «Как избежать использования select в vba» :)

Notus_Panda 15.04.2024 11:28

Чего вы ожидаете от IsEmpty(Range("Q1:AE1"))?

FaneDuru 15.04.2024 11:28

затем, если кнопка будет нажата еще раз, Excel перейдет к последнему непустому СТОЛБЦУ строки 1. Вставьте туда данные. Вы можете использовать средство записи макросов и адаптировать код

Foxfire And Burns And Burns 15.04.2024 11:28

С помощью IsEmpty(Range("Q1:AE1")) я хотел проверить, пуст ли Q1:AE1, если нет, то сначала вставьте его туда. И да, я знаю, что код вызывает вопросы, я скопировал его из другого кода stackoverflow и попытался поиграться, даже не осознавая, что он используется снизу вверх. VBA для меня новичок, и я пытаюсь собрать его из исходников.

Ilze 15.04.2024 11:36

Если вы хотите проверить, есть ли в этом диапазоне значения on not, IsEmpty этого не делает... Возвращает логическое значение, указывающее, была ли инициализирована переменная. При том, как вы пытаетесь ее использовать, она всегда будет возвращать False, независимо содержимого диапазона... Всегда будет выполняться вторая часть оператора If. Итак, он ничего не делает... Пожалуйста, попробуйте ответ, который я опубликовал, используя массив, не используя ClipBoard, который намного быстрее даже для очень больших диапазонов.

FaneDuru 15.04.2024 11:54
Преобразование HTML-таблицы в профессиональный документ Excel
Преобразование HTML-таблицы в профессиональный документ Excel
Это самый простой способ создания Excel из HTML-таблицы.
Импорт excel в laravel в базу данных
Импорт excel в laravel в базу данных
Здравствуйте, дорогой читатель, в этой статье я расскажу практическим и быстрым способом, как импортировать файл Excel в вашу базу данных с помощью...
0
5
56
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Если я правильно понял ваш вопрос, попробуйте следующий быстрый способ. Он будет вставлен после последнего столбца. Не требуя форматирования, использование массива — это быстрый способ вставки:

Sub copyAfterTheLastColumn()
 Dim lastCol As Long, arr
 
 arr = Range("Q145:AE211").value
 lastCol = cells(1, columns.count).End(xlToLeft).column + 1
 
 Cells(1, lastCol).Resize(UBound(arr), UBound(arr, 2)).value = arr
End Sub

Это расположит горизонтально последовательные диапазоны результатов.

    Range("Q145:AE211").Select
    Selection.Copy
    
    If IsEmpty(Range("Q1:AE1")) Then

    Range("Q1").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
    :=False, Transpose:=False
Else
    Cells(1, Columns.Count).End(xlToLeft).Offset(0,2).Select    'changed
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
    :=False, Transpose:=False

End If

    Application.CutCopyMode = False

Отлично решает, только один вопрос - Offset(0,2) - если меняю на Offset(0,15), Excel ломается, меняю на 15, потому что мне нужно, чтобы следующие данные копировались через 15 ячеек строки, потому что данные занимают всего 14 ячеек.

Ilze 15.04.2024 11:47

Если вы скопируете их друг под другом, через некоторое время они достигнут исходного диапазона. Буквы означают столбцы. Согласно вашему источнику: Q145:AE211 — 15 столбцов x 67 строк. End(xlToLeft) найдите крайнюю правую ячейку со значением в первой строке и выберите две ячейки справа от нее.

Black cat 15.04.2024 12:07

Другие вопросы по теме