0 / 0 / 0
Регистрация: 15.02.2011
Сообщений: 18
Excel

Чтение в массив полей таблицы Excel

15.02.2011, 11:22. Показов 26342. Ответов 18
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день, появилась необходимость написать некий макрос, с VBA столкнулся впервые. Нагуглить внятный пример не получилось, может подкинете, а там я уже интуитивно разберусь, думаю) Спасибо.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
15.02.2011, 11:22
Ответы с готовыми решениями:

Нарезка excel таблицы в новые excel таблицы
Добрый день. Подскажите макрос для Exel'я Есть таблица (без формул). Нужно из таблицы...

Обращение из Word макроса в файл Excel и чтение данных с таблицы
Sub Foo() Public objExcelApp As Object Public mySettings As Object On Error Resume...

Слияние с таблицей Excel через форму Excel
У меня есть форма в еселе, которая подготавливает одну строчку (информацию) для слияния с...

18
2309 / 1541 / 115
Регистрация: 13.06.2009
Сообщений: 5,575
15.02.2011, 11:46
teCa,
массив одномерный или двумерный?
0
0 / 0 / 0
Регистрация: 15.02.2011
Сообщений: 18
15.02.2011, 12:15  [ТС]
Двумерный
0
2309 / 1541 / 115
Регистрация: 13.06.2009
Сообщений: 5,575
15.02.2011, 12:17
teCa,
поля в Excel, которые нужно поместить в массив, смежные или нет?
0
0 / 0 / 0
Регистрация: 15.02.2011
Сообщений: 18
15.02.2011, 12:22  [ТС]
Поля смежные, те все в одну строку.
0
2309 / 1541 / 115
Регистрация: 13.06.2009
Сообщений: 5,575
15.02.2011, 12:25
teCa,
приведите пример диапазона ячеек, который нужно прочитать в массив.
0
0 / 0 / 0
Регистрация: 15.02.2011
Сообщений: 18
15.02.2011, 12:28  [ТС]
Первая строка B7:Q7 и до первой пустой строки.
0
2309 / 1541 / 115
Регистрация: 13.06.2009
Сообщений: 5,575
15.02.2011, 12:55
Есть 2 способа создания массивов для всех программ Office:
  1. создание на пластинке оперативной памяти непосредственно массива, например:
    Visual Basic
    1
    
    Dim myArray(1) As Long
  2. создание на пластинке оперативной памяти переменной, а затем превращение этой переменной в массив, например:
    Visual Basic
    1
    2
    
    Dim myArray As Long
    myArray = Split(Данные)
Но для отдельных программ Office есть свои собственные способы создания массивов. Например, в Excel можно создать массив, поместив в переменную 2 и более ячеек из таблицы Excel. Я как раз и приведу такой пример.
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
Sub m_1()
Dim LastRow As Long
Dim myArray As Variant
'Сохранение книги, чтобы можно было определить последнюю
'заполненную строку.
If ActiveWorkbook.Saved = False Then
    ActiveWorkbook.Save
End If
LastRow = Cells.SpecialCells(xlCellTypeLastCell).Row
myArray = Range("B7:Q" & LastRow)
End Sub
В данном случае элементы массива нумеруются по умолчанию с единицы (в VB элементы массива нумеруются по умолчанию с нуля).
И создать двумерный массив в таком случае возможен если столбцы смежные.
1
 Аватар для Sasha_Smirnov
5562 / 1370 / 150
Регистрация: 08.02.2009
Сообщений: 4,109
Записей в блоге: 30
15.02.2011, 13:18
Цитата Сообщение от teCa Посмотреть сообщение
Первая строка B7:Q7
Так что же это получится?

Ну, скажем, LastRow = 8. myArray заполнится диапазоном B7:Q8?
0
2309 / 1541 / 115
Регистрация: 13.06.2009
Сообщений: 5,575
15.02.2011, 13:28
В пункте #8 во втором коде ошибка: переменные, предназначенные для массивов, всегда должны иметь тип Variant (у меня указано Long).

Добавлено через 2 минуты
Цитата Сообщение от Sasha_Smirnov Посмотреть сообщение
Ну, скажем, LastRow = 8. myArray заполнится диапазоном B7:Q8?
да, именно так.
0
 Аватар для Sasha_Smirnov
5562 / 1370 / 150
Регистрация: 08.02.2009
Сообщений: 4,109
Записей в блоге: 30
15.02.2011, 13:43
Хорошо, что Variant!

