Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Как из пользовательской функции заполнит несколько ячеек? - Мир MS Excel

Старая форма входа
  • Страница 1 из 2
  • 1
  • 2
  • »
Модератор форума: китин, _Boroda_  
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Как из пользовательской функции заполнит несколько ячеек? (Макросы/Sub)
Как из пользовательской функции заполнит несколько ячеек?
sttt Дата: Вторник, 24.02.2015, 18:13 | Сообщение № 1
Группа: Пользователи
Ранг: Новичок
Сообщений: 13
Репутация: 0 ±
Замечаний: 0% ±

Excel 2007
Необходимо, при расчете брались некие значения и после расчета заполнялись соседнии ячейки по горизонтали.
Пытался но мало опыта, так и не разобрался.
ошибки выдает:
[vba]
Код
'Cells(i, 1).Resize(40, 14).Interior.Color = 15773696
'Selection.Column
'Worksheets(1).Cells(6, 6).Value = 24
'ActiveSheet.Cells(5, 5).Value = "test"
'Cells(7, 7).Value = 1990
'Worksheets(ActiveSheet.Name).Range("B9").Value = "тест"
'ActiveSheet.Range("B5").Value = "test" 'arr(i)
'ActiveCell.Offset(i - 1, perem + 1).Value = arr(i)
'ActiveCell.Offset(i - 1, perem + 1).Value
[/vba]

если комментируешь эти строчки функция отрабатывает. что-то делаю не так.
[moder]Где файл?
И используйте спецтеги при оформлении сообщения (для кода макроса кнопка #)
К сообщению приложен файл: UsersFunction.xlsm (15.7 Kb)


Сообщение отредактировал sttt - Вторник, 24.02.2015, 18:33
 
Ответить
СообщениеНеобходимо, при расчете брались некие значения и после расчета заполнялись соседнии ячейки по горизонтали.
Пытался но мало опыта, так и не разобрался.
ошибки выдает:
[vba]
Код
'Cells(i, 1).Resize(40, 14).Interior.Color = 15773696
'Selection.Column
'Worksheets(1).Cells(6, 6).Value = 24
'ActiveSheet.Cells(5, 5).Value = "test"
'Cells(7, 7).Value = 1990
'Worksheets(ActiveSheet.Name).Range("B9").Value = "тест"
'ActiveSheet.Range("B5").Value = "test" 'arr(i)
'ActiveCell.Offset(i - 1, perem + 1).Value = arr(i)
'ActiveCell.Offset(i - 1, perem + 1).Value
[/vba]

если комментируешь эти строчки функция отрабатывает. что-то делаю не так.
[moder]Где файл?
И используйте спецтеги при оформлении сообщения (для кода макроса кнопка #)

Автор - sttt
Дата добавления - 24.02.2015 в 18:13
sttt Дата: Вторник, 24.02.2015, 18:48 | Сообщение № 2
Группа: Пользователи
Ранг: Новичок
Сообщений: 13
Репутация: 0 ±
Замечаний: 0% ±

Excel 2007
Задача на самом деле стоит такая - необходимо из строки "Гвозди:25.0;Шурупы:25.0;Доски:25.0;Молотки:25.0;Пилы:25.0;Рубанки:25.1"
заполнить по столбцам:

Гвозди Шурупы Доски Молотки Пилы Рубанки Лестницы
"Гвозди:25.0;Шурупы:25.0;Доски:25.0;Молотки:25.0;Пилы:25.0;Рубанки:25.1" = 25.0 25 25 25 25 25.1
"Гвозди:25.0;Шурупы:25.0;Доски:25.0;Молотки:25.0;Лестницы:3" = 25 25 25 25 3

Лучше в файле показать разметку))
К сообщению приложен файл: tov.xlsx (9.8 Kb)


Сообщение отредактировал sttt - Вторник, 24.02.2015, 19:06
 
Ответить
СообщениеЗадача на самом деле стоит такая - необходимо из строки "Гвозди:25.0;Шурупы:25.0;Доски:25.0;Молотки:25.0;Пилы:25.0;Рубанки:25.1"
заполнить по столбцам:

