Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.06.2014, 14:20   #11
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,170
По умолчанию

() - массив, в данном случае можно и без скобок, в других случаях скобки могут мешать, но тут лучше с скобками
& - as Long
$ - as String
Лениво писать много букв
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Старый 12.06.2014, 14:22   #12
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

значит тип переменной см. здесь
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума Ответить с цитированием
Старый 12.06.2014, 16:26   #13
Dima_com
Пользователь
 
Регистрация: 29.11.2011
Сообщений: 40
По умолчанию

IgorGO спасибо большое.
Hugo121. Знаю что нагло но, помогите пожалуйста еще с алгоритмом что зачем вы делаете, та как к сожалению не совсем смог разобраться. А по дурацки просто вставить готовый фрагмент не хочется и все рамно сейчас под vbs переделываю.

И эту строку к сожалению никак не пойму
ReDim a((1 To tDic.Count + 1), (1 To cDic.Count + 1))

Последний раз редактировалось Dima_com; 12.06.2014 в 16:32.
Dima_com вне форума Ответить с цитированием
Старый 12.06.2014, 16:44   #14
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,170
По умолчанию

Есть хороший шанс не делать половину работы, если точно известно количество "дейлов" (их имена не важны, код сам определит):
Код:
Option Explicit

Sub tt()
    Dim a(), i&, t$, ti&, ci&, d As Date, s$, k
    Dim tDic As Object, cDic As Object
    Dim tm!: tm = Timer

    Set tDic = CreateObject("Scripting.Dictionary"): tDic.comparemode = 1
    Set cDic = CreateObject("Scripting.Dictionary"): cDic.comparemode = 1

    a = [a1].CurrentRegion.Value
    ReDim b(1 To UBound(a) + 1, 1 To 5)

    ti = 1: ci = 1
    For i = 1 To UBound(a)

        d = a(i, 1): s = CStr(d)
        If Not tDic.exists(s) Then
            ti = ti + 1: tDic.Item(s) = ti
        End If

        t = CStr(a(i, 2))
        If Not cDic.exists(t) Then
            ci = ci + 1: cDic.Item(t) = ci
        End If

        b(tDic.Item(s), 1) = d
        b(tDic.Item(s), cDic.Item(t)) = a(i, 3)

    Next
    
    With cDic
        For Each k In .keys
            b(1, .Item(k)) = k
        Next
    End With
    
    With [m2].Resize(tDic.Count + 1, UBound(b, 2))
        .Columns(1).NumberFormat = "m/d/yyyy h:mm"
        .Value = b
    End With

    MsgBox "Выполнено за " & Round(Timer - tm, 3) & " s"

End Sub
Так сэкономим целую секунду!

Только у Вас там некоторые Гайки с пробелами - это нужно убрать до запуска кода.
Ну и нет отслеживания конфликтов!
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Старый 12.06.2014, 16:49   #15
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,170
По умолчанию

Цитата:
Сообщение от Dima_com Посмотреть сообщение
И эту строку к сожалению никак не пойму
ReDim a((1 To tDic.Count + 1), (1 To cDic.Count + 1))
У меня там скобок поменьше.
В vbs кажется не работает redim(от до) - там только конечный размер задавался, если не путаю.
А что где как - это сейчас некогда комментировать.
Да и кода два - может проще второй будет понять, там и словарей почти вполовину меньше
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Старый 12.06.2014, 16:52   #16
Dima_com
Пользователь
 
Регистрация: 29.11.2011
Сообщений: 40
По умолчанию

Прошу прошения проблема чуть в другом я не до конца понимаю ваш алгоритм.
Объясните пожалуйста какую роль играют 3 словаря и как они последовательно перебираются. И что значат эта запись:
Код:
 With [m2].Resize(tDic.Count + 1, UBound(b, 2))
Нет количество персонажей мне заранее не известно.

Пс позже увидел что вы уже ответили.

Последний раз редактировалось Dima_com; 12.06.2014 в 17:09.
Dima_com вне форума Ответить с цитированием
Старый 12.06.2014, 17:11   #17
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,170
По умолчанию

1. tDic - словарь времени
2. cDic - словарь "cipov-deilov"
3. mDic - main-словарь, сюда собираю исходные данные. Для каждой уникальной пары время-персонаж хранится действие.
Заполняем сразу всё одним проходом по массиву данных.
В tDic хранится время с номером строки, в cDic персонажи с номером столбца.
Когда всё собрано - известно какой итоговый массив нужен, его создаём, и циклом по mDic раскладываем действия по местам - координаты время/персонаж берём из словарей tDic/cDic.

Вообще сейчас заметил тонкое место - лучше сделать такую замену:
Код:
    '    i = 1: For Each k In tDic.keys
    '        i = i + 1: a(i, 1) = CDate(k)
    '    Next

    '    i = 1: For Each k In cDic.keys
    '        i = i + 1: a(1, i) = k
    '    Next

    For Each k In tDic.keys
        a(tDic.Item(k), 1) = CDate(k)
    Next
    
    For Each k In cDic.keys
        a(1, cDic.Item(k)) = k
    Next
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Старый 17.06.2014, 14:01   #18
Dima_com
Пользователь
 
Регистрация: 29.11.2011
Сообщений: 40
По умолчанию

Спасибо большое доделал - переделал - работает(вроде более-менее красиво).
По итогам проделанной работы понял что самая быстрая работа макросов достигается использованием виртуальных массивов
Код:
a = [a1].CurrentRegion.Value
и лучше проводить операции не именно с ними а использовать дополнительные словари/массивы а в основной массив вносить изменения и его сохранять как результат.
Hugo121, спасибо, это мой приблизительно 5 скрипт на vbs и только сейчас узнал эту простую истину.
И конечно, спасибо всему форуму!

Последний раз редактировалось Dima_com; 17.06.2014 в 14:04.
Dima_com вне форума Ответить с цитированием
Старый 17.06.2014, 14:33   #19
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,170
По умолчанию

В общем случае в этот [a1].CurrentRegion.Value может попасть и например пара сотня столбцов, которые совершенно не нужно анализировать. Да и на такой объём может и памяти не хватить...
Это я к тому, что всё зависти от задачи и конкретного файла - есть смысл брать в массив только нужные данные (можно сделать например 10 параллельных массивов по паре столбцов, если между нужными много лишних столбцов).
Чем меньше берёте в массив - тем быстрее всё шевелится и меньше нужно памяти.
Но конечно анализировать данные нужно только в массивах, а если нужно иногда посмотреть и на формат - то тогда по этому индексу идём на лист за форматом. Так будет быстрее.
И аналогично с результатом - если волнуют только данные, то всё можно делать через массивы. Если ещё и формат - то это уже делаем на листе. Как вариант - есть массив данных и массив с значением формата (например интересует только заливка или цвет шрифта). Вывалили на лист данные, затем можно перебором массива собрать строку адресов диапазонов с одинаковым форматом, сразу весь диапазон изменить. Или через union, если строка слишком длинная получается и делать частями неудобно.

Если только начинаете писать vbs - то столкнётесь с тем, что vbs не знает констант Экселя, давайте ему значения - их можно подсмотреть в object browser редактора VBA.
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как сгруппировать 2 запроса между собой? Predator199 PHP 4 09.08.2012 22:56
Пожобрать текстовые данные димон4ик_ Помощь студентам 2 23.10.2011 11:25
как сгруппировать строки в Excel? biv Microsoft Office Excel 36 04.09.2010 15:00
Формулы массива или сгруппировать данные kzld Microsoft Office Excel 10 30.11.2009 18:59
текстовые данные в С++ Giffon Общие вопросы C/C++ 4 29.11.2009 22:39