Так значит, ежели, например, в B7 пусто, то myArray(1)=Empty?

(Я бы сам испытал, но пока некогда.)
0
2309 / 1541 / 115
Регистрация: 13.06.2009
Сообщений: 5,575
15.02.2011, 13:52
Sasha_Smirnov,
Так значит, ежели, например, в B7 пусто, то myArray(1)=Empty?
да, только что проверил.
Только не в myArray(1), а в myArray(1,1).
Есть ещё особенность в создании массивов из Excel - всегда создаётся двумерный массив, даже если в массив помещается один столбец.
0
0 / 0 / 0
Регистрация: 15.02.2011
Сообщений: 18
15.02.2011, 13:55  [ТС]
А как вернуть число строк массива?
0
2309 / 1541 / 115
Регистрация: 13.06.2009
Сообщений: 5,575
15.02.2011, 13:58
Visual Basic
1
Debug.Print UBound(myArray, 1)
(View - Immediate Window)
1
0 / 0 / 0
Регистрация: 15.02.2011
Сообщений: 18
15.02.2011, 14:17  [ТС]
И собственно последний штрих...
Как вызвать объект Outlook из макроса Excel?
Написал вот такой код, который создает событие в календаре пользователя:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
Set myItem = Application.CreateItem(1) 
    myItem.MeetingStatus = 1
    myItem.Subject = myArray(i, 4) & " (" & myArray(i, 2) & ")"
    myItem.Start = #2/15/2011 6:30:00 PM#
    myItem.Duration = 90
    MyAttendee = myArray(i, 7)
    If MyAttendee <> "" Then
        Set myRequiredAttendee = myItem.Recipients.Add(MyAttendee)
        myRequiredAttendee.Type = 1
    End If
    myItem.Send
Как заставить его работать из макроса Excel?

Пробую сделать так:
Visual Basic
1
2
3
Dim objOutlook As New Outlook.Application
 
Set myItem = objOutlook.CreateItem(1)
Но упираюсь в такую вот ошибку:
---------------------------
Microsoft Visual Basic
---------------------------
Compile error:

User-defined type not defined
---------------------------
ОК Справка
---------------------------
0
2309 / 1541 / 115
Регистрация: 13.06.2009
Сообщений: 5,575
15.02.2011, 14:25
teCa,
Чтобы работать с другими программами нужно сделать следующие шаги:
  1. Подключить библиотеку: Tools - References... - Microsoft Outlook Object Library.
  2. В коде записать команды.
Visual Basic
1
2
3
4
Sub m_1()
Dim Outlook As Outlook.Application
Set Outlook = CreateObject("Outlook.Application")
End Sub
Далее обращаемся к Outlook через переменную Outlook, как будто мы находимся в Outlook.
2
0 / 0 / 0
Регистрация: 15.02.2011
Сообщений: 18
15.02.2011, 14:34  [ТС]
Программа пытается отправить сообщение с помощью команды Item.Send
Программа пытается автоматически отправить сообщение электронной почты с помощью команды Item.Send языка Microsoft Visual Basic Application (VBA) из Microsoft Outlook. Чтобы разрешить программе отправку сообщения, нажмите кнопку Да. Чтобы остановить программу, нажмите кнопку Нет. Если неизвестно, из какой программы отправляется сообщение и почему, нажмите кнопку Нет, чтобы избежать возможного распространения вирусов.

Примечание. Кнопка Да недоступна в течение первых пяти секунд после отображения сообщения.
Опа, а с этим как бороться? То, 100строк - 500секунд, и 100 раз кнопку "ДА" нажать.
0
2309 / 1541 / 115
Регистрация: 13.06.2009
Сообщений: 5,575
15.02.2011, 14:36
teCa,
про Outlook не знаю ничего, сейчас др. занимаюсь, не могу помочь с этим.
Но это распространенная проблема, кажется, в Гугле смотрите.
0
 Аватар для dzug
695 / 236 / 18
Регистрация: 17.01.2011
Сообщений: 583
Записей в блоге: 1
16.02.2011, 09:07
Цитата Сообщение от teCa Посмотреть сообщение
А как вернуть число строк массива?
Перенести содержимое массива на лист можно с помощью функции FormulaArray :
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Sub a_1()   'Для одномерного массива
    'Описание массива из 10 элементов
    Dim x(1 To 10) As Long
    'Вычисление значений массива
    For j = 1 To 10
        x(j) = j * j
    Next j
    'Перенос содержимого массива во вторую строку листа
    Range(Cells(2, LBound(x)), Cells(2, UBound(x))).FormulaArray = x
