Гость
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Из диапазона в массив / 3 сообщений из 3, страница 1 из 1
18.09.2019, 11:13
    #39863210
ferzmikk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Из диапазона в массив
Здравствуйте!

На excel-ом листе на первой колонке есть данные. Нужно из этого диапазона затолкать в массив.

Есть макрос.
VBA
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
Option Explicit
Sub Procedure()
    Dim sheet As Worksheet
    Set sheet = ThisWorkbook.Sheets("Лист1")
    
    'Определяем последнюю строку
    Dim EndRow As Integer
    EndRow = sheet.UsedRange.Row + sheet.UsedRange.Rows.Count - 1
    
    'В массив присваиваем первый диапазон Range(Cells(1, 1), Cells(EndRow, 1))
    Dim Arr()
    Arr = sheet.Range(Cells(1, 1), Cells(EndRow, 1))
End Sub

Все работает, кроме случая, если на листе введена только ячейка cells(1,1). Выдает ошибку "Run-time '13': Type mismatch" . Range создает двумерный массив, и там число ячеек больше 1. А поскольку в диапазоне всего одна ячейка, то выдает ошибку.

Доработал макрос. Получилось так
VBA
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
Option Explicit
Sub Procedure()
    Dim sheet As Worksheet
    Set sheet = ThisWorkbook.Sheets("Лист1")
    
    'Определяем последнюю строку
    Dim EndRow As Integer
    EndRow = sheet.UsedRange.Row + sheet.UsedRange.Rows.Count - 1
    
    'В массив присваиваем первый диапазон Range(Cells(1, 1), Cells(EndRow, 1))
    Dim Arr()
        
    If EndRow = 1 Then
        ReDim Arr(1 To 1, 1 To 1)
        Arr(1, 1) = sh.Cells(1, 1)
    Else
        Arr = sh.Range(Cells(1, 1), Cells(EndRow, 1))
    End If
End Sub

Работает. Но мне кажется получился костыль. Может быть надо было по другому написать более правильно и более универсально.

Как можно было написать более правильно?
...
Рейтинг: 0 / 0
18.09.2019, 11:48
    #39863238
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Из диапазона в массив
Простейшее решение:
Код: vbnet
1.
Arr = sheet.Range(Cells(1, 1), Cells(EndRow+1, 1))


и заведомо чхать на последний, пустой, элемент (который, кстати, очень удобно использовать в качестве временной переменной - при сортировке там или ещё какой обработке). Либо, если уж сильно прёт, то Transpose, ReDim, Transpose.

Только какой смысл в отдельном получении EndRow, когда можно сразу использовать sheet.UsedRange.Columns(1).Value и sheet.UsedRange.Columns(1).Cells.Count?
...
Рейтинг: 0 / 0
18.09.2019, 12:01
    #39863252
ferzmikk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Из диапазона в массив
Akina,

Спасибо!
...
Рейтинг: 0 / 0
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Из диапазона в массив / 3 сообщений из 3, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]