Автозаполнение неизвестного количества клеток - PullRequest
0 голосов
/ 24 октября 2018

Я пытаюсь написать код VBA для эквивалента щелчка и перетащить угол ячейки до конца.Иллюстрация:
illustration

Я пробовал несколько разных предложений, которые я нашел в Интернете, но меня всегда встречают ошибки.

Ниже приведена строкаВ настоящее время я работаю над.Но я получаю Ошибка во время выполнения '1004': ошибка приложения или объекта .

Range("A4").Select
ActiveCell.AutoFill Range(ActiveCell, ActiveCell.Offset(0, 1).End(xlRight).Offset(0, -1))

Для большего контекста здесь представлен весь сценарий, над которым я работаю: снимок экранавсего сценария:
screenshot of whole script и вот оригинальная строка сценария в соответствии с моей собственной логикой, прежде чем я начал искать ответы в Интернете:

Selection.Autofill Destination:=Range("A4":mylastcell_4), Type:=xlFillDefault

mylastcell_4 имеетбыло объявлено в верхней части скрипта (см. скриншот всего скрипта).Я также пытался изменить на "A4",mylastcell_4, но все равно получаю сообщение об ошибке.

Я очень плохо знаком с VBA и не знаю, куда идти.

Я пытался

 .Range(.Cells(4, "A"), .Cells(1, .Columns.Count).End(xlToLeft).Offset(3, 0)).Formula = "=concatenate(a2, a1, a3)"

Что предлагается в одном из ответов ниже.Однако это дает результат, только если у меня есть 5 ячеек в строке 1. Мне требуется больше гибкости, так как для работы может быть от 2 до 500 значений. Изображение результатов предложенного выше сценария

Я также обнаружил, что движение по этому маршруту, кажется, разрушает мою следующую серию конкатенации, которая, как я знаю, сработала отдельно - надеюсь, что-то простое, что требуетизменяющий? Скрипт, используемый для следующей конкатенации .

Конечная цель этого упражнения - получить список текста, подготовленный для непосредственного использования в SQL.то есть abcde становится 'a', 'b', 'c', 'd', 'e' - все в одной ячейке.

Ответы [ 2 ]

0 голосов
/ 24 октября 2018

Содержимое, которое вы хотите добавить, это формула, помещенная в А4.

=concatenate(a2, a1, a3)

Поскольку все три предыдущие строки важны для формулы, предполагается, что любая из предыдущих строк может быть использована дляостановка 'точка вправо.Я буду использовать строку 1 (на 3 строки выше) и смещение вниз, чтобы найти точку «остановки».

with worksheets("sheet1")
    ...
    .cells(4, "A").formula = "=concatenate(a2, a1, a3)"
    .range(.cells(4, "A"), .cells(1, .columns.count).end(xltoleft).offset(3, 0)).fillright
    ...
end with

Я предпочитаю .FillRight для этой операции, чем .AutoFill, но вы можете легко использовать этот метод для.Автозаполнение также.

В качестве альтернативы, вы могли бы просто записать формулу сразу во все четыре ячейки.

with worksheets("sheet1")
    ...
    .range(.cells(4, "A"), .cells(1, .columns.count).end(xltoleft).offset(3, 0)).formula = "=concatenate(a2, a1, a3)"
    ...
end with

Вам необходимо предварять каждый диапазон и ячейки с ., как .Range(...) и .Cells(...) для правильной работы with worksheets("sheet1").

В вашей собственной версии, если mylastcell_4 был установлен правильно, то это, вероятно, решило бы проблему.

.Range("A4").Autofill Destination:=.Range("A4:" & mylastcell_4.address), Type:=xlFillDefault

Вы настроили блок With Worksheet ... End With, после чего никогда не появлялся его для использования.

0 голосов
/ 24 октября 2018

Логика диапазона в VBA соответствует следующей структуре:

Range(A1:D1) -> Range(Cells(A1), Cells(D1)) -> 

Range(Cells(row number, column number), Cells(row number, column number)) -> 

Range(Cells(1, 1), Cells(1, 4)) ... And then you can replace 1,1 & 1,4 with variables..

Возможно, это работает, но я думаю, что ваш диапазон, возможно, придется изменить / уточнить.Не ясно, чего вы пытаетесь достичь (что вы хотите, чтобы код делал, каков ваш ожидаемый результат) .., но это может стоить попробовать:

ActiveCell.AutoFill Destination:=Range(ActiveCell, ActiveCell.Offset(0, 1).End(xlRight).Offset(0, -1))

Я хочу призвать вас, продолжай учить VBA:) !!!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...