Изучая 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
Чего вы ожидаете от IsEmpty(Range("Q1:AE1"))
?
затем, если кнопка будет нажата еще раз, Excel перейдет к последнему непустому СТОЛБЦУ строки 1. Вставьте туда данные. Вы можете использовать средство записи макросов и адаптировать код
С помощью IsEmpty(Range("Q1:AE1")) я хотел проверить, пуст ли Q1:AE1, если нет, то сначала вставьте его туда. И да, я знаю, что код вызывает вопросы, я скопировал его из другого кода stackoverflow и попытался поиграться, даже не осознавая, что он используется снизу вверх. VBA для меня новичок, и я пытаюсь собрать его из исходников.
Если вы хотите проверить, есть ли в этом диапазоне значения on not, IsEmpty
этого не делает... Возвращает логическое значение, указывающее, была ли инициализирована переменная. При том, как вы пытаетесь ее использовать, она всегда будет возвращать False
, независимо содержимого диапазона... Всегда будет выполняться вторая часть оператора If
. Итак, он ничего не делает... Пожалуйста, попробуйте ответ, который я опубликовал, используя массив, не используя ClipBoard, который намного быстрее даже для очень больших диапазонов.
Если я правильно понял ваш вопрос, попробуйте следующий быстрый способ. Он будет вставлен после последнего столбца. Не требуя форматирования, использование массива — это быстрый способ вставки:
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 ячеек.
Если вы скопируете их друг под другом, через некоторое время они достигнут исходного диапазона. Буквы означают столбцы. Согласно вашему источнику: Q145:AE211 — 15 столбцов x 67 строк. End(xlToLeft)
найдите крайнюю правую ячейку со значением в первой строке и выберите две ячейки справа от нее.
Помимо вопиющей проблемы, связанной с тем, что вы пытаетесь перейти от диапазона (Q11048576) - который на 10 миллионов выше максимального - вверх, почему вы идете снизу вверх, а не справа налево, если вы хотите двигаться вправо, т. е. Q1 :AE1 -> AF1:AT1 (от Q до AE длина 15, от AF до AS всего 14) ? Можно проверить, какой столбец является самым внешним, и сместить на 2, чтобы «пропустить одну ячейку», что сделало бы его Q1:AE1 -> AG1:AU1, если я не ошибаюсь. Дайте также «Как избежать использования select в vba» :)