Страницы: 1
RSS
Как правильно поместить данные в массив?, ошибка "Требуется объект". Как можно исправить?
 
Здравствуйте! :)

Помогите мне, пожалуйста, разобраться с массивами.

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

Что я хотела сделать:

1. Объявить массив с типом данных Variant
2. Указать размеры этого массива
3. Скопировать его и вставить во вновь созданный лист для того, чтобы понять, верно ли я задала его размерность.
4. Сначала попробовать объявить двухмерный массив, а в следующем макросе - динамический, и так же его скопировать-вставить, чтобы понять, копируется то, что я хочу, или я не так задаю его размеры.

Во вложении мой файл.
Вот макрос, посмотрите, пожалуйста, что с ним не так. Выдает ошибку Object required - требуется объект - но в моем понимании объектом выступает arrTable, мой массив, и я указала, на каком листе он находится и в каких ячейках (arrTable = Worksheets("Решение").Range("A1:C10"))

Код
Option Explicit

Sub Zadacha_2()
Application.ScreenUpdating = False 'инструкция для отключения обновления экрана во время отработки кода (д/быстродействия)

Dim arrTable As Variant 'переменная variant для таблицы-массива

arrTable = Worksheets("Решение").Range("A1:C10") 'где находится массив, обозначение его границ
arrTable.Copy 'копировать массив
Sheets.Add After:=ActiveSheet 'создать новый лист после листа "Решение"

ActiveSheet.Paste 'вставить скопированный массив в новый лист
ActiveSheet.Name = "1" 'присвоить листу имя "1"

Application.ScreenUpdating = True 'д/включения обновления экрана
End Sub
 
Не Вы первый, кто наступает на эти грабли.
Да, можно так - не указывать, что именно хотите от диапазона. По умолчанию получаем значения... Но не всегда это так.

Код
arrTable = Worksheets("Решение").Range("A1:C10") 'где находится массив, обозначение его границ

Неправильный комментарий. Надо - заносим в массив диапазон. Именно "диапазон", а не его значения.
Объекты переменным присваиваются с помощью оператора Set. Но Вам же не это надо, Вы хотите поместить в массив значения?
Код
arrTable = Worksheets("Решение").Range("A1:C10").Value

Если при написании кода не экономить 6 символов, можно сэкономить кучу времени и нервов
 
arrTable - это в данном коде массив, не диапазон, его нельзя копировать как диапазон!
 
Hugo, его диапазон Range("A1:C10"), значит в коде я должна использовать Range("A1:C10") вместо arrTable?
 
Сделать задание не особо сложно, если бы не это условие:
"Все комментарии, содержащие одинаковое наименование города (Москва, Москва-СИТИ, Москва. Менеджер Петров.) должны попасть в одну группу."
Исходя из этих данных - можно как название города брать первое "слово", но тогда и название листа будет это слово, т.е. уже не получится "Санкт-Петербург", а всего лишь "Санкт".
Алгоритм может быть без всяких массивов/коллекций/словарей например таким:
1. цикл по диапазону городов
2. берём первое слово (сперва заменяем все точки и тире/минусы на пробел)
3. проверяем наличие в книге такого листа, если нет - то создаём и копируем в него первую строку (шапку)
4. копируем текущую проверяемую строку в первую свободную строку этого листа.
Всё.

Если заранее заготовить список всех возможных городов - тогда можно корректно обработать и Санкт-Петербург.
 
Цитата
vikttur написал:
Объекты переменным присваиваются с помощью оператора Set. Но Вам же не это надо, Вы хотите поместить в массив значения?
Виктор, я пока не поняла разницу между "присвоить объект переменной" и "поместить значение в массив". Поищу про это информацию.)))))

И почитаю про Set, спасибо Вам за помощь! :)  
 
"присвоить объект переменной" - это значит в переменной будет ссылка на объект, в данном случае на диапазон листа.
"поместить значение в массив" - это значит в МАССИВЕ будут только данные из этого диапазона, уже без привязки к диапазону, без всяких заливок/цвета/размера шрифта и т.д.
 
Код
Sub Zadacha_2()
Application.ScreenUpdating = False 'инструкция для отключения обновления экрана во время отработки кода (д/быстродействия)
Dim arrTable As Variant 'переменная variant для таблицы-массива
  arrTable = Worksheets("Решение").Range("A1:C10") 'где находится массив, обозначение его границ
  Sheets.Add After:=Sheets("Решение") 'создать новый лист после листа "Решение"
  ActiveSheet.Range("A1").Resize(UBound(arrTable), UBound(arrTable, 2)) = arrTable
  ActiveSheet.Name = "1" 'присвоить листу имя "1"
Application.ScreenUpdating = True 'д/включения обновления экрана
End Sub
 
в коде вы можете использовать все что угодно, если это не противоречит синтаксису языка и может быть выполнено компилятором
вот эта пара строк:
Код
arrTable = Worksheets("Решение").Range("A1:C10") 'где находится массив, обозначение его границ
arrTable.Copy 'копировать массив
не может быть выполнена компилятором, потому что у массива arrTable нет метода Copy а вы пытаетесь его вызвать, поэтому  и ошибка

и отвечая на вопрос заданный в теме, для оценки правильности размещения данных в массиве можно использовать следующий критерий:
если данные поместились в массив, значит данные помещены в массив правильно
Изменено: Ігор Гончаренко - 08.12.2019 19:11:07
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Спасибо ВАМ всем огромное за помощь! Буду читать-разбираться.  ;)  
 
Игорь, запутал! Собщение №5 не там разместил.
 
Цитата
vikttur написал:
Игорь, запутал! С
Вот ЖеЖ Ж….  :D
По вопросам из тем форума, личку не читаю.
 
Я смотрел в файл! Вроде ничего не напутал.
 
Да, там у меня в файле это задание есть, сообщение Hugo разместил в этой ветке и ничего не перепутал!
Просто мой вопрос пока касался только массивов, потому что до самого задания я еще не дошла, а зависла на первом шаге.

Просто видимо надо было из файла убрать задание, чтобы вас не путать, т.к. пока не по нему вопрос. Извините)
Изменено: suricat555 - 08.12.2019 20:14:11
 
Тема о городах с дефисами
Здесь я файл не смотрел, поэтому решил, что Игорь писал сообщение для той темы. Тем более, что здесь оно не по теме.
 
vikttur, Вить, это...  вроде премиальные от пари мы еще не перечисляли, а ты их уже проп…  :-)
По вопросам из тем форума, личку не читаю.
Страницы: 1
Наверх