Гвозди Шурупы Доски Молотки Пилы Рубанки Лестницы
"Гвозди:25.0;Шурупы:25.0;Доски:25.0;Молотки:25.0;Пилы:25.0;Рубанки:25.1" = 25.0 25 25 25 25 25.1
"Гвозди:25.0;Шурупы:25.0;Доски:25.0;Молотки:25.0;Лестницы:3" = 25 25 25 25 3

Лучше в файле показать разметку))

Автор - sttt
Дата добавления - 24.02.2015 в 18:48
Karataev Дата: Вторник, 24.02.2015, 20:10 | Сообщение № 3
Группа: Проверенные
Ранг: Старожил
Сообщений: 1334
Репутация: 533 ±
Замечаний: 0% ±

Excel
во время тестирования макроса у меня возникла ошибка:заголовок C(и еще некоторые другие) содержал пробел спереди и сзади .в заголовках не должно быть пробелов.
макрос находится в файле.кнопку для запуска макроса я не делал -тестировал прямо из vbe.
К сообщению приложен файл: tov.xlsm (17.2 Kb)


Сообщение отредактировал Karataev - Вторник, 24.02.2015, 20:10
 
Ответить
Сообщениево время тестирования макроса у меня возникла ошибка:заголовок C(и еще некоторые другие) содержал пробел спереди и сзади .в заголовках не должно быть пробелов.
макрос находится в файле.кнопку для запуска макроса я не делал -тестировал прямо из vbe.

Автор - Karataev
Дата добавления - 24.02.2015 в 20:10
sttt Дата: Среда, 25.02.2015, 15:37 | Сообщение № 4
Группа: Пользователи
Ранг: Новичок
Сообщений: 13
Репутация: 0 ±
Замечаний: 0% ±

Excel 2007
кнопку для запуска макроса я не делал -тестировал прямо из 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

End Sub
[/vba]


Сообщение отредактировал sttt - Среда, 25.02.2015, 15:38
 
Ответить
Сообщение
кнопку для запуска макроса я не делал -тестировал прямо из 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

End Sub
[/vba]

Автор - sttt
Дата добавления - 25.02.2015 в 15:37
Gustav Дата: Среда, 25.02.2015, 17:56 | Сообщение № 5
Группа: Друзья
Ранг: Участник клуба
Сообщений: 2748
Репутация: 1138 ±
Замечаний: 0% ±

начинал с Excel 4.0, видел 2.1
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]


МОИ: Ник, Tip box: 41001663842605

Сообщение отредактировал Gustav - Среда, 25.02.2015, 18:28
 
Ответить
Сообщение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]

Автор - Gustav
Дата добавления - 25.02.2015 в 17:56
Hugo Дата: Среда, 25.02.2015, 18:04 | Сообщение № 6
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3254
Репутация: 707 ±
Замечаний: 0% ±

2019
"Как из пользовательской функции заполнит несколько ячеек?" - и где она? Если что - я знаю как - используйте в диапазон как формулу массива.


excel@nxt.ru
webmoney: E265281470651 Z422237915069
 
Ответить
Сообщение"Как из пользовательской функции заполнит несколько ячеек?" - и где она? Если что - я знаю как - используйте в диапазон как формулу массива.

Автор - Hugo
Дата добавления - 25.02.2015 в 18:04
sttt Дата: Четверг, 26.02.2015, 11:54 | Сообщение № 7
Группа: Пользователи
Ранг: Новичок
Сообщений: 13
Репутация: 0 ±
Замечаний: 0% ±

Excel 2007
"Как из пользовательской функции заполнит несколько ячеек?" - и где она?


Она в книге есть, но не работает. Хотя необходимо проверить, может, что упустил.)

используйте в диапазон как формулу массива


Как это сделать? Вроде понятно "диапазон, массив, формула", но не могу представить как.
Может как-то так?
[vba]
Код

Dim ids As Range
Set ids = Application.InputBox("Выберите диапазон ячеек", Type:=8)
[/vba]
 
Ответить
Сообщение
"Как из пользовательской функции заполнит несколько ячеек?" - и где она?


Она в книге есть, но не работает. Хотя необходимо проверить, может, что упустил.)

используйте в диапазон как формулу массива


Как это сделать? Вроде понятно "диапазон, массив, формула", но не могу представить как.
Может как-то так?
[vba]
Код

