Необходимо, при расчете брались некие значения и после расчета заполнялись соседнии ячейки по горизонтали. Пытался но мало опыта, так и не разобрался. ошибки выдает: [vba]
если комментируешь эти строчки функция отрабатывает. что-то делаю не так. [moder]Где файл? И используйте спецтеги при оформлении сообщения (для кода макроса кнопка #)
Необходимо, при расчете брались некие значения и после расчета заполнялись соседнии ячейки по горизонтали. Пытался но мало опыта, так и не разобрался. ошибки выдает: [vba]
если комментируешь эти строчки функция отрабатывает. что-то делаю не так. [moder]Где файл? И используйте спецтеги при оформлении сообщения (для кода макроса кнопка #)sttt
Задача на самом деле стоит такая - необходимо из строки "Гвозди:25.0;Шурупы:25.0;Доски:25.0;Молотки:25.0;Пилы:25.0;Рубанки:25.1" заполнить по столбцам:
Задача на самом деле стоит такая - необходимо из строки "Гвозди:25.0;Шурупы:25.0;Доски:25.0;Молотки:25.0;Пилы:25.0;Рубанки:25.1" заполнить по столбцам:
во время тестирования макроса у меня возникла ошибка:заголовок C(и еще некоторые другие) содержал пробел спереди и сзади .в заголовках не должно быть пробелов. макрос находится в файле.кнопку для запуска макроса я не делал -тестировал прямо из vbe.
во время тестирования макроса у меня возникла ошибка:заголовок C(и еще некоторые другие) содержал пробел спереди и сзади .в заголовках не должно быть пробелов. макрос находится в файле.кнопку для запуска макроса я не делал -тестировал прямо из vbe.Karataev
кнопку для запуска макроса я не делал -тестировал прямо из vbe.
Спасибо, но это часть) нужно было из строк, типа (они разные по длине и содержанию): "Гвозди:25.0;Шурупы:25.0;Доски:25.0;Молотки:25.0;Пилы:25.0;Рубанки:25.1" вывести в заголовке уникальные имена колонок, пройдясь по колонке, получаем уникальные, а потом уже заполнять их числовыми значениями. сам виноват, что так изложил, а в примере уже готовые колонки заполняются))
теперь у меня есть пример, попытаюсь по аналогии сделать. но не совсем понятно, будет-ли работать заполнение строк из пользовательской функции. хотел сделать вывод колонок макросом, а потом построчно = НекаяФункция(А1) и заполнялись бы в строке необходимые колонки. Ранее упомянул, что строка кода не работает: Cells(7, 7).Value = 1990 Хотя в макросе работает.
Поправил код, хоть не ругается:
[vba]
Код
Sub Macro1()
Dim dic As Object Dim lngLastRow As Long Dim i As Long Application.ScreenUpdating = False Set dic = CreateObject("Scripting.Dictionary") For i = 2 To 8 'начало правки If Not (IsEmpty(Cells(1, i).Value)) Then dic.Add Cells(1, i).Value, i End If 'конец правки Next lngLastRow = ActiveSheet.UsedRange.Rows.Count For i = 2 To lngLastRow If CStr(Cells(i, "A").Value) <> "" Then Call ttt(i, dic) End If Next Application.ScreenUpdating = True
кнопку для запуска макроса я не делал -тестировал прямо из vbe.
Спасибо, но это часть) нужно было из строк, типа (они разные по длине и содержанию): "Гвозди:25.0;Шурупы:25.0;Доски:25.0;Молотки:25.0;Пилы:25.0;Рубанки:25.1" вывести в заголовке уникальные имена колонок, пройдясь по колонке, получаем уникальные, а потом уже заполнять их числовыми значениями. сам виноват, что так изложил, а в примере уже готовые колонки заполняются))
теперь у меня есть пример, попытаюсь по аналогии сделать. но не совсем понятно, будет-ли работать заполнение строк из пользовательской функции. хотел сделать вывод колонок макросом, а потом построчно = НекаяФункция(А1) и заполнялись бы в строке необходимые колонки. Ранее упомянул, что строка кода не работает: Cells(7, 7).Value = 1990 Хотя в макросе работает.
Поправил код, хоть не ругается:
[vba]
Код
Sub Macro1()
Dim dic As Object Dim lngLastRow As Long Dim i As Long Application.ScreenUpdating = False Set dic = CreateObject("Scripting.Dictionary") For i = 2 To 8 'начало правки If Not (IsEmpty(Cells(1, i).Value)) Then dic.Add Cells(1, i).Value, i End If 'конец правки Next lngLastRow = ActiveSheet.UsedRange.Rows.Count For i = 2 To lngLastRow If CStr(Cells(i, "A").Value) <> "" Then Call ttt(i, dic) End If Next Application.ScreenUpdating = True
sttt, мне кажется, Вы слишком много пытаетесь сделать сразу - фактически из сырого текста чуть ли не сводную таблицу. Разберите сначал программно текст в три колонки: номер строки, материал, количество. А потом и сводную таблицу постройте по этим 3-м колонкам - но уже легко, парой кликов, без макросов.
P.S. Прикинул сборщик в 3 колонки. Соберет их, начиная с ячейки K1 на активном листе: [vba]
Код
Sub parseRawText()
Dim rngSource As Range, c As Range Dim i As Integer, j As Integer Dim arrRow, arrVal, arrOut()
Set rngSource = Range("A2:A3")
ReDim arrOut(1 To rngSource.Cells.Count * 20, 1 To 3)
For Each c In rngSource.Cells arrRow = Split(c, ";") For i = LBound(arrRow) To UBound(arrRow) arrVal = Split(arrRow(i), ":") j = j + 1 arrOut(j, 1) = c.Row arrOut(j, 2) = arrVal(0) arrOut(j, 3) = arrVal(1) Next i Next c
With Range("K1").Resize(1, 3) .Value = Array("Строка", "Материал", "Количество") .Font.Bold = True End With Range("K2").Resize(j, 3).Value = arrOut End Sub
[/vba]
sttt, мне кажется, Вы слишком много пытаетесь сделать сразу - фактически из сырого текста чуть ли не сводную таблицу. Разберите сначал программно текст в три колонки: номер строки, материал, количество. А потом и сводную таблицу постройте по этим 3-м колонкам - но уже легко, парой кликов, без макросов.
P.S. Прикинул сборщик в 3 колонки. Соберет их, начиная с ячейки K1 на активном листе: [vba]
Код
Sub parseRawText()
Dim rngSource As Range, c As Range Dim i As Integer, j As Integer Dim arrRow, arrVal, arrOut()
Set rngSource = Range("A2:A3")
ReDim arrOut(1 To rngSource.Cells.Count * 20, 1 To 3)
For Each c In rngSource.Cells arrRow = Split(c, ";") For i = LBound(arrRow) To UBound(arrRow) arrVal = Split(arrRow(i), ":") j = j + 1 arrOut(j, 1) = c.Row arrOut(j, 2) = arrVal(0) arrOut(j, 3) = arrVal(1) Next i Next c
With Range("K1").Resize(1, 3) .Value = Array("Строка", "Материал", "Количество") .Font.Bold = True End With Range("K2").Resize(j, 3).Value = arrOut End Sub
sttt, в моем файле - пользовательская функция parseCell, возвращающая массив. Формула =parseCell(A1) введена на рабочем листе в диапазон B1:J2 как формула массива, т.е. при помощи комбинации Ctrl+Shift+Enter. Результат увидите. Что-то типа такого хотелось сделать?
sttt, в моем файле - пользовательская функция parseCell, возвращающая массив. Формула =parseCell(A1) введена на рабочем листе в диапазон B1:J2 как формула массива, т.е. при помощи комбинации Ctrl+Shift+Enter. Результат увидите. Что-то типа такого хотелось сделать?Gustav
[/vba] из исходной строки, их будет много, в одном столбце и в строке разный состав. Пройтись по этому столбцу и получить уникальные наименования будущих колонок и в шапке горизонтально вывести по ячейкам:
[vba]
Код
Гвозди|Шурупы|Доски|Молотки|Пилы|Рубанки|Лестницы
[/vba]
А потом построчно разместить числовые значения. Я скидывал книгу, как в итоге должна получиться таблица. Но на начальном этапе в книге были только строки:
[/vba] из исходной строки, их будет много, в одном столбце и в строке разный состав. Пройтись по этому столбцу и получить уникальные наименования будущих колонок и в шапке горизонтально вывести по ячейкам:
[vba]
Код
Гвозди|Шурупы|Доски|Молотки|Пилы|Рубанки|Лестницы
[/vba]
А потом построчно разместить числовые значения. Я скидывал книгу, как в итоге должна получиться таблица. Но на начальном этапе в книге были только строки:
Я не заметил этот пример. Вообще в идеале думаю UDF тут неприменима - вдруг в строке появится никем не предусмотренные пилки для ногтей? Но если весь ассортимент известен заранее - тогда конечно можно (не смотрел пока что там предложил Gustav). А вообще я бы всё делал макросом - анализ всего что есть, создание рядом таблицы.
P.S. Чуть прикинул алгоритм - больно сложно получается, некогда такую головоломку прописывать. Если заранее известен весь список (и в строке нет повторов этих молотков-лестниц) - можно написать простую UDF с двумя параметрами. Даже можно две - работающую на одну ячейку, или массивную сразу на всю строку таблицы.
Я не заметил этот пример. Вообще в идеале думаю UDF тут неприменима - вдруг в строке появится никем не предусмотренные пилки для ногтей? Но если весь ассортимент известен заранее - тогда конечно можно (не смотрел пока что там предложил Gustav). А вообще я бы всё делал макросом - анализ всего что есть, создание рядом таблицы.
P.S. Чуть прикинул алгоритм - больно сложно получается, некогда такую головоломку прописывать. Если заранее известен весь список (и в строке нет повторов этих молотков-лестниц) - можно написать простую UDF с двумя параметрами. Даже можно две - работающую на одну ячейку, или массивную сразу на всю строку таблицы.Hugo
что-то, но не совсем так, строк будет 100 и более, количество всегда разное, почти неразрывно и из этих строк нужно уникальные наименование вытащить по всем строкам этой колонки. Но полагаю, что примерно таким кодом и нужно заполнить наименования колонок макросом, только немного доработать, но результат примерно такой.)) Попытался массив ему в параметр передать , но ругается, что "нельзя изменять часть массива" - =parseCell(A1:A2). Возможно можно сделать все макросом, но у меня была идея, получить и заполнить только шапку макросом, а потом, у каждой строки применить пользовательскую функцию для парсинга числовых значений. А пример, так понял (тяжело читать плохо знакомый язык), будет повторять вывод колонок для каждой строки, а необходимо один раз в одном месте это сделать, где-то в шапке листа, и под эти шапки заполнить построчно числовыми значениями взятыми из текущей строки, под нужными колонками 3 поставить под Лестницы, а 25.1 под Рубанки.
что-то, но не совсем так, строк будет 100 и более, количество всегда разное, почти неразрывно и из этих строк нужно уникальные наименование вытащить по всем строкам этой колонки. Но полагаю, что примерно таким кодом и нужно заполнить наименования колонок макросом, только немного доработать, но результат примерно такой.)) Попытался массив ему в параметр передать , но ругается, что "нельзя изменять часть массива" - =parseCell(A1:A2). Возможно можно сделать все макросом, но у меня была идея, получить и заполнить только шапку макросом, а потом, у каждой строки применить пользовательскую функцию для парсинга числовых значений. А пример, так понял (тяжело читать плохо знакомый язык), будет повторять вывод колонок для каждой строки, а необходимо один раз в одном месте это сделать, где-то в шапке листа, и под эти шапки заполнить построчно числовыми значениями взятыми из текущей строки, под нужными колонками 3 поставить под Лестницы, а 25.1 под Рубанки.sttt
sttt, в общем, если решаете реальную задачу и нужен быстрый и комфортный результат, то рекомендую еще раз обратить внимание на мое сообщение №5 (функционалом сводных таблиц в Excel, надеюсь, владеете?).
Ну, а если в приоритете над задачей именно упражнения по VBA (и непременно хочется самому попытаться по факту "переписать" функционал сводных таблиц), то, как говорится, флаг Вам в руки!
sttt, в общем, если решаете реальную задачу и нужен быстрый и комфортный результат, то рекомендую еще раз обратить внимание на мое сообщение №5 (функционалом сводных таблиц в Excel, надеюсь, владеете?).
Ну, а если в приоритете над задачей именно упражнения по VBA (и непременно хочется самому попытаться по факту "переписать" функционал сводных таблиц), то, как говорится, флаг Вам в руки! Gustav
("переписать" функционал сводных таблиц), то, как говорится, флаг Вам в руки!
если бы данные были в нормальной форме - сводная таблица очень пригодилась бы. может, чего не знаю, подтолкните в нужную сторону. полагаю, что у меня достаточно информации для решения этой задачки. вроде не так все сложно. охотно посмотрю другие решения.
("переписать" функционал сводных таблиц), то, как говорится, флаг Вам в руки!
если бы данные были в нормальной форме - сводная таблица очень пригодилась бы. может, чего не знаю, подтолкните в нужную сторону. полагаю, что у меня достаточно информации для решения этой задачки. вроде не так все сложно. охотно посмотрю другие решения.sttt
если бы данные были в нормальной форме - сводная таблица очень пригодилась бы
Так я же в сообщении 5 как раз и предложил инструмент ("сборщик 3-х колонок") по преобразованию сырых данных в нормальную форму! Буквально второй день об этом талдычу
если бы данные были в нормальной форме - сводная таблица очень пригодилась бы
Так я же в сообщении 5 как раз и предложил инструмент ("сборщик 3-х колонок") по преобразованию сырых данных в нормальную форму! Буквально второй день об этом талдычу Gustav
Алгоритм макроса (пока писать некогда): в столбце выделенной ячейки определяем последнюю строку, берём данные в массив цикл по массиву, анализ строки собираем словарь "молотков", каждому в item порядковый номер и тут же второй словарь с ключём номер_строки_массива|"молоток" и в его Item кладём число (можно собирать сумму, если возможны повторы, их кстати можно выявить если есть опасность) Когда закончили с источником - создаём пустой массив (размеры известны - как исходный х словарь "молотков") и заполняем его циклом по ключам "молотков" и в нём цикл от 2 до конца массива (шапку отдельно сперва или в конце).
Алгоритм макроса (пока писать некогда): в столбце выделенной ячейки определяем последнюю строку, берём данные в массив цикл по массиву, анализ строки собираем словарь "молотков", каждому в item порядковый номер и тут же второй словарь с ключём номер_строки_массива|"молоток" и в его Item кладём число (можно собирать сумму, если возможны повторы, их кстати можно выявить если есть опасность) Когда закончили с источником - создаём пустой массив (размеры известны - как исходный х словарь "молотков") и заполняем его циклом по ключам "молотков" и в нём цикл от 2 до конца массива (шапку отдельно сперва или в конце).Hugo
я этим пользуюсь, еще словарем для сбора списка уникальных полей, а потом это все горизонтально вывести. [vba]
Код
Set dic = CreateObject("Scripting.Dictionary")
Set ids = Application.InputBox("Укажите ячейку с данными первой строки", Type:=8)
NumStr = 0
lngLastRow = ActiveSheet.UsedRange.Rows.Count For i = 2 To lngLastRow If CStr(Cells(i, "A").Value) <> "" Then NumStr = NumStr + 1 dic.Add Cells(ids.Row, i).Value, NumStr End If Next
a=d.Items For j = 0 To dic.Count - 1 arrOut(j, 1) = a(j) Next j
[/vba] Код писал прям здесь, поэтому не знаю будет ли работать, но как-то так будет выводит колонки.
я пока над другим занят по работе, вернусь к проекту. но если кто поможет, отлично. уже есть понимание, как делать. просто маленькие нюансы всплывают в коде, над ними эксперементирую.
я этим пользуюсь, еще словарем для сбора списка уникальных полей, а потом это все горизонтально вывести. [vba]
Код
Set dic = CreateObject("Scripting.Dictionary")
Set ids = Application.InputBox("Укажите ячейку с данными первой строки", Type:=8)
NumStr = 0
lngLastRow = ActiveSheet.UsedRange.Rows.Count For i = 2 To lngLastRow If CStr(Cells(i, "A").Value) <> "" Then NumStr = NumStr + 1 dic.Add Cells(ids.Row, i).Value, NumStr End If Next
a=d.Items For j = 0 To dic.Count - 1 arrOut(j, 1) = a(j) Next j
[/vba] Код писал прям здесь, поэтому не знаю будет ли работать, но как-то так будет выводит колонки.
я пока над другим занят по работе, вернусь к проекту. но если кто поможет, отлично. уже есть понимание, как делать. просто маленькие нюансы всплывают в коде, над ними эксперементирую.sttt
я этим пользуюсь, еще словарем для сбора списка уникальных полей, а потом это все горизонтально вывести
После "пользуюсь" уже не надо дальше ничего программировать. Надо строить сводную таблицу. Вручную, как пользователь, несколькими клацами мыши. Посмотрите в файле - разве плохо? Товарчики - уникальные, по алфавиту. По номерам строк можете легко приставить к исходной таблице.
я этим пользуюсь, еще словарем для сбора списка уникальных полей, а потом это все горизонтально вывести
После "пользуюсь" уже не надо дальше ничего программировать. Надо строить сводную таблицу. Вручную, как пользователь, несколькими клацами мыши. Посмотрите в файле - разве плохо? Товарчики - уникальные, по алфавиту. По номерам строк можете легко приставить к исходной таблице.Gustav