End Sub
 
Sub A_2()      'Для двумерного массива в виде столбца
  'Описание массива расположенного в одном столбце
  Dim x(1 To 10, 1 To 1) As Long
  'Вычисление значений массива
  For j = 1 To 10
     x(j, 1) = j * j
  Next j
  'Перенос содержимого массива в столбец листа
  Range(Cells(LBound(x), 2), Cells(UBound(x), 2)).FormulaArray = x
End Sub
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
16.02.2011, 09:07
Помогаю со студенческими работами здесь

Заполнить шаблон формы в Excel из таблицы и сохранить в файл Excel
Доброго времени суток. Есть книга Excel. В ней 4 листа. На первом листе таблица с данными,...

Экспорт данных из таблицы Excel в Word или Excel по шаблонам
Всем здравствуйте! В продолжении темы созданной ранее...

В Excel Windows не работают пользовательские формы, написанные в Excel Mac. Что делать?
Доброго времени суток! Если конкретнее, Excel Windows не принимает объекты пользовательских...

Возможность получить инфу из листа книги excel ne открывая сам файл excel
Здравствуйтe. Как возможно взять/добавить данныe в опрeдeлeнную книгу, в опр. лист нe открывая сам...

Вывести на печать массив X, массив Z, массив Y, произведение элементов массива X, упорядоченный массив Y
Вывести на печать массив X, массив Z, массив Y, произведение элементов массива X, упорядоченный...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Опции темы

Новые блоги и статьи
Мысли в слух
kumehtar 07.11.2025
Заметил среди людей, что по-настоящему верная дружба бывает между теми, с кем нечего делить.
Новая зверюга
volvo 07.11.2025
Подарок на Хеллоуин, и теперь у нас кроме Tuxedo Cat есть еще и щенок далматинца: Хочу еще Симбу взять, очень нравится. . .
Инференс ML моделей в Java: TensorFlow, DL4J и DJL
Javaican 05.11.2025
Python захватил мир машинного обучения - это факт. Но когда дело доходит до продакшена, ситуация не так однозначна. Помню проект в крупном банке три года назад: команда data science натренировала. . .
Mapped types (отображённые типы) в TypeScript
Reangularity 03.11.2025
Mapped types работают как конвейер - берут существующую структуру и производят новую по заданным правилам. Меняют модификаторы свойств, трансформируют значения, фильтруют ключи. Один раз описал. . .
Адаптивная случайность в Unity: динамические вероятности для улучшения игрового дизайна
GameUnited 02.11.2025
Мой знакомый геймдизайнер потерял двадцать процентов активной аудитории за неделю. А виновником оказался обычный генератор псевдослучайных чисел. Казалось бы - добавил в карточную игру случайное. . .
Протоколы в Python
py-thonny 31.10.2025
Традиционная утиная типизация работает просто: попробовал вызвать метод, получилось - отлично, не получилось - упал с ошибкой в рантайме. Протоколы добавляют сюда проверку на этапе статического. . .
C++26: Read-copy-update (RCU)
bytestream 30.10.2025
Прошло почти двадцать лет с тех пор, как производители процессоров отказались от гонки мегагерц и перешли на многоядерность. И знаете что? Мы до сих пор спотыкаемся о те же грабли. Каждый раз, когда. . .
Изображения webp на старых x32 ОС Windows XP и Windows 7
Argus19 30.10.2025
Изображения webp на старых x32 ОС Windows XP и Windows 7 Чтобы решить задачу, использовал интернет: поисковики Google и Yandex, а также подсказки Deep Seek. Как оказалось, чтобы создать. . .
Passkey в ASP.NET Core identity
stackOverflow 29.10.2025
Пароли мертвы. Нет, серьезно - я повторяю это уже лет пять, но теперь впервые за это время чувствую, что это не просто красивые слова. В . NET 10 команда Microsoft внедрила поддержку Passkey прямо в. . .
Последние результаты исследования от команды MCM (октябрь 2025 г.)
Programma_Boinc 29.10.2025
Последние результаты исследования от команды MCM (октябрь 2025 г. ) Поскольку мы продолжаем изучать гены, которые играют ведущую роль в развитии рака, в рамках проекта "Картирование раковых. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru