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

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

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

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 04.10.2015, 21:28   #1
andreysuperman42
Пользователь
 
Регистрация: 31.03.2013
Сообщений: 43
Восклицание Преобразование базы данных

Всем здравствуйте.
Помогите преобразовать горизонтальную базу данных в вертикальную для последующей фильтрации по цене.
Желательно через форму.
Excel 2003.
Вложения
Тип файла: rar Вариант1.rar (13.0 Кб, 15 просмотров)
andreysuperman42 вне форума Ответить с цитированием
Старый 04.10.2015, 22:59   #2
doober
Старожил
 
Аватар для doober
 
Регистрация: 02.05.2009
Сообщений: 3,907
По умолчанию

Так должно работать?
Вложения
Тип файла: rar Косая база.rar (14.0 Кб, 11 просмотров)
Анализ,обработка данных Недорого
doober вне форума Ответить с цитированием
Старый 05.10.2015, 08:00   #3
andreysuperman42
Пользователь
 
Регистрация: 31.03.2013
Сообщений: 43
Хорошо Спасибо за помощь.

Использовал код doober, многое пока еще не понятно. Буду разбираться, как теперь отфильтровать по цене.
Спасибо еще раз.
Вложения
Тип файла: rar Вариант2.rar (14.8 Кб, 11 просмотров)
andreysuperman42 вне форума Ответить с цитированием
Старый 05.10.2015, 08:44   #4
AleksandrH
Форумчанин
 
Аватар для AleksandrH
 
Регистрация: 15.02.2010
Сообщений: 148
По умолчанию

andreysuperman42 а что значит
Цитата:
Желательно через форму
.?
почему не воспользоваться кодом doober и вывести на второй лист, например, создать вручную новый "Лист2"?

Код:
Sub smth()
    Set DictObject = CreateObject("scripting.dictionary")
    Set shtActiveSheet = Sheets("Лист1")
    Set shtDestination = Sheets("Лист2")
    lngFinalRow = shtActiveSheet.Cells(shtActiveSheet.Rows.Count, 1).End(xlUp).Row    ' Находим последнюю строку
    lngFinalColumn = shtActiveSheet.Range("iv1").End(xlToLeft).Column    ' Находим последний столбец
    myArray = shtActiveSheet.Range(Cells(1, 1), Cells(lngFinalRow, lngFinalColumn))    ' Создаем массив
    
    For lngCounterArray = 2 To UBound(myArray)
        Дата = myArray(lngCounterArray, 1)
        Организация = myArray(lngCounterArray, 2)
        For lngCounterColumns = 3 To lngFinalColumn Step 3
            Товар = shtActiveSheet.Cells(lngCounterArray, lngCounterColumns)
            If Товар <> "" Then
                колво = shtActiveSheet.Cells(lngCounterArray, lngCounterColumns + 1)
                Цена = shtActiveSheet.Cells(lngCounterArray, lngCounterColumns + 2)
                Key = Дата & "|" & Организация & "|" & Товар & "|" & Цена
                If DictObject.Exists(Key) Then
                    DictObject.Item(Key) = DictObject.Item(Key) + колво
                Else
                    DictObject.Item(Key) = колво
                End If
            End If
        Next lngCounterColumns
    Next lngCounterArray
    Keys = DictObject.Keys
    ReDim Result(4, UBound(Keys))
    shtDestination.Cells.ClearContents
    For lngCounterArray = 0 To UBound(Keys)
        Key = Keys(lngCounterArray)
        Z = Split(Key, "|")
        колво = DictObject.Item(Key)
        shtDestination.Cells(lngCounterArray + 1, 1) = Z(0)
        shtDestination.Cells(lngCounterArray + 1, 2) = Z(1)
        shtDestination.Cells(lngCounterArray + 1, 3) = Z(2)
        shtDestination.Cells(lngCounterArray + 1, 4) = колво
        shtDestination.Cells(lngCounterArray + 1, 5) = Z(3)
    Next
End Sub
WIX-FILTERS. A Filter for every application.
AleksandrH вне форума Ответить с цитированием
Старый 05.10.2015, 09:26   #5
andreysuperman42
Пользователь
 
Регистрация: 31.03.2013
Сообщений: 43
По умолчанию

Немного изменил код, чтобы включенный автофильтр не мешал.
Вместо:
Код:
lngFinalRow = shtActiveSheet.Cells(shtActiveSheet.Rows.Count, 1).End(xlUp).Row
Вставил:
Код:
       lngFinalRow = shtActiveSheet.UsedRange.Rows.Count
По поводу сообщения AleksandrH, не совсем понял, зачем мне создавать еще один лист? Это же влияет на скорость работы (база не маленькая). Ведь все и так работает неплохо.
andreysuperman42 вне форума Ответить с цитированием
Старый 05.10.2015, 12:39   #6
AleksandrH
Форумчанин
 