Dim ids As Range
Set ids = Application.InputBox("Выберите диапазон ячеек", Type:=8)
[/vba]

Автор - sttt
Дата добавления - 26.02.2015 в 11:54
sttt Дата: Четверг, 26.02.2015, 11:55 | Сообщение № 8
Группа: Пользователи
Ранг: Новичок
Сообщений: 13
Репутация: 0 ±
Замечаний: 0% ±

Excel 2007
Прикинул сборщик в 3 колонки. Соберет их, начиная с ячейки K1 на активном листе:


Спасибо большущее! Так по кусочкам допилим))
 
Ответить
Сообщение
Прикинул сборщик в 3 колонки. Соберет их, начиная с ячейки K1 на активном листе:


Спасибо большущее! Так по кусочкам допилим))

Автор - sttt
Дата добавления - 26.02.2015 в 11:55
Hugo Дата: Четверг, 26.02.2015, 12:10 | Сообщение № 9
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3254
Репутация: 707 ±
Замечаний: 0% ±

2019
Я вообще ничего не понял - что из чего куда нужно сделать...
Можно конечно пытаться догадаться - но времени жалко.


excel@nxt.ru
webmoney: E265281470651 Z422237915069
 
Ответить
СообщениеЯ вообще ничего не понял - что из чего куда нужно сделать...
Можно конечно пытаться догадаться - но времени жалко.

Автор - Hugo
Дата добавления - 26.02.2015 в 12:10
Gustav Дата: Четверг, 26.02.2015, 13:04 | Сообщение № 10
Группа: Друзья
Ранг: Участник клуба
Сообщений: 2748
Репутация: 1138 ±
Замечаний: 0% ±

начинал с Excel 4.0, видел 2.1
sttt, в моем файле - пользовательская функция parseCell, возвращающая массив. Формула =parseCell(A1) введена на рабочем листе в диапазон B1:J2 как формула массива, т.е. при помощи комбинации Ctrl+Shift+Enter. Результат увидите. Что-то типа такого хотелось сделать?
К сообщению приложен файл: arrUDF.xlsm (21.9 Kb)


МОИ: Ник, Tip box: 41001663842605
 
Ответить
Сообщениеsttt, в моем файле - пользовательская функция parseCell, возвращающая массив. Формула =parseCell(A1) введена на рабочем листе в диапазон B1:J2 как формула массива, т.е. при помощи комбинации Ctrl+Shift+Enter. Результат увидите. Что-то типа такого хотелось сделать?

Автор - Gustav
Дата добавления - 26.02.2015 в 13:04
sttt Дата: Четверг, 26.02.2015, 13:59 | Сообщение № 11
Группа: Пользователи
Ранг: Новичок
Сообщений: 13
Репутация: 0 ±
Замечаний: 0% ±

Excel 2007
Я вообще ничего не понял - что из чего куда нужно сделать...


[vba]
Код

Гвозди:25.0;Шурупы:25.0;Доски:25.0;Молотки:25.0;Пилы:25.0;Рубанки:25.1
Гвозди:25.0;Шурупы:25.0;Доски:25.0;Молотки:25.0;Лестницы:3
[/vba]
из исходной строки, их будет много, в одном столбце и в строке разный состав.
Пройтись по этому столбцу и получить уникальные наименования будущих колонок и в шапке горизонтально вывести по ячейкам:

[vba]
Код

Гвозди|Шурупы|Доски|Молотки|Пилы|Рубанки|Лестницы
[/vba]

А потом построчно разместить числовые значения.
Я скидывал книгу, как в итоге должна получиться таблица.
Но на начальном этапе в книге были только строки:

[vba]
Код

Гвозди:25.0;Шурупы:25.0;Доски:25.0;Молотки:25.0;Пилы:25.0;Рубанки:25.1
Гвозди:25.0;Шурупы:25.0;Доски:25.0;Молотки:25.0;Лестницы:3
[/vba]
 
Ответить
Сообщение
Я вообще ничего не понял - что из чего куда нужно сделать...


[vba]
Код

