Модераторы: mihanik
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Переворот таблицы набок, имена столбцов - в строки и наоборот 
:(
    Опции темы
dionisiu
Дата 2.6.2006, 15:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 170
Регистрация: 13.5.2006
Где: Крым

Репутация: нет
Всего: 2



Здравствуйте, уважаемые.
Возникла неожиданная пакость: мне урезали права доступа к 1С, из-за чего я не могу получать НОРМАЛЬНУЮ оборотную ведомость, а получаю динамику продаж склада, а это привело к нарушению логики работы моей автоматики.
Суть: 1С выдавала таблу со столбцами : Товар, приход, расход, цена, сумма .... (из-за последних мне доступ и подрезали). Взять из неё любую инфу формулой СУММЕСЛИ() - не проблема, что и делалось на протяжении года

Теперь выдаёт только таблу с полями : Клиент, Адрес, а дальше столбцы с наименованиями товара, который был продан за рассматриваемый период, причём клиенты разбиты по группам (типа "Восток", "Запад", "Город1", "Город2", "Пригород"...)
Всё бы ничего, но товары разбиты на группы по видам (Вода минеральная, Вода сладкая, Пиво КЕГовое, Пиво бутылочное...), каждая группа разбита на бренды (Минералка "ИСТОЧНИК", Минералка "Урюк".....), бренд делится на сорта ("ИСТОЧНИК" Сильногазированный, "Урюк" Негазированный,...), а сорта ещё и на упаковки (0,5л стекло, 1л ПЭТ, 5л ПЭТ, 0,25л ж/б ....)

Самая проблемная часть - это нерегулярность продаж КАЖДОГО товара и связанное с этим НЕПОСТОЯНСТВО количества и положения полей в таблице. То есть, сегодня продавались "Источник" С/Г 0,5л бут, "Урюк" 5л ПЭТ, "Урюк" С/Г 1л ПЭТ, соответственно табла будет иметь 5 столбцов (Клиент, Адрес и эти три)
Завтра к группе прибавятся продажи "Источника" Н/Г 1лПЭТ, причём 1С воткнёт его МЕЖДУ столбцом "Адрес" и ""Источник" С/Г 0,5л бут", то есть таблица изменит структуру. Если "послезавтра" будет продан "Урюк" 0,25 ж/б, то он попадёт между "Урюк" 5л ПЭТ и  "Урюк" С/Г 1л ПЭТ - снова изменение структуры

Вопрос в следующем: как отследить подобные изменения на автомате и занести сумму значений столбца, например "Урюк" 0,25 ж/б в ячейку в другой книге (Если в полученной таблице нет этого поля, то 0)
(очень уж нехочется возвращаться в "каменный век" и долбить клаву цифрами)

я даже вижу пару возможных целей, но не знаю к ним пути:
1. Автоматически именовать диапазоны (какой-нибудь макрос)
2. делать циклом поиск вправо до совпадения, а от него суммировать вниз.

Пробовал БДСУММ(), но выдаёт ошибку по критериям - оказалось, что эта функция не может взять и искомое значение, и критерий из одной и той-же ячейки)
Пробовал СУММ(ДВССЫЛ(ПОИСКПОЗ())) - ПОМОГАЕТ СЛАБО, так как в строках по группам КЛИЕНТОВ подбиваются итоги
 
PM MAIL ICQ   Вверх
Akina
Дата 2.6.2006, 17:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 13
Всего: 454



Насколько я понимаю, речь идет об Эксельном файле... в таком разе там есть такая фича как транспонирование матрицы, после чего ты получишь данные как тебе надо - в столбцах.

Как - см. встроенную справку по функции ТРАНСП(). Обязательно проделай приведенный в справке пример, причем точно по инструкциям. 


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Staruha
Дата 2.6.2006, 21:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1292
Регистрация: 1.2.2004
Где: Казань

Репутация: 6
Всего: 27



Цитата

как отследить подобные изменения на автомате 

 найти нужный столбец поможет ф-я поискпоз 


--------------------
Возмездие настигнет
PM MAIL   Вверх
Aloha
Дата 4.6.2006, 02:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


