< návrat zpět
MS Excel
Téma: Výběr hodnot splňující podmínku + vyhodnocení
Zaslal/a Jurka 25.2.2014 12:56
Dobrý den,
řeším, jak zjistit v řádku 5 buňek, obsahující čísla např.10,50,3,8,23 atd. ty, které jsou < 10 s podmínkou, když jich bude více než 3, tak vrátit hodnotu "Splňeno", jinak vrátit hodnotu "Ke splnění získej [počet pro splnění] hodnoty". Jde vše zapsat do jedné buňky?
Př:
12,2,8,30,8,9,10,20 =Splněno
50,32,85,2,4 =Ke splnění získej 1 hodnotu
Můžete mi prosím s tímto pomoci? Marně si s tím lámu hlavu.
Děkuji Vám mnohokrát.
J.
Jeza.m(25.2.2014 14:30)#017985 Něco takového?
=KDYŽ(COUNTIF(A1:E1;"<10")>=3;"Splněno";"Ke splnění získej " & 3-COUNTIF(A1:E1;"<10") & KDYŽ(3-COUNTIF(A1:E1;"<10")=1;" hodnotu";" hodnoty"))
M@
Příloha: 17985_sesit.zip (6kB, staženo 28x) citovat
AL(25.2.2014 14:37)#017986 Keď už som to písal, tak to sem dám tiež:
=IF(SUMPRODUCT((A1:H1<10)*ISNUMBER(A1:H1))>3;"splneno";"Ke splnění získej " & 4-SUMPRODUCT(--(A1:H1<10)) &" hodnotu")citovat
Jurka(25.2.2014 16:52)#017990 Děkuji Vám moc! Jeza.m a AL. Funguje parádně. Mám štěstí, že existujou chytří lidi a Excel!
citovat
lubo(25.2.2014 18:56)#017992 @AL
Zkus si v čistém sešitu spustit proceduru, zdá se, že když dva vzorce dělají totéž, nemusí to být úplně totéž.
Sub test()
Dim cas As Single
Application.Calculation = xlCalculationManual
Application.ScreenUpdating = False
[A1].Value = 1
[A1:A30].DataSeries Rowcol:=xlColumns, Type:=xlLinear, Step:=1, Stop:=30
[C1:C500].FormulaR1C1 = "=COUNTIF(C1,""<10"")"
ActiveSheet.Calculate ' Necháme spočítat závislosti buněk + případně rozběhneme procesor
cas = Timer()
ActiveSheet.EnableCalculation = False
ActiveSheet.EnableCalculation = True
ActiveSheet.Calculate ' přepočteme list na čas
Debug.Print Format(Timer() - cas, "0.000000") & " =COUNTIF(C1,""<10"")"
[C1:C500].FormulaR1C1 = "=SUMPRODUCT((C1<10)*ISNUMBER(C1))"
ActiveSheet.Calculate ' Necháme spočítat závislosti buněk + případně rozběhneme procesor
cas = Timer()
ActiveSheet.EnableCalculation = False
ActiveSheet.EnableCalculation = True
ActiveSheet.Calculate ' přepočteme list na čas
Debug.Print Format(Timer() - cas, "0.000000") & " =SUMPRODUCT((C1<10)*ISNUMBER(C1))"
ActiveSheet.UsedRange.Clear
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
End Sub
citovat
AL(25.2.2014 19:42)#017994 @Lubo: good point
Na svoju chabú obhajobu uvediem, že ten Tvoj kód nesimuluje úplne presne zadanie, takže som ho trochu upravil, aby ho lepšie reflektoval:
Sub test()
Dim cas As Single, myRngAddress As String
Application.Calculation = xlCalculationManual
Application.ScreenUpdating = False
[A1].Value = 1
' [A1:A30].DataSeries Rowcol:=xlColumns, Type:=xlLinear, Step:=1, Stop:=30
[A1:A500].DataSeries Rowcol:=xlColumns, Type:=xlLinear, Step:=1, Stop:=500
' [C1:C500].FormulaR1C1 = "=COUNTIF(C1,""<10"")"
myRngAddress = [A1:A500].Address(, , xlR1C1)
[C1:C500].FormulaR1C1 = "=COUNTIF(" & myRngAddress & ",""<10"")"
' ActiveSheet.Calculate ' Necháme spoèítat závislosti bunìk + pøípadnì rozbìhneme procesor
cas = Timer()
ActiveSheet.EnableCalculation = False
ActiveSheet.EnableCalculation = True
ActiveSheet.Calculate ' pøepoèteme list na èas
Debug.Print Format(Timer() - cas, "0.000000") & " =COUNTIF(C1,""<10"")"
' [C1:C500].FormulaR1C1 = "=SUMPRODUCT((C1<10)*ISNUMBER(C1))"
[C1:C500].FormulaR1C1 = "=SUMPRODUCT((" & myRngAddress & "<10)*ISNUMBER(" & myRngAddress & "))"
ActiveSheet.Calculate ' Necháme spoèítat závislosti bunìk + pøípadnì rozbìhneme procesor
cas = Timer()
ActiveSheet.EnableCalculation = False
ActiveSheet.EnableCalculation = True
ActiveSheet.Calculate ' pøepoèteme list na èas
Debug.Print Format(Timer() - cas, "0.000000") & " =SUMPRODUCT((C1<10)*ISNUMBER(C1))"
ActiveSheet.UsedRange.Clear
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
End SubUznávam ale bez mučenia, že Jezov prístup je vhodnejší a ja som vo svojej ješitnosti dal i svoje riešenie, ktoré som medzitým mal už napísané a medzitým odbehol od stroja.
citovat