Аватар для AleksandrH
 
Регистрация: 15.02.2010
Сообщений: 148
По умолчанию

А как Вы здесь сортируете?
WIX-FILTERS. A Filter for every application.
AleksandrH вне форума Ответить с цитированием
Старый 05.10.2015, 13:47   #7
andreysuperman42
Пользователь
 
Регистрация: 31.03.2013
Сообщений: 43
По умолчанию

В первом варианте файла я сделал образец, как мне нужно, чтобы было отсортировано.
andreysuperman42 вне форума Ответить с цитированием
Старый 05.10.2015, 14:03   #8
AleksandrH
Форумчанин
 
Аватар для AleksandrH
 
Регистрация: 15.02.2010
Сообщений: 148
По умолчанию

Все равно я не понял какой критерий Вашей сортировки кроме как по дате. Ну да ладно, это Ваши данные и Вам лучше знать как должно быть ;-)
WIX-FILTERS. A Filter for every application.
AleksandrH вне форума Ответить с цитированием
Старый 05.10.2015, 16:47   #9
andreysuperman42
Пользователь
 
Регистрация: 31.03.2013
Сообщений: 43
Вопрос Еще вопрос!

С сортировкой разобрался, а вот как отфильтровать список по цене (взял, к примеру по "10"), не выходит. Не убираются пустые строки.

Файл прилагаю.
Вложения
Тип файла: rar Вариант3 фильтрация.rar (14.3 Кб, 12 просмотров)
andreysuperman42 вне форума Ответить с цитированием
Старый 05.10.2015, 18:25   #10
AleksandrH
Форумчанин
 
Аватар для AleksandrH
 
Регистрация: 15.02.2010
Сообщений: 148
По умолчанию

Код:
Private Sub UserForm_Initialize()

    Set DictObject = CreateObject("scripting.dictionary")
    Set shtActiveSheet = Sheets("Лист1")
    lngFinalRow = shtActiveSheet.UsedRange.Rows.Count    ' Находим последнюю строку
    lngFinalColumn = shtActiveSheet.Range("iv1").End(xlToLeft).Column    ' Находим последний столбец
    myArray = shtActiveSheet.Range(Cells(1, 1), Cells(lngFinalRow, lngFinalColumn))    ' Создаем массив
    For lngCounterArray = 2 To UBound(myArray)
        Дата = myArray(lngCounterArray, 1)
        Организация = myArray(lngCounterArray, 2)
        For lngCounterColumns = 3 To lngFinalColumn Step 3
            Товар = shtActiveSheet.Cells(lngCounterArray, lngCounterColumns)
            Цена = shtActiveSheet.Cells(lngCounterArray, lngCounterColumns + 2) '<------
            If Товар <> "" And Цена = 10 Then '<------
                Колво = shtActiveSheet.Cells(lngCounterArray, lngCounterColumns + 1)
                'Цена = shtActiveSheet.Cells(lngCounterArray, lngCounterColumns + 2) '<------
                Key = Дата & "|" & Организация & "|" & Товар & "|" & Цена
                If DictObject.Exists(Key) Then
                    DictObject.Item(Key) = DictObject.Item(Key) + Колво
                Else
                    DictObject.Item(Key) = Колво
                End If
            End If
        Next lngCounterColumns
    Next lngCounterArray
    Keys = DictObject.Keys
    ReDim Result(4, UBound(Keys))
    For lngCounterArray = 0 To UBound(Keys)
        Key = Keys(lngCounterArray)
        Z = Split(Key, "|")
        If Z(3) = 10 Then
            Колво = DictObject.Item(Key)
            Result(0, lngCounterArray) = Z(0)
            Result(1, lngCounterArray) = Z(1)
            Result(2, lngCounterArray) = Z(2)
            Result(3, lngCounterArray) = Колво
            Result(4, lngCounterArray) = Z(3)
        Else
            DictObject.Remove (Key)    ' НЕ УДАЛЯЕТ ПУСТУЮ СТРОКУ
        End If
    Next
    UserForm1.ListBox1.Column() = Result
End Sub
WIX-FILTERS. A Filter for every application.
AleksandrH вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Создание новой базы данных с использованием данных из старой Ruslan VDK Помощь студентам 0 19.04.2015 15:25
Проектирование базы данных в Postgres: выбор типа данных между TEXT и VARCHAR Blondy Общие вопросы по программированию, компьютерный форум 6 06.03.2014 02:09
Преобразование базы данных в Excel2007 Skolot Microsoft Office Excel 8 27.01.2012 19:51
Преобразование базы данных Access в формат SQL Server Alar Microsoft Office Access 5 18.04.2010 01:46