У меня есть предварительно отформатированный отчет электронной таблицы с ячейками, отформатированными как ниже:

A           B         C        D
                               Week1 Week2
CUSTOMER A  PRODUCT A MEASURE A
                      MEASURE B
                      MEASURE C
CUSTOMER B  PRODUCT B MEASURE A
                      MEASURE B
                      MEASURE C

Отчет может содержать тысячи строк. Мне нужно удалить ячейки в столбцах A и B, в результате чего получится 3 блока ячеек со строкой, содержащейся в первом ряду блока. А2 в этом случае.

Мне нужно автозаполнить ячейки в столбцах A и B, чтобы получить следующую ситуацию:

CUSTOMER A PRODUCT A MEASURE A
CUSTOMER A PRODUCT A MEASURE B
CUSTOMER A PRODUCT A MEASURE C
CUSTOMER B PRODUCT B MEASURE A
CUSTOMER B PRODUCT B MEASURE B
CUSTOMER B PRODUCT B MEASURE C

Значения должны быть заполнены автоматически в 2 строки или до ячейки, содержащей значение, не равное значению автозаполнения. Затем это значение должно быть заполнено до следующих 2 строк, переключено на значение, содержащееся в третьей ячейке и так далее.

Это должно продолжаться до последней строки 1, содержащей значения (последняя строка содержит дату и время).

Я хотел бы сделать это с помощью цикла VBA. Столбцы A, B и C всегда являются строками, а значения, начиная со столбца D и далее, являются числами.

1 ответ1

0

Надеюсь, это то, что вам нужно. Я добавил комментарии над каждой важной строкой, чтобы вы могли отслеживать происходящее и вносить коррективы по мере необходимости.

Это предполагает, что ваши данные в столбце C представляют строки, с которыми вам нужно работать. Вы сказали, что это должно продолжаться до последней строки - 1, так как последняя строка содержит дату + время ... ну, пока столбец C не содержит дату + время, тогда все будет хорошо:

Dim myData As Range

'Set a range by figuring out the length of your data based on column C data:
Set myData = Range("C2", Range("C2").End(xlDown))

'create two blank variables that we'll use
'to store data later:
colAdata = ""
colBdata = ""

'Loop through each row in the 'myData' range:
For Each cell In myData

    'First, unmerge cells that are merged in columns A&B:
    If cell(1, -1).MergeCells = True Then cell(1, -1).UnMerge
    If cell(1, 0).MergeCells = True Then cell(1, 0).UnMerge

    'Check if column A has data, and if so, grab its value and
    'column B's value for use in the next iteration:
    If cell(1, -1).Value <> "" Then
        colAdata = cell(1, -1).Value
        colBdata = cell(1, 0).Value
    Else 'it's blank so enter the data from the row above:
        cell(1, -1).Value = colAdata
        cell(1, 0).Value = colBdata
    End If

Next

Надеюсь, это поможет, дайте мне знать, как это происходит.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .