Страницы: 1
RSS
sumif
 
Добрый ночи всем. как написать всё это одним макросом    
=суммесли(А1:А100;"петя";В1:В100)  
=суммесли(С1:С100;"петя";Д1:Д100)  
=суммесли(Е1:Е100;"петя";F1:F100)  
 
worksheetfunction.sumif(....
 
{quote}{login=Doc}{date=14.02.2009 01:45}{thema=sumif}{post}Добрый ночи всем. как написать всё это одним макросом    
=суммесли(А1:А100;"петя";В1:В100)  
=суммесли(С1:С100;"петя";Д1:Д100)  
=суммесли(Е1:Е100;"петя";F1:F100){/post}{/quote}  
 
СУММЕСЛИ в макросе будет выглядеть так:  
 
Sub Auto_SumIf()  
 With Application.WorksheetFunction  
   MsgBox .SumIf([A1:A100], "петя", [B1]) + _
          .SumIf([C1:C100], "петя", [D1]) + _
          .SumIf([E1:E100], "петя", [F1])
 End With  
End Sub  
 
Но мне больше нравится такой вариант:  
 
Sub AnalogSumIf()  
Dim tmp As Double  
 For Each i In Range("A1:A100,C1:C100,E1:E100")  
   If LCase(i.Text) = "петя" Then  
     tmp = tmp + Val(Replace(i.Offset(0, 1).Text, ",", "."))  
   End If  
 Next  
 MsgBox tmp  
End Sub
 
Кажется у вас где то ошибка, или у меня?
 
Я думал что они должны все сложиться между собой все эти столбцы:  
...искать в столбцах A:A,B:B,C:C слово петя и затем сложить все эти найденные, так?
 
Sub Auto_SumIf()  
   With Application.WorksheetFunction  
       MsgBox .SumIf([A1:A100], "петя", [B1:B100]) + _
       .SumIf([C1:C100], "петя", [D1:D100]) + _
       .SumIf([E1:E100], "петя", [F1:F100])
   End With  
End Sub
 
Что не так?
 
{quote}{login=Doc}{date=14.02.2009 02:58}{thema=}{post}Что не так?{/post}{/quote}Разместите код в обычном модуле: Insert -> Module  
 
> Кажется у вас где то ошибка, или у меня?  
Никакой ошибки нет, - просто разное написание.
 
Чтобы Вам было проще понять, вот выдержка из справки по функции СУММЕСЛИ():  
 
Аргумент «диапазон_суммирования» не обязательно должен совпадать по размеру и форме с аргументом «диапазон». При определении фактических ячеек, подлежащих суммированию, в качестве начальной ячейки используется верхняя левая ячейка аргумента «диапазон_суммирования», а затем суммируются ячейки, соответствующие по размеру и форме аргументу «диапазон».  
 
(ср) Excel 2007
 
Извиняюсь, совсем плохой стал. ко сну дело наверно. Но почему то у меня считает не корректно. Старые данные которые я вводил раньше они не все считаются, а вот которые новые ввожу они считаются. В чём дело может?
 
{quote}{login=Doc}{date=14.02.09 03:42}{thema=}{post}В чём дело может?{/post}{/quote}Скорее всего в формате значения. Там у Вас никакие зелёные треугольнички не отображаются? Второй макрос не пробовали, может сработает?  
А лучше покажите пример неправильности, чтобы не гадать...
 
вот
 
{quote}{login=Doc}{date=14.02.2009 04:28}{thema=}{post}вот{/post}{/quote}Функция работает со значением "01.01.2008", а не представлением "янв.08" (формат "МММ.ГГ").  
 
Это одна из причин, почему мне нравится больше макрос AnalogSumIf. Если вместо "петя" написать "фев.08", то он сосчитает правильно. Также, в отличии от СУММЕСЛИ, допускается суммирование ячеек, содержащих ошибки.
 
ВЫ знаете теперь и она мне тоже нравится. Хорошая функция. действительно всё дело в форматах. И тогда один последний вопрос. Как можно в диапазоне A:A,B:B, и т.д во всех значениях одним махом поменять запятые на точки и чтобы в будущем даже если будет введена запятая, превращалась в точку. прям поле чудес какое то. :) Спасибо Вам
 
