Хочу сам написать для себя полный учет семейного бюджета, начало было положено хорошо,но сегодня столкнулся с серьезной проблемой: хотел написать универсальную функцию - [vba]
Код
функция (область, что ищем, что записывать) переменная1 = область.поиск (что ищем) пока переменная1 найдена то функция = функция + значение(переменная1.offset( , что записывать)) конец пока конец функции
[/vba] [vba]
Код
Function GetSumm(RangeData As Range, Name, offset As Integer)
Dim foundCell As Range
Set foundCell = RangeData.Find(Name, LookIn:=xlFormula) If Not foundCell Is Nothing Then GetSumm = foundCell Set foundCell = .FindNext(foundCell) Else GetSumm = -1 End If
End Function
[/vba] сделал бы цикл while, дак боюсь, что он бесконечный будет т.к. всегда будет находиться .FindNext(foundCell) функция пишется для первого листа для диаграммы в которую нужно объедененные данные подставить т.е. суммы Тему буду развивать по мере поступления вопросов (хочу еще многое добавить)
Хочу сам написать для себя полный учет семейного бюджета, начало было положено хорошо,но сегодня столкнулся с серьезной проблемой: хотел написать универсальную функцию - [vba]
Код
функция (область, что ищем, что записывать) переменная1 = область.поиск (что ищем) пока переменная1 найдена то функция = функция + значение(переменная1.offset( , что записывать)) конец пока конец функции
[/vba] [vba]
Код
Function GetSumm(RangeData As Range, Name, offset As Integer)
Dim foundCell As Range
Set foundCell = RangeData.Find(Name, LookIn:=xlFormula) If Not foundCell Is Nothing Then GetSumm = foundCell Set foundCell = .FindNext(foundCell) Else GetSumm = -1 End If
End Function
[/vba] сделал бы цикл while, дак боюсь, что он бесконечный будет т.к. всегда будет находиться .FindNext(foundCell) функция пишется для первого листа для диаграммы в которую нужно объедененные данные подставить т.е. суммы Тему буду развивать по мере поступления вопросов (хочу еще многое добавить)Ivanius
Бухгалтерия в ексел? Уж лучше микроскопом гвозди заколачивать! На базах ещё куда ни шло! Хотя бы на Аксессе Или DBF тем более с таким подходом обработки данных! Построчное считывание значений! Тормоз будет страшный
Бухгалтерия в ексел? Уж лучше микроскопом гвозди заколачивать! На базах ещё куда ни шло! Хотя бы на Аксессе Или DBF тем более с таким подходом обработки данных! Построчное считывание значений! Тормоз будет страшныйalex77755
Могу помочь в VB6, VBA Alex77755@mail.ru
Сообщение отредактировал alex77755 - Среда, 19.02.2014, 01:07
Function GetSumm(RangeData As Range, Name, offset As Integer)
Dim firstFind, FoundCell As Range Dim summ
Set FoundCell = RangeData.Find(Name, LookIn:=xlFormulas, LookAt:=xlPart)
If Not FoundCell Is Nothing Then summ = summ + FoundCell.offset(, 1).Value Set firstFind = FoundCell finding: Set FoundCell = RangeData.Find(Name, after:=Range(FoundCell.Address), LookIn:=xlFormulas, LookAt:=xlPart) If (Not FoundCell.Address = firstFind.Address) And (Not FoundCell Is Nothing) Then summ = summ + FoundCell.offset(, 1).Value GoTo finding Else GoTo endi End If endi: Else GetSumm = -1 End If GetSumm = summ End Function
[/vba]
вот так вот получилось:[vba]
Код
Function GetSumm(RangeData As Range, Name, offset As Integer)
Dim firstFind, FoundCell As Range Dim summ
Set FoundCell = RangeData.Find(Name, LookIn:=xlFormulas, LookAt:=xlPart)
If Not FoundCell Is Nothing Then summ = summ + FoundCell.offset(, 1).Value Set firstFind = FoundCell finding: Set FoundCell = RangeData.Find(Name, after:=Range(FoundCell.Address), LookIn:=xlFormulas, LookAt:=xlPart) If (Not FoundCell.Address = firstFind.Address) And (Not FoundCell Is Nothing) Then summ = summ + FoundCell.offset(, 1).Value GoTo finding Else GoTo endi End If endi: Else GetSumm = -1 End If GetSumm = summ End Function
Goto, Goto не красиво. Пример без Goto. Здесь добавляются значения в список. Поменяй на суммирование
[vba]
Код
Dim C ' номер колонки со списком C = 1 ' если надо поменять ListBox1.Clear With Worksheets("Работы") Set RN0 = Range(.Cells(1, C), .Cells(.Cells(.Rows.Count, C).End(xlUp).Row, C)) End With With RN0 Set RNG = .Find(What:=TextBox1.Value, LookIn:=xlValues, LookAt:=xlPart) If Not RNG Is Nothing Then Адрес = RNG.Address Do ListBox1.AddItem RNG Set RNG = .FindNext(RNG) Loop While Адрес <> RNG.Address End If End With
[/vba]
Goto, Goto не красиво. Пример без Goto. Здесь добавляются значения в список. Поменяй на суммирование
[vba]
Код
Dim C ' номер колонки со списком C = 1 ' если надо поменять ListBox1.Clear With Worksheets("Работы") Set RN0 = Range(.Cells(1, C), .Cells(.Cells(.Rows.Count, C).End(xlUp).Row, C)) End With With RN0 Set RNG = .Find(What:=TextBox1.Value, LookIn:=xlValues, LookAt:=xlPart) If Not RNG Is Nothing Then Адрес = RNG.Address Do ListBox1.AddItem RNG Set RNG = .FindNext(RNG) Loop While Адрес <> RNG.Address End If End With
проблема в том что в моем екселе не работает : э [vba]
Код
.FindNext - пробовал (только через простой файнд с указанием адреса) и если через цикл не работает exit do, тоже проверял
[/vba] Далее я то пишу функцию и мне ЯВНО (т.е. какие-то либо номера) нельзя указывать только переменные взятые из входящих данных в функцию а именно - RangeData - т.е. указывается область поиска, name - что искать тоже может быть область, ну и оффсет это данные которые будут считываться и братся относительно найденного. Ну меня пока на самом деле все устраивает, знаю что не красиво, я вообще программист на delphi и мне некоторые моменты не понятны, точнее то что выше не работает у меня... вот так вот в итоге получилось, ничего лишнего и достаточно просто: [vba]
Код
Function GetSumm(RangeData As Range, Name, offset As Integer)
Dim firstFind, FoundCell As Range
Set FoundCell = RangeData.Find(Name, LookIn:=xlFormulas, LookAt:=xlPart)
If Not FoundCell Is Nothing Then GetSumm = GetSumm + FoundCell.offset(, offset).Value Set firstFind = FoundCell finding: Set FoundCell = RangeData.Find(Name, after:=Range(FoundCell.Address), LookIn:=xlFormulas, LookAt:=xlPart) If (Not FoundCell.Address = firstFind.Address) And (Not FoundCell Is Nothing) Then GetSumm = GetSumm + FoundCell.offset(, offset).Value GoTo finding Else GoTo endi End If endi: Else GetSumm = -1 End If End Function
[/vba]
проблема в том что в моем екселе не работает : э [vba]
Код
.FindNext - пробовал (только через простой файнд с указанием адреса) и если через цикл не работает exit do, тоже проверял
[/vba] Далее я то пишу функцию и мне ЯВНО (т.е. какие-то либо номера) нельзя указывать только переменные взятые из входящих данных в функцию а именно - RangeData - т.е. указывается область поиска, name - что искать тоже может быть область, ну и оффсет это данные которые будут считываться и братся относительно найденного. Ну меня пока на самом деле все устраивает, знаю что не красиво, я вообще программист на delphi и мне некоторые моменты не понятны, точнее то что выше не работает у меня... вот так вот в итоге получилось, ничего лишнего и достаточно просто: [vba]
Код
Function GetSumm(RangeData As Range, Name, offset As Integer)
Dim firstFind, FoundCell As Range
Set FoundCell = RangeData.Find(Name, LookIn:=xlFormulas, LookAt:=xlPart)
If Not FoundCell Is Nothing Then GetSumm = GetSumm + FoundCell.offset(, offset).Value Set firstFind = FoundCell finding: Set FoundCell = RangeData.Find(Name, after:=Range(FoundCell.Address), LookIn:=xlFormulas, LookAt:=xlPart) If (Not FoundCell.Address = firstFind.Address) And (Not FoundCell Is Nothing) Then GetSumm = GetSumm + FoundCell.offset(, offset).Value GoTo finding Else GoTo endi End If endi: Else GetSumm = -1 End If End Function
Ivanius, Дело конечно-же Ваше, но почему все так сложно?
Почему не одна таблица/форма Приход/Расход с одним столбцом в котором можно выбрать пункт приход или расход. Суммировать или отнимать от остатка. Сделать одну таблицу где выбирая промежуток дат с и по можно просмотреть как все по отдельности так на опред. день. Дальше хоть диаграмму, хоть график чертите.
Ivanius, Дело конечно-же Ваше, но почему все так сложно?
Почему не одна таблица/форма Приход/Расход с одним столбцом в котором можно выбрать пункт приход или расход. Суммировать или отнимать от остатка. Сделать одну таблицу где выбирая промежуток дат с и по можно просмотреть как все по отдельности так на опред. день. Дальше хоть диаграмму, хоть график чертите.Stormy
Stormy, ооо спасибо за совет, сейчас совмещу табличку, уже начал усложнять систему и увидел сложности реализации, а многого в ВБА просто не знаю.
Stormy, ооо спасибо за совет, сейчас совмещу табличку, уже начал усложнять систему и увидел сложности реализации, а многого в ВБА просто не знаю.Ivanius
Ivanius, Дык, дело не в сложности таблицы, дело в том как ее вести. Для Вашей задачи и не нужны спец-функции, стандартных больше чем достаточно. Опять таки, это все мое мнение.
Ivanius, Дык, дело не в сложности таблицы, дело в том как ее вести. Для Вашей задачи и не нужны спец-функции, стандартных больше чем достаточно. Опять таки, это все мое мнение.Stormy