Гвозди:25.0;Шурупы:25.0;Доски:25.0;Молотки:25.0;Пилы:25.0;Рубанки:25.1
Гвозди:25.0;Шурупы:25.0;Доски:25.0;Молотки:25.0;Лестницы:3
[/vba]
из исходной строки, их будет много, в одном столбце и в строке разный состав.
Пройтись по этому столбцу и получить уникальные наименования будущих колонок и в шапке горизонтально вывести по ячейкам:

[vba]
Код

Гвозди|Шурупы|Доски|Молотки|Пилы|Рубанки|Лестницы
[/vba]

А потом построчно разместить числовые значения.
Я скидывал книгу, как в итоге должна получиться таблица.
Но на начальном этапе в книге были только строки:

[vba]
Код

Гвозди:25.0;Шурупы:25.0;Доски:25.0;Молотки:25.0;Пилы:25.0;Рубанки:25.1
Гвозди:25.0;Шурупы:25.0;Доски:25.0;Молотки:25.0;Лестницы:3
[/vba]

Автор - sttt
Дата добавления - 26.02.2015 в 13:59
Hugo Дата: Четверг, 26.02.2015, 14:07 | Сообщение № 12
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3254
Репутация: 707 ±
Замечаний: 0% ±

2019
Я не заметил этот пример.
Вообще в идеале думаю UDF тут неприменима - вдруг в строке появится никем не предусмотренные пилки для ногтей?
Но если весь ассортимент известен заранее - тогда конечно можно (не смотрел пока что там предложил Gustav).
А вообще я бы всё делал макросом - анализ всего что есть, создание рядом таблицы.

P.S. Чуть прикинул алгоритм - больно сложно получается, некогда такую головоломку прописывать.
Если заранее известен весь список (и в строке нет повторов этих молотков-лестниц) - можно написать простую UDF с двумя параметрами. Даже можно две - работающую на одну ячейку, или массивную сразу на всю строку таблицы.


excel@nxt.ru
webmoney: E265281470651 Z422237915069


Сообщение отредактировал Hugo - Четверг, 26.02.2015, 14:16
 
Ответить
СообщениеЯ не заметил этот пример.
Вообще в идеале думаю UDF тут неприменима - вдруг в строке появится никем не предусмотренные пилки для ногтей?
Но если весь ассортимент известен заранее - тогда конечно можно (не смотрел пока что там предложил Gustav).
А вообще я бы всё делал макросом - анализ всего что есть, создание рядом таблицы.

P.S. Чуть прикинул алгоритм - больно сложно получается, некогда такую головоломку прописывать.
Если заранее известен весь список (и в строке нет повторов этих молотков-лестниц) - можно написать простую UDF с двумя параметрами. Даже можно две - работающую на одну ячейку, или массивную сразу на всю строку таблицы.

Автор - Hugo
Дата добавления - 26.02.2015 в 14:07
sttt Дата: Четверг, 26.02.2015, 14:20 | Сообщение № 13
Группа: Пользователи
Ранг: Новичок
Сообщений: 13
Репутация: 0 ±
Замечаний: 0% ±

Excel 2007
Что-то типа такого хотелось сделать?

что-то, но не совсем так, строк будет 100 и более, количество всегда разное, почти неразрывно и из этих строк нужно уникальные наименование вытащить по всем строкам этой колонки.
Но полагаю, что примерно таким кодом и нужно заполнить наименования колонок макросом, только немного доработать, но результат примерно такой.)) Попытался массив ему в параметр передать , но ругается, что "нельзя изменять часть массива" - =parseCell(A1:A2).
Возможно можно сделать все макросом, но у меня была идея, получить и заполнить только шапку макросом, а потом, у каждой строки применить пользовательскую функцию для парсинга числовых значений.
А пример, так понял (тяжело читать плохо знакомый язык), будет повторять вывод колонок для каждой строки, а необходимо один раз в одном месте это сделать,
где-то в шапке листа, и под эти шапки заполнить построчно числовыми значениями взятыми из текущей строки, под нужными колонками 3 поставить под Лестницы, а 25.1 под Рубанки.
 
Ответить
Сообщение
Что-то типа такого хотелось сделать?