{quote}{login=Doc}{date=14.02.2009 05:11}{thema=}{post}Как можно в диапазоне A:A,B:B, и т.д во всех значениях одним махом поменять запятые на точки и чтобы в будущем даже если будет введена запятая, превращалась в точку.{/post}{/quote}А стандартное Правка -> Заменить не подойдёт?  
 
Если Вы хотите заменять тчк на зпт только в определённом диапазоне, то необходимо поместить в модуль листа (ПКМ по ярлычку листа -> Исходный текст) такой код:  
 
Private Sub Worksheet_SelectionChange(ByVal Target As Range)  
 If Not Intersect(Target, [A:A, C:C, E:E]) Is Nothing Then
   Application.AutoCorrect.AddReplacement ",", "."  
 Else  
   On Error Resume Next  
   Application.AutoCorrect.DeleteReplacement ","  
 End If  
End Sub  
 
Полезный совет: чтобы увидеть форматирование кода нажмите [ответить с цитированием].
 
а можно как нибудь ускорить, у меня секунд 5 думает прежде чем найдёт    
 
Sub AnalogSumIf()  
Dim tmp As Double  
For Each i In Range("c:c,f:f,i:i")  
If LCase(i.Text) = "фев.09" Then  
tmp = tmp + Val(Replace(i.Offset(0, 1).Text, ",", "."))  
End If  
Next  
MsgBox tmp  
End Sub
 
{quote}{login=doc}{date=14.02.2009 01:54}{thema=}{post}а можно как-нибудь ускорить, у меня секунд 5 думает прежде чем найдёт{/post}{/quote}Вполне:  
 
Sub AnalogSumIf_TURBO()  
Dim tmp As Double, myRng As Range, i As Range, n As Byte, m As Single  
 Set myRng = Range("c:c,f:f,i:i") 'диапазон  
 For n = 1 To myRng.Areas.Count  
   msv1 = myRng.Areas(n)  
   msv2 = myRng.Areas(n).Offset(0, 1) 'смещение  
   For m = 1 To UBound(msv1)  
     If Not Len(msv1(m, 1)) = 0 Then  
       If msv1(m, 1) Like "##.02.2009" Then 'критерий  
         tmp = tmp + msv2(m, 1)  
 End If: End If: Next: Next  
 MsgBox tmp  
End Sub
 
А можно поподробнее расписать этот код по словам. А то у меня опять неправильно работает. Мож опять чё напутал
 
{quote}{login=doc}{date=14.02.09 15:02}{thema=}{post}Мож опять чё напутал{/post}{/quote}Обратите внимание на критерий. Может у вас два знака представления года? Это видно в строке формул, когда выделяешь ячейку.
 
У меня такая непонятка.    
1. В одной ячейке "фев.08" - формат "ДДД.ГГ"  
2. В другой ячейке тоже "фев.08" -  формат "ДДД.ГГ"  
так при выделении первой в строке формул отображается 01.02.2008, а второй фев.08.  
Не пойму. И с Вашей формулой он считает только второе значение
 
{quote}{login=doc}{date=14.02.09 03:22}{thema=}{post}И с Вашей формулой он считает только второе значение{/post}{/quote}TURBO-код должен был посчитать только первое. А что если оба критерия прописать?:  
If msv1(m, 1) Like "##.02.2008" Or msv1(m, 1) = "фев.08" Then 'критерии
 
"##.02.2008 я так понял это любое другое число + февраль
 
А как сделать поиск по всем месяцам и вставить их в листбокс.  
 