.
**


Профиль
Группа: Участник Клуба
Сообщений: 351
Регистрация: 14.5.2006

Репутация: 16
Всего: 165



dionisiu
У меня работает такой код:
Код
Sub mySub()
  Dim Cnn As ADODB.Connection
  Dim Rst As ADODB.Recordset
  Dim Data_Wb As Workbook
  Dim New_Wb As Workbook
  Dim Rng As Range
  Set Data_Wb = Workbooks("Данные.xls")
  Set Rng = Data_Wb.Sheets("Лист1").Range("A1").CurrentRegion
  Rng.Name = "rng_Data"
  For i = 3 To Rng.Columns.Count
    str_Goods = Rng.Cells(1, i).Value
    Rng.Cells(1, i).Replace What:="""", Replacement:=""
    Rng.Cells(1, i).Replace What:=".", Replacement:=""
    Rng.Cells(1, i).Replace What:="[", Replacement:=""
    Rng.Cells(1, i).Replace What:="]", Replacement:=""
    Rng.Cells(1, i).Replace What:="!", Replacement:=""
    fld_Name = Rng.Cells(1, i).Value
    str_SQL = str_SQL & "SELECT '" & str_Goods & "' AS [Товар], Sum(rng_Data.[" & fld_Name & "]) AS [Сумма] "
    str_SQL = str_SQL & "FROM rng_Data "
    If i < Rng.Columns.Count Then
      str_SQL = str_SQL & "UNION "
    End If
  Next i
  str_Cnn = "DRIVER=Microsoft Excel Driver (*.xls);" & _
            "DBQ=" & Data_Wb.Path & "\" & Data_Wb.Name
  Set Cnn = New ADODB.Connection
  Cnn.Open str_Cnn
  Set Rst = New ADODB.Recordset
  Rst.Open str_SQL, Cnn
  Set New_Wb = Workbooks.Add
  New_Wb.Sheets("Лист1").Range("A1").CopyFromRecordset Rst
  Rst.Close
  Cnn.Close
End Sub

Примечание:
  • Для работы процедуры нужно подключить библиотеку: "Microsoft ActiveX Data Objects 2.0 Library"  либо выше (Редактор VBA->Tools->References->Microsoft ActiveX Data Objects 2.0 Library).
  • Подразумевается, что данные находятся в открытой книге "Данные.xls", сохраненной на диске.
  • Данные находятся на листе "Лист1" в непрерывном диапазоне, начало которого в ячейке "A1".
  • Первая строка диапазона – заголовки.
  • Заголовок первого столбца – Клиент.
  • "Источник" С/Г 0,5л бут, "Урюк" 5л ПЭТ и т.д. – заголовки столбцов, начиная с 3-го.
  • Данные в столбцах, начиная с 3-го – числовые.
  • Итоги выводятся в новую книгу.
  • Чтобы включить в итоговый запрос информацию о клиентах, нужно строки 18-19 заменить на:
    Код

        str_SQL = str_SQL & "SELECT rng_Data.Клиент, '" & str_Goods & "' AS [Товар], Sum(rng_Data.[" & fld_Name & "]) AS [Сумма] "
        str_SQL = str_SQL & "FROM rng_Data "
        str_SQL = str_SQL & "GROUP BY rng_Data.Клиент "
   

Это сообщение отредактировал(а) Aloha - 4.6.2006, 03:24
PM   Вверх
dionisiu
Дата 12.6.2006, 11:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 170
Регистрация: 13.5.2006
Где: Крым

Репутация: нет
Всего: 2



2 Akina:
Спасибо за внимание, однако ТРАНСП() в моём случае неудобен, так как список клиентов может достигать значений 400-500 точек, что для Экселя тяжко (не более 256 столбцов, кажется). Прошу прощения, в первом посте не указал.

2 Staruha:
ПОИСКПОЗ() действительно ищет столбец, однако в столбце 1С ставит промежуточные итоги для различных групп (клиенты группируются по маршрутам, а потом маршрутные итоги группируются по агентам, а в самом низу - общий итог), в результате чего формула СУММ() для столбца по ПОИСКПОЗ() выдаёт невероятных размеров сумму продаж (как минимум, утроенную)

2 Aloha:
ого!!!, спасибо за код, однако мне, как новичку в VBA требуется Ваши пояснения:
1. 1С выдаёт файл в формате Эксель95, то есть (не знаю, почему) он имеет только один лист, причём его имя от меня скрыто (не виден ярлык листа). При попытке добавить ещё один лист - новый перекрывает старый, но ярлыки листов не появляются!!!, в связи с чем вопрос - можно ли в строке 8 (Set Rng = Data_Wb.Sheets("Лист1").Range("A1").CurrentRegion) не указывать название листа?
2. насколько я понял, вывод готового потока будет в тот же файл, или я ошибаюсь?
3. Такой нюанс (прошу прощения, не озвучил в начале темы): для каждого клиента данные получаются в строке, причём если из всего ассортимента товара клиент брал лишь часть наименований, то в строке возникают пустые значения в столбцах "невзятого" товара - на таких вещах "спотыкаются" многие функции
4. Если не секрет, где вы используете такой код? я имею ввиду -Вам тоже приходится перегонять и обрабатывать данные между различными программами?

В заключение:
прилагаю файл, в котором я только изменил названия фирм, брендов, сортов и клиентов (включая адреса).
Обращаю внимание, что значительная часть строк удалена, в связи с чем итоги - нереальны. В остальном, формат и содержание (числовое) сохранены
 

Присоединённый файл ( Кол-во скачиваний: 1 )
Присоединённый файл  _______.xls 26,00 Kb
PM MAIL ICQ   Вверх
Aloha
Дата 12.6.2006, 17:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


.
**


Профиль
Группа: Участник Клуба
Сообщений: 351
Регистрация: 14.5.2006

Репутация: 16
Всего: 165



dionisiu

Цитата
2 Aloha: ... спасибо за код
Посмотрел присоединенный файл – мой пример, вот так прям сразу, там работать не будет. Так что благодарность преждевременна.

Цитата
1. ... файл в формате Эксель95 ... имеет только один лист, причём его имя от меня скрыто (не виден ярлык листа).
Имя листа в присоединенном файле - "Sheet1".

Цитата
1. ... вопрос - можно ли в строке 8 (Set Rng = Data_Wb.Sheets("Лист1").Range("A1").CurrentRegion) не указывать название листа?
Эта строка уже не актуальна, т.к. свойство CurrentRegion в рассматриваемом случае вернет не весь диапазон данных. Вот здесь likhobory очень подробно описал способы выделения диапазона данных.

Цитата
2. насколько я понял, вывод готового потока будет в тот же файл
Нет. В строке 30 создается новая Книга.

Цитата
3. ... в строке возникают пустые значения в столбцах "невзятого" товара - на таких вещах "спотыкаются" многие функции
Похожий вопрос обсуждался здесь.

dionisiu. Мне лично задача не до конца ясна. Хотелось бы уточнить конечный формат представления данных.
 
PM   Вверх
likhobory
Дата 13.6.2006, 10:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 466
Регистрация: 17.5.2005
Где: Москва

Репутация: 5
Всего: 20



Цитата(Aloha @  12.6.2006,  18:10 Найти цитируемый пост)
Вот здесь likhobory...

[offtop]
примеры выложены с любезного разрешения автора (pashulka), здесь мы  - педанты  smile 
[/offtop] 


--------------------
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Работа с MS Office"
mihanik staruha

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами



  • Несанкционированная реклама на форуме запрещена
  • Пожалуйста, давайте своим темам осмысленный, информативный заголовок. Вопль "Помогите!" таковым не является.
  • Чем полнее и яснее Вы изложите проблему, тем быстрее мы её решим.
  • Оставляйте свои записи в "Книге отзывов о работе администрации"


Если Вам понравилась атмосфера форума, заходите к нам чаще!
С уважением mihanik и staruha.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Работа с MS Office | Следующая тема »


 




[ Время генерации скрипта: 0.0509 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.