что-то, но не совсем так, строк будет 100 и более, количество всегда разное, почти неразрывно и из этих строк нужно уникальные наименование вытащить по всем строкам этой колонки.
Но полагаю, что примерно таким кодом и нужно заполнить наименования колонок макросом, только немного доработать, но результат примерно такой.)) Попытался массив ему в параметр передать , но ругается, что "нельзя изменять часть массива" - =parseCell(A1:A2).
Возможно можно сделать все макросом, но у меня была идея, получить и заполнить только шапку макросом, а потом, у каждой строки применить пользовательскую функцию для парсинга числовых значений.
А пример, так понял (тяжело читать плохо знакомый язык), будет повторять вывод колонок для каждой строки, а необходимо один раз в одном месте это сделать,
где-то в шапке листа, и под эти шапки заполнить построчно числовыми значениями взятыми из текущей строки, под нужными колонками 3 поставить под Лестницы, а 25.1 под Рубанки.

Автор - sttt
Дата добавления - 26.02.2015 в 14:20
sttt Дата: Четверг, 26.02.2015, 14:25 | Сообщение № 14
Группа: Пользователи
Ранг: Новичок
Сообщений: 13
Репутация: 0 ±
Замечаний: 0% ±

Excel 2007
вдруг в строке появится никем не предусмотренные пилки для ногтей

именно так, количество колонок может измениться и максимальный размер почти известен, но могут добавлять очень редко новые позиции.

можно написать простую UDF с двумя параметрами. Даже можно две - работающую на одну ячейку, или массивную сразу на всю строку таблицы.


Можно и так, у меня мало опыта, понять, как оптимальнее, если это можно считать опытом)) но ориентируюсь. На другой платформе пишу.
 
Ответить
Сообщение
вдруг в строке появится никем не предусмотренные пилки для ногтей

именно так, количество колонок может измениться и максимальный размер почти известен, но могут добавлять очень редко новые позиции.

можно написать простую UDF с двумя параметрами. Даже можно две - работающую на одну ячейку, или массивную сразу на всю строку таблицы.


Можно и так, у меня мало опыта, понять, как оптимальнее, если это можно считать опытом)) но ориентируюсь. На другой платформе пишу.

Автор - sttt
Дата добавления - 26.02.2015 в 14:25
Gustav Дата: Четверг, 26.02.2015, 15:04 | Сообщение № 15
Группа: Друзья
Ранг: Участник клуба
Сообщений: 2748
Репутация: 1138 ±
Замечаний: 0% ±

начинал с Excel 4.0, видел 2.1
sttt, в общем, если решаете реальную задачу и нужен быстрый и комфортный результат, то рекомендую еще раз обратить внимание на мое сообщение №5 (функционалом сводных таблиц в Excel, надеюсь, владеете?).

Ну, а если в приоритете над задачей именно упражнения по VBA (и непременно хочется самому попытаться по факту "переписать" функционал сводных таблиц), то, как говорится, флаг Вам в руки! :)


МОИ: Ник, Tip box: 41001663842605
 
Ответить
Сообщениеsttt, в общем, если решаете реальную задачу и нужен быстрый и комфортный результат, то рекомендую еще раз обратить внимание на мое сообщение №5 (функционалом сводных таблиц в Excel, надеюсь, владеете?).

Ну, а если в приоритете над задачей именно упражнения по VBA (и непременно хочется самому попытаться по факту "переписать" функционал сводных таблиц), то, как говорится, флаг Вам в руки! :)

Автор - Gustav
Дата добавления - 26.02.2015 в 15:04
sttt Дата: Четверг, 26.02.2015, 15:56 | Сообщение № 16
Группа: Пользователи
Ранг: Новичок
Сообщений: 13
Репутация: 0 ±
Замечаний: 0% ±

Excel 2007
("переписать" функционал сводных таблиц), то, как говорится, флаг Вам в руки!


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


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

Автор - sttt
Дата добавления - 26.02.2015 в 15:56
Gustav Дата: Четверг, 26.02.2015, 16:29 | Сообщение № 17
Группа: Друзья
Ранг: Участник клуба
Сообщений: 2748
Репутация: 1138 ±
Замечаний: 0% ±

начинал с Excel 4.0, видел 2.1
если бы данные были в нормальной форме - сводная таблица очень пригодилась бы

Так я же в сообщении 5 как раз и предложил инструмент ("сборщик 3-х колонок") по преобразованию сырых данных в нормальную форму! Буквально второй день об этом талдычу :)


