Форум по VBA и MS Office

VBA, Excel => VBA, макросы в Excel => Тема начата: Посетитель от 02 февраля 2021, 19:34

Название: Excel VBA Макросы. Макрос Excel удаляет нужные ячейки при вставке массива на лист.
Отправлено: Посетитель от 02 февраля 2021, 19:34
Нужна помощь в исправлении макроса.

Макрос копирует из листа 1 на лист 2 столбцы A, B, C при условии, если заполнен столбец A. Однако, если попробовать написать на листе 2 что-нибудь в столбцах D, E, F и тд, и перейти со 2 листа на 1, то он стирает все, что было написано на листе 2.

Как можно исправить макрос, чтобы он копировал нужные ячейки на лист 2 и не стирал с него всё остальное?

Макрос
Private Sub Worksheet_Activate()
    Dim a(), i&, ii&, x&
    a = Sheets(1).UsedRange.Value
    ReDim b(1 To UBound(a, 1), 1 To UBound(a, 1))
    For i = 1 To UBound(a)
        If Len(a(i, 1)) Then
            ii = ii + 1
                b(ii, 1) = a(i, 1) 'столбец A
                b(ii, 2) = a(i, 2) 'столбец B
                b(ii, 3) = a(i, 3) 'столбец C
        End If
    Next
    [a1].Resize(ii, UBound(b, 1)) = b
End Sub
[свернуть]

[вложение удалено администратором]
Название: Re: Excel VBA Макросы. Макрос Excel удаляет нужные ячейки при вставке массива на лист.
Отправлено: Администратор от 03 февраля 2021, 06:08
В этой строке:
ReDim b(1 To UBound(a, 1), 1 To UBound(a, 1))
после запятой зачем вы создаёте столько столбцов, сколько строк в массиве "a"? На первый взгляд нелогично.

Достаточно так написать, ведь вам заранее известно, что будет три столбца:
ReDim b(1 To UBound(a, 1), 1 To 3)

Поэтому и стираются значения в столбцах после столбца C. Т.к. в массиве "b" в данном случае вы создаёте 6 столбцов и затем вставляете массив "b" на лист 2 и данные также записываются в 6 столбцов, т.е. в столбцы с A по F.

И эту строку нужно так записать:
[a1].Resize(ii, UBound(b, 2)) = b

UBound(b, 2) - это количество столбцов в массиве "b". А в вашей версии вы указываете количество строк в массиве "b".