Новости:

К первому сообщению темы должен быть прикреплен файл примера в формате xls*.
Приложив пример, Вы избавите себя и других от вопросов типа "А какой критерий?", "А куда выводить результат?", "А сколько строк?" и все тех же просьб выложить файл. Рисовать за Вас Ваши же таблички с заданиями, а затем и решение к ним, никто желанием не горит. Да и, как показывает практика, в большинстве случаев без файла решения не найти.

Главное меню

Выборка данных из массива в другую таблицу с текстовым отбором

Автор Alxxxx74, 15.10.2012, 16:56

« назад - далее »

Alxxxx74

Здравствуйте!
Помогите пожалуйста решить проблему выборки данных из столбца данных. По сути это был текстовый файл выгрузки из клиент-банка. Файл представлял из себя строковое перечисление полей имеющихся в базе документов и частичное их заполнение, как в документе. Как показал анализ, каждый документ имеет 33 поля плюс две строки по одной в начале документа и в конце с текстом "СекцияДокумент=Платежное поручение" и "КонецДокумента". Все остальные 33 строки имеют непосредственное отношение к самому документу Платежное поручение. Мне необходимо транспонировать столбец с этими данными, таким образом, чтобы данные каждого документа шли по горизонтали, при чем только данные (после знака равно). Файл с исходными данными и примерной выходной таблицей, прилагаю.

Hugo121

Sub tt()
    Dim a(), i&, ii&

    a = [a2].CurrentRegion.Value
    'лучше бы как в теме
    'https://forum.msexcel.ru/microsoft_excel/perenos_bolshih_obemov_informatsii_v_excel-t8683.0.html;msg44989#msg44989
    'a = Split(CreateObject("Scripting.FileSystemObject").OpenTextFile("H:\Пример.txt", 1).ReadAll, vbLf)

    ReDim b(1 To UBound(a) / 35, 1 To 9)
    For i = 1 To UBound(a) Step 35
        ii = ii + 1
        b(ii, 1) = Split(a(i + 2, 1), "=")(1)
        b(ii, 2) = Split(a(i + 1, 1), "=")(1)
        b(ii, 3) = Split(a(i + 6, 1), "=")(1)
        b(ii, 4) = Split(a(i + 11, 1), "=")(1)
        b(ii, 5) = Split(a(i + 9, 1), "=")(1)
        b(ii, 6) = Split(a(i + 16, 1), "=")(1)
        b(ii, 7) = Split(a(i + 3, 1), "=")(1)
        b(ii, 8) = "а кто его знает..."
        b(ii, 9) = Split(a(i + 33, 1), "=")(1)
    Next
    [f3].Resize(ii, 9) = b
End Sub
webmoney: E265281470651 Z422237915069

Alxxxx74

И что получится? Я просто не силен в макросах... Мне виделось это как-то с помощью формул)

Serge 007

Цитата: Alxxxx74 от 16.10.2012, 15:53
Мне виделось это как-то с помощью формул)
=ТРАНСП(ПРАВСИМВ(A2:A106;ДЛСТР(A2:A106)-ПОИСК("=";A2:A106)))
Бесплатная помощь: www.excelworld.ru
Платная помощь: sergeyizotov@excelworld.ru
Ю-money: 41001419691823 | WMR:126292472390

Alxxxx74

А следующий документ как получить таким же образом в следующую строку?

Alxxxx74

В этом примере автоматически не получается транспонировать следующий массив с шагом 35 строк((

Serge 007

Цитата: Alxxxx74 от 16.10.2012, 19:04
А следующий документ как получить таким же образом в следующую строку?
Долго не мог понять о каком документе речь :)
Вы бы хоть цветом что ли их выделили...

Решение во вложении
Бесплатная помощь: www.excelworld.ru
Платная помощь: sergeyizotov@excelworld.ru
Ю-money: 41001419691823 | WMR:126292472390

Hugo121

Ну раз формулы... то UDF :)
Код практически не менял.
webmoney: E265281470651 Z422237915069

Alxxxx74

Цитата: Serge 007 от 16.10.2012, 23:55
Цитата: Alxxxx74 от 16.10.2012, 19:04
А следующий документ как получить таким же образом в следующую строку?
Долго не мог понять о каком документе речь :)
Вы бы хоть цветом что ли их выделили...

Решение во вложении
Благодарю за помощь! Однако, при большом объеме строк (документов), формула вычисляется по часу на каждое условие((

Alxxxx74

Цитата: Hugo121 от 17.10.2012, 01:09
Ну раз формулы... то UDF :)
Код практически не менял.

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

Hugo121

А необходимость можно удовлетворить в коде:
       b(ii, 1) = CDate(Split(a(i + 2, 1), "=")(1))
       b(ii, 7) = --Split(a(i + 3, 1), "=")(1)

Формат столбцу задать вручную, или тоже кодом, если использовать не как UDF, а как макрос.
А вообще - нужно кодом читать текст, и выгружать на лист уже готовую таблицу.
Как в коде закомментировано. Только если массив из текста - то его нужно перебирать с нуля.
Ну и если в тексте возможны варианты - то эти варианты нужно предусмотреть в коде.
webmoney: E265281470651 Z422237915069

Alxxxx74


Hugo121

А пример с Вас :)
Да и в общем готовый код выше есть - закомментированное раскомментировать, одну уже лишнюю строку можно закомментировать, цикл начать с нуля.
И должно заработать. Если файл найдёт конечно :)
webmoney: E265281470651 Z422237915069