МОИ: Ник, Tip box: 41001663842605
 
Ответить
Сообщение
если бы данные были в нормальной форме - сводная таблица очень пригодилась бы

Так я же в сообщении 5 как раз и предложил инструмент ("сборщик 3-х колонок") по преобразованию сырых данных в нормальную форму! Буквально второй день об этом талдычу :)

Автор - Gustav
Дата добавления - 26.02.2015 в 16:29
Hugo Дата: Четверг, 26.02.2015, 16:36 | Сообщение № 18
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3254
Репутация: 707 ±
Замечаний: 0% ±

2019
Алгоритм макроса (пока писать некогда):
в столбце выделенной ячейки
определяем последнюю строку, берём данные в массив
цикл по массиву, анализ строки
собираем словарь "молотков", каждому в item порядковый номер
и тут же второй словарь с ключём номер_строки_массива|"молоток" и в его Item кладём число (можно собирать сумму, если возможны повторы, их кстати можно выявить если есть опасность)
Когда закончили с источником - создаём пустой массив (размеры известны - как исходный х словарь "молотков") и заполняем его циклом по ключам "молотков" и в нём цикл от 2 до конца массива (шапку отдельно сперва или в конце).


excel@nxt.ru
webmoney: E265281470651 Z422237915069
 
Ответить
СообщениеАлгоритм макроса (пока писать некогда):
в столбце выделенной ячейки
определяем последнюю строку, берём данные в массив
цикл по массиву, анализ строки
собираем словарь "молотков", каждому в item порядковый номер
и тут же второй словарь с ключём номер_строки_массива|"молоток" и в его Item кладём число (можно собирать сумму, если возможны повторы, их кстати можно выявить если есть опасность)
Когда закончили с источником - создаём пустой массив (размеры известны - как исходный х словарь "молотков") и заполняем его циклом по ключам "молотков" и в нём цикл от 2 до конца массива (шапку отдельно сперва или в конце).

Автор - Hugo
Дата добавления - 26.02.2015 в 16:36
sttt Дата: Четверг, 26.02.2015, 17:39 | Сообщение № 19
Группа: Пользователи
Ранг: Новичок
Сообщений: 13
Репутация: 0 ±
Замечаний: 0% ±

Excel 2007
по преобразованию сырых данных в нормальную форму


я этим пользуюсь, еще словарем для сбора списка уникальных полей, а потом это все горизонтально вывести.
[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

Range(ЯчейкаСКоторойВыводимКолонки.Address).Resize(1, dic.Count).Value = arrOut
[/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

Range(ЯчейкаСКоторойВыводимКолонки.Address).Resize(1, dic.Count).Value = arrOut
[/vba]
Код писал прям здесь, поэтому не знаю будет ли работать, но как-то так будет выводит колонки.

я пока над другим занят по работе, вернусь к проекту. но если кто поможет, отлично.
уже есть понимание, как делать. просто маленькие нюансы всплывают в коде, над ними эксперементирую.

Автор - sttt
Дата добавления - 26.02.2015 в 17:39
Gustav Дата: Четверг, 26.02.2015, 18:28 | Сообщение № 20
Группа: Друзья
Ранг: Участник клуба
Сообщений: 2748
Репутация: 1138 ±
Замечаний: 0% ±

начинал с Excel 4.0, видел 2.1
я этим пользуюсь, еще словарем для сбора списка уникальных полей, а потом это все горизонтально вывести

После "пользуюсь" уже не надо дальше ничего программировать. Надо строить сводную таблицу. Вручную, как пользователь, несколькими клацами мыши. Посмотрите в файле - разве плохо? Товарчики - уникальные, по алфавиту. По номерам строк можете легко приставить к исходной таблице.
К сообщению приложен файл: tov03.xlsm (22.6 Kb)


МОИ: Ник, Tip box: 41001663842605
 
Ответить
Сообщение
я этим пользуюсь, еще словарем для сбора списка уникальных полей, а потом это все горизонтально вывести

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

Автор - Gustav
Дата добавления - 26.02.2015 в 18:28
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Как из пользовательской функции заполнит несколько ячеек? (Макросы/Sub)
  • Страница 1 из 2
  • 1
  • 2
  • »
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2024 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!