UserForm1.ListBox1.AddItem "янв.09" & vbTab & tmp  
UserForm1.ListBox1.AddItem "фев.09" & vbTab & tmp  
UserForm1.ListBox1.AddItem "мар.09" & vbTab & tmp  
UserForm1.ListBox1.AddItem "апр.09" & vbTab & tmp  
и т.д.
 
{quote}{login=doc}{date=14.02.09 17:21}{thema=}{post}А как сделать поиск по всем месяцам и вставить их в листбокс.{/post}{/quote}Найдите в нижеследующем коде десять отличий от предыдущего и станет понятно как. :))  
 
Private Sub UserForm_Initialize()  
Dim Mmn(1 To 12) As String, mnI As Byte, n As Byte, m As Single  
Dim tmp As Double, myRng As Range, i As Range  
 For mnI = 1 To 12 'для каждого месяца  
   fText1 = Format("1." & mnI & ".2009", "MMM.YY") 'критерий1  
   fText2 = "##." & Format(mnI, "00") & ".2009" 'критерий2  
 Set myRng = Range("c:c,f:f,i:i") 'диапазон  
 For n = 1 To myRng.Areas.Count  
   msv1 = myRng.Areas(n)  
   msv2 = myRng.Areas(n).Offset(0, 1) 'смещение  
   For m = 1 To UBound(msv1)  
     If Not Len(msv1(m, 1)) = 0 Then  
       If msv1(m, 1) = fText1 Or msv1(m, 1) Like fText2 Then 'сравниваем  
         tmp = tmp + msv2(m, 1) 'суммируем  
 End If: End If: Next: Next  
 Mmn(mnI) = fText1 & vbTab & tmp: tmp = 0 'запоминаем  
 Next  
 Me.ListBox1.List = Mmn 'заполняем лист  
End Sub
 
спаибо Турбо-ёж, только очень долговато открывается форма, секунд 3.
 
{quote}{login=doc}{date=14.02.09 19:34}{thema=}{post}спаибо Турбо-ёж, только очень долговато открывается форма, секунд 3.{/post}{/quote}Пожалуйста. Вот так (перевложил циклы) будет ровно в три раза быстрее:  
 
Private Sub UserForm_Initialize()  
Dim Mmn(1 To 12) As String, mnI As Byte, n As Byte, m As Single  
Dim tmp As Double, myRng As Range, i As Range, fText1 As String, fText2 As String  
 Set myRng = Range("c:c,f:f,i:i") 'диапазон  
 For n = 1 To myRng.Areas.Count  
   msv1 = myRng.Areas(n)  
   msv2 = myRng.Areas(n).Offset(0, 1) 'смещение  
   For mnI = 1 To 12 'для каждого месяца  
     fText1 = Format("1." & mnI & ".2009", "MMM.YY") 'критерий1  
     fText2 = "##." & Format(mnI, "00") & ".2009" 'критерий2  
     For m = 1 To UBound(msv1)  
       If Not Len(msv1(m, 1)) = 0 Then  
         If msv1(m, 1) = fText1 Or msv1(m, 1) Like fText2 Then 'сравниваем  
           tmp = tmp + msv2(m, 1) 'суммируем  
     End If: End If: Next  
     Mmn(mnI) = fText1 & vbTab & tmp: tmp = 0 'запоминаем  
   Next  
 Next  
 Me.ListBox1.List = Mmn 'заполняем лист  
End Sub
 
Я определил диапазон конкретно, работает быстрее. Так думаю устроит  
Range("c2:c3000,f2:f3000,i2:i3000")  
Турбо-ёж, а ВЫ можете добавить строчку чтоб по изменении в combobox производился поиск. В  combobox выбрано 2005 и ушёл поиск по всему году. также и для других годов. Сам пытаюсь, но ВЫ как учитель сделаете это быстрее. Спасибо
 
Как я понял нужно поменять критерий?  
fText1 = Format("1." & mnI & ".2007", "MMM.YY")    
fText2 = "##." & Format(mnI, "00") & ".2007"
Страницы: 1
Читают тему
Наверх