Репликация значений - PullRequest
1 голос
/ 02 мая 2020

Нужна небольшая помощь здесь.

На вкладке «Данные» я хочу скопировать значения в столбце «c2: c1000» и вставить в столбец «a1» другой вкладки.

Это то, что я имею до сих пор,

Dim x As Long
Dim lastRow As Long

lastRow = Worksheet("Data").Cells(3, Columns.Count).End(xlUp).Column

For x = 1 To lastRow
    If Worksheets("Sheet2").Cells(2, "A") = "" Then
        Worksheets("Data").Range("c2:c1000").Copy Destination:=Worksheets("Sheet2").Range(1, "A")

        Sheets("Sheet2").Range("A1").Value = Format(Now, "mm/dd/yyyy HH:mm:ss")

    Else
        Worksheets("Data").Range("c2:c1000").Copy Destination:=Worksheets("Sheet2").Cells(2, 
        Columns.Count).End(xlToLeft).Offset(, 1)
       'Sheets("Sheet2").Range("A1").Value = Format(Now, "mm/dd/yyyy HH:mm:ss") --> can't figure how to increment this as this will need to be on the subsequent empty column 
End If

Next
End Sub

Ваша помощь будет высоко оценена! Спасибо.

Ответы [ 2 ]

0 голосов
/ 02 мая 2020

Вставка значений сначала в диапазон A1 и вниз, а затем в следующий раз в ячейку B1 и т. Д., Не оставляет места для отметки времени до A1, B1 и c. Итак, я предполагаю, что вы хотели бы вставить случайные значения в строку 2. Поэтому ячейки A1, B1, ... оставлены для отметки времени.

Внутри операторов With мы можем ссылаться на свойства wsAudit. поэтому мы можем заменить «Рабочие листы (« Аудит »)». ссылка только с "."

Выражение column.count просто проверяет количество столбцов на листе. Выражение .Cells (2, Columns.Count) просто указывает на последнюю ячейку в строке 2. Затем .End (xlToLeft) .Column просматривает этот столбец слева и должен найти последнюю непустую ячейку в этой строке. По сути, это та же идея, что на листе Excel вы бы go поместили ячейку XDF2 и нажали CTRL + стрелка влево на клавиатуре. Но вместо того, чтобы активировать ячейку, мы просто хотим получить индексный номер столбца, а затем добавить 1 (новый столбец) и сохранить его в переменной. Теперь новый столбец известен. Выражение Range (.Cells (2, newColAudit), .Cells (1000, newColAudit)). Значение действительно такое же, как, например, Range ("B2: B1000"), но при этом мы можем вместо этого использовать индексные числа строк и столбцов. , Это полезно, поскольку номер столбца меняется.

И, как указал Сэмюэл, операции копирования и вставки можно избежать, установив равные области.

Dim wsAudit As Worksheet
Dim newColAudit As Long

Set wsAudit = Worksheets("Audit")

With wsAudit
    newColAudit = .Cells(2, Columns.Count).End(xlToLeft).Column + 1
    Range(.Cells(2, newColAudit), .Cells(1000, newColAudit)).Value = Worksheets("Data").Range("C2:C1000").Value
    .Cells(1, newColAudit).Value = Format(Now, "mm/dd/yyyy HH:mm:ss")
End With
0 голосов
/ 02 мая 2020

Так же, как ваша переменная LastRow* для исходного листа, создайте переменную LastColumn для вашего листа назначения, которая найдет последний использованный столбец так же, как вы находите свою последнюю использованную строку.

Примерно так:

Dim LastColumn As Long
LastColumn = Sheets("Audit").Cells(1, Columns.Count).End(xlToLeft).Column

Затем используйте переменную следующим образом:

Destination:= Worksheets("Audit").Cells(1, LastColumn)

Кажется, что ваш код также противоречит вашему вопросу, в своем вопросе вы объяснили данные будут записываться на лист аудита в строке 1, каждый раз используя следующий столбец, но ваш код ищет значения в строке 2 в вашем выражении If:

If Worksheets("Audit").Cells(2, "A") = "" Then совпадает с If Worksheets("Audit").Range("A2") = "" Then ,

Если вы хотите проверить первый ряд, измените 2 на 1.

Чтобы помочь повысить эффективность ваших кодов :

(см. Также ссылку «как избежать выбора» в этом вопросе):

Вы можете добиться «копирования / вставки» без фактического использования методов «копирования» и «вставки», присваивая значение одного диапазона другому, например, так:

Worksheets("Audit").Cells(1, LastColumn).Resize(999, 1) = Worksheets("Data").Range("c2:c1000").Value

Примечание: Измените Resize Property строк в соответствии с исходным диапазоном (в этом случае вы хотите переместить значения из C2: C1000).


* Переменная LastRow немного сбивает с толку, так как ищет последний использованный столбец в строке 3.

Если он предназначен для поиска столбца, попробуйте переименовать его, чтобы избежать путаницы в дальнейшем при отладке.

Если нужно найти последнюю строку, попробуйте так:
LastRow = Worksheet("Data").Cells(Rows.Count, 1).End(xlUp).Row

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