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

Есть куб, выгружаются оттуда данные и размещаются на листе. Потом макросом считываются данные с таблицы и заносятся в объект. Поскольку в этом файле таблица на "Лист2" будет как простой пример выгрузки из куба

Задача макроса. Создается массив объетов ТТ - пользовательский тип структурных данных . В этом объекте сохраняется информация о торговой точке. Считываем данные по ТТ. В таблице ТТ отсортированы. По соответсвующим ТТ в объект ТТ сохраняем название ТТ, клиента, а также заносим отгрузки по SKU.

Написан алгоритм считывания данных по ТТ и занесение в объекты ТТ. Я сильно сомневаюсь, что этот алгоритм оптимально написан. Как можно написать этот алгоритм более оптимально? Учитывая такой момент, что будет очень много строк и колонок. Возможно потом будут добавляться еще колонки. А также в объекте ТТ будет много свойств. Хотелось бы макрос написать в стиле 1С: с использованием вложенными процедурами, что позволяет легко дорабатывать и не сломать код.

1. Как Вы оцениваете идею считывания данных (сравнение текущей и предыдущей строки, при отсортированных ТТ)?

2. Исходя из данной задачи может лучше заносить данные не в массив, а в Collection, ListObject, использовать ADO (хотя там не все SQL функции работают) или использовать какую нибудь другую технологию?

3. По поводу мобильности кода как в типовых конфигурациях в 1С как написать макрос, чтобы не приходилось каждый раз дописывать код, если добавляются или изменятся колонки? Или хотя бы дописывать в одном месте?

4. Скажем, создается массив из 10 000 элементов,который помещается объект ТТ. Вообще насколько оптимально создавать такой объект и помещать в массив? Может в этом случае есть смысл создавать объект по другому?

Модератор: Тема перенесена из форума "Visual Basic".
...
Рейтинг: 0 / 0
27.05.2016, 11:11
    #39244670
Hugo121
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопросы по поводу оптимальности кода
В строке
Код: vbnet
1.
ИсходныеДанные() = ThisWorkbook.Sheets("Лист2").Range(Cells(2, 1), Cells(КоличествоСтрокИД + 1, КоличествоКолонокИД)).Value


ошибка, которая может быть критической - тут не указано чьи cells берёте, они буду браться из листа "по умолчанию" (в данном случае активного).
По остальному ничего не скажу...
...
Рейтинг: 0 / 0
27.05.2016, 11:45
    #39244716
ferzmikk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопросы по поводу оптимальности кода
Hugo121В строке
Код: vbnet
1.
ИсходныеДанные() = ThisWorkbook.Sheets("Лист2").Range(Cells(2, 1), Cells(КоличествоСтрокИД + 1, КоличествоКолонокИД)).Value


ошибка, которая может быть критической - тут не указано чьи cells берёте, они буду браться из листа "по умолчанию" (в данном случае активного).
По остальному ничего не скажу...
И как правильно написать?
...
Рейтинг: 0 / 0
27.05.2016, 11:55
    #39244728
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопросы по поводу оптимальности кода
ferzmikkкак правильно написать?
Во-первых, Вы работаете всё время с одним листом, но всё время идёте к нему "от головы". Один раз сделайте ссылку на лист:
Код: vbnet
1.
2.
Dim ThisSheet As Worksheet
Set ThisSheet = ThisWorkbook.Sheets("Лист2")


и в дальнейшем во всём коде указывайте именно его, причём везде. Например, для указанной строки это будет
Код: vbnet
1.
ИсходныеДанные() = ThisSheet.Range(ThisSheet.Cells(2, 1), ThisSheet.Cells(КоличествоСтрокИД + 1, КоличествоКолонокИД)).Value


И быстрее, и точно указано, какая из многочисленных коллекций Cells используется.
...
Рейтинг: 0 / 0
27.05.2016, 11:59
    #39244735
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопросы по поводу оптимальности кода
Кстати, можно аналогично поступить и с другими часто используемыми объектами, скажем
Код: vbnet
1.
2.
Dim ThisListObject As ListObject
Set ThisListObject = ThisSheet.ListObjects(1)


и т.п.

Но самое главное - добавьте во все модули Option Explicit и определите все используемые в коде переменные как имеющие строго определённый тип.
...
Рейтинг: 0 / 0
27.05.2016, 12:00
    #39244737
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопросы по поводу оптимальности кода
Что же до собственно решаемой макросом задачи - то из описания тут ни хрена не понять. а разбираться, что там в коде наверчено, тупо лениво и неинтересно.
...
Рейтинг: 0 / 0
27.05.2016, 12:43
    #39244793
Hugo121
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопросы по поводу оптимальности кода
Можно сократить букв:
Код: vbnet
1.
2.
3.
With ThisSheet
ИсходныеДанные() = .Range(.Cells(2, 1), .Cells(КоличествоСтрокИД + 1, КоличествоКолонокИД)).Value
End With
...
Рейтинг: 0 / 0
27.05.2016, 12:50
    #39244799
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопросы по поводу оптимальности кода
Это только для одного объекта - WITH не бывают вложенные :(
Ну и... это действительно только сокращение количества байтов в коде - с точки зрения быстродействия With оправдан только если в качестве его "аргумента" используется НЕ переменная, а квалифицированный суб-объект.
...
Рейтинг: 0 / 0
27.05.2016, 13:00
    #39244819
Hugo121
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопросы по поводу оптимальности кода
Бывают :)
Если конечно во вложенном не нужно обращаться и к невложенному тоже. Но тут ведь не нужно.
...
Рейтинг: 0 / 0
27.05.2016, 13:02
    #39244824
Hugo121
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопросы по поводу оптимальности кода
Код: vbnet
1.
2.
3.
4.
5.
With ThisWorkbook
With .Sheets(1)
MsgBox .[a1]
End With
End With
...
Рейтинг: 0 / 0
27.05.2016, 13:19
    #39244846
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопросы по поводу оптимальности кода
Hugo121БываютДа, сорри... видать, о чём-то ещё подумал.
...
Рейтинг: 0 / 0
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Вопросы по поводу оптимальности кода / 11 сообщений из 11, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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