Excel (VBA) - funkce na součet matic

Programy pro práci v kanceláři (Word, Excel, Access…=>Office)

Moderátor: Mods_senior

Gerill
nováček
Příspěvky: 30
Registrován: květen 08
Pohlaví: Nespecifikováno
Stav:
Offline

Excel (VBA) - funkce na součet matic

Příspěvekod Gerill » 23 zář 2010 20:30

Zdravim,

potřeboval bych napsat ve VBA funkci, která bude sčítat 2 matice. Věděl by někdo, jak na to?

Reklama
Uživatelský avatar
Poki
Level 2
Level 2
Příspěvky: 237
Registrován: prosinec 09
Pohlaví: Muž
Stav:
Offline

Re: Excel (VBA) - funkce na součet matic

Příspěvekod Poki » 24 zář 2010 10:46

Zdravim,
myslim, ze neni nutne psat vlastni funkci - staci pouzit maticoveho vzorce.
Mate-li tedy napr. jednu matici v A1:C3 a druhou v E1:G3, pak tedy staci oznacit odpovidajici oblast -stejny pocet radku a sloupcu, jako scitane matice (napr. B6:D8) a do radku vzorcu napsat vzorec =A1:C3+E1:G3 a ukoncit ho stiskem CTRL+SHIFT+ENTER (maticovy vzorec).

Gerill
nováček
Příspěvky: 30
Registrován: květen 08
Pohlaví: Nespecifikováno
Stav:
Offline

Re: Excel (VBA) - funkce na součet matic

Příspěvekod Gerill » 24 zář 2010 17:53

O tomhle řešení vím, ale i tak to potřebuji napsat jako funkci.

navstevnik
Level 4
Level 4
Příspěvky: 1142
Registrován: srpen 08
Pohlaví: Nespecifikováno
Stav:
Offline

Re: Excel (VBA) - funkce na součet matic

Příspěvekod navstevnik » 24 zář 2010 18:54

Upraveno: koukni se na http://www.thecodenet.com/articles.php?id=8 a pripadne si najdi dalsi

Gerill
nováček
Příspěvky: 30
Registrován: květen 08
Pohlaví: Nespecifikováno
Stav:
Offline

Re: Excel (VBA) - funkce na součet matic

Příspěvekod Gerill » 27 zář 2010 18:12

Díky za odkaz. Koukal jsem na to, ale bohužel z toho moc moudrý nejsem :(. Jestli to chápu správně, potřebuju funkci, která vezme hodnotu po hodnotě z oblasti 1 a sečte s hodnotami v oblasti 2... Snažil jsem se to prozkoumat, ale nic jsem tam nenašel. Nebylo by něco více konkrétnějšího? :oops:

navstevnik
Level 4
Level 4
Příspěvky: 1142
Registrován: srpen 08
Pohlaví: Nespecifikováno
Stav:
Offline

Re: Excel (VBA) - funkce na součet matic

Příspěvekod navstevnik » 28 zář 2010 11:24

Prostudovanim prilozeneho odkazu a souboru v odkazu bys nasel reseni uzivatelske funkce pro soucet matic.

Ve standardnim modulu je vlozena funkce realizujici soucet matic:

Kód: Vybrat vše

Option Explicit

Public Function SoucetMatic(Matice1 As Range, Matice2 As Range) As Variant()
  Dim Mt1() As Variant, Mt2() As Variant
  Dim r As Integer, c As Integer
  Dim temp() As Variant
  ' vlozeni hodnot matic do poli Mt
  Mt1 = Matice1.Value
  Mt2 = Matice2.Value
  ' kontrola shody rozmeru matic
  If UBound(Mt1) = UBound(Mt2) And UBound(Mt1, 2) = UBound(Mt2, 2) Then
    ' redefinice pole temp() podle rozmeru vstupnich matic
    ReDim temp(LBound(Mt1) To UBound(Mt1), _
        LBound(Mt1, 2) To UBound(Mt1, 2))
    ' smycka po radcich a sloupcich,
    ' vlozeni souctu do pole temp()
    For r = LBound(Mt1) To UBound(Mt1)
      For c = LBound(Mt1, 2) To UBound(Mt1, 2)
        temp(r, c) = Mt1(r, c) + Mt2(r, c)
      Next c
    Next r
    SoucetMatic = temp()
  Else
    Exit Function
  End If
End Function


Na listu jsou dany dve matice shodne rozmerem, vyberes novy blok bunek o shodnem rozmeru a v editacnim radku rovnic vlozis funkci (priklad): =SoucetMatic(A1:B4;D1:E4) a zadas maticove - Ctrl+Shift+Enter
Pokud vysledkova matice bude zadana rozmerove odlisne, bude v prebyvajicich bunkach hodnota #N/A

Gerill
nováček
Příspěvky: 30
Registrován: květen 08
Pohlaví: Nespecifikováno
Stav:
Offline

Re: Excel (VBA) - funkce na součet matic

Příspěvekod Gerill » 01 říj 2010 01:19

Díky moc, funguje to tak jak má. Akorát si tam přidám ošetření, aby nebyly v matici prázdné buňky.

jen jeden malej dotaz:

Kód: Vybrat vše

Public Function SoucetMatic(Matice1 As Range, Matice2 As Range) As Variant()


co znamenají ty závorky na konci u datového typu? Když jsem to zkoušel bez nich, tak se nevyhodila chyba hodnoty pokud matice neměly stejný rozměr, ale byly všude nuly.

navstevnik
Level 4
Level 4
Příspěvky: 1142
Registrován: srpen 08
Pohlaví: Nespecifikováno
Stav:
Offline

Re: Excel (VBA) - funkce na součet matic

Příspěvekod navstevnik » 01 říj 2010 04:37

Prazdne bunky se chovaji jako bunky obsahujici 0 (nulu), takze neni z matematickeho hlediska nutne zadne opatreni.
Deklarace typu vystupu - Variant() zajistuje navratovy typ: pole datoveho typu variant. Funkce musi vracet pole a protoze se jedna o funkci Array (je zadavana maticove), je nutny pro naplneni tohoto pole typ Variant.
V pripade chyby v behu funkce nebo neshody matic je v pripade, kdy neni deklarovan (nebo jen Variant) navratovy typ, je vracena 0 (nula).

Doplneno: Muzes poexperimentovat, z funkce vypustit kontrolu rozmeru matic a pro rozmery pole temp pouzit mensi rozmery vstupnich matic.

Gerill
nováček
Příspěvky: 30
Registrován: květen 08
Pohlaví: Nespecifikováno
Stav:
Offline

Re: Excel (VBA) - funkce na součet matic

Příspěvekod Gerill » 06 říj 2010 22:28

Tak nakonec bych potřeboval ještě jednu věc. Potřebuji v projektu 2 funkce, jednu řekněme hlavní a jednu vedlejší. Ta vedlejší se má v té hlavní volat.

napadlo mě vzít vše co následuje po:

Kód: Vybrat vše

If UBound(Mt1) = UBound(Mt2) And UBound(Mt1, 2) = UBound(Mt2, 2) Then


tudíž:

Kód: Vybrat vše

  ' redefinice pole temp() podle rozmeru vstupnich matic
    ReDim temp(LBound(Mt1) To UBound(Mt1), _
        LBound(Mt1, 2) To UBound(Mt1, 2))
    ' smycka po radcich a sloupcich,
    ' vlozeni souctu do pole temp()
    For r = LBound(Mt1) To UBound(Mt1)
      For c = LBound(Mt1, 2) To UBound(Mt1, 2)
        temp(r, c) = Mt1(r, c) + Mt2(r, c)
      Next c
    Next r
    SoucetMatic = temp()


a z toho udělat samostatnou funkci, kterou poté v tomu ifu jen zavolám. Problém je v tom, že nevím jak uchovat ty hodnoty Mt1 a Mt2, aby platily i v té vedlejší funkci.

napsal jsem to takhle, ale nevim s těma proměnnýma Mt1 a Mt2

Kód: Vybrat vše

Private Function ScitaniM() As Variant()

  Dim r As Integer, c As Integer
  Dim vyslPole() As Variant

  ReDim vyslPole(LBound(Mt1) To UBound(Mt1), LBound(Mt1, 2) To UBound(Mt1, 2))
               
    For r = LBound(Mt1) To UBound(Mt1)
      For c = LBound(Mt1, 2) To UBound(Mt1, 2)
           
       vyslPole(r, c) = Mt1(r, c) + Mt2(r, c)
               
     Next c
   Next r
           
    ScitaniM = vyslPole()
   
End Function


byla by i tady nějaká rada? věřim, že je to jen nějaká ptákovina

navstevnik
Level 4
Level 4
Příspěvky: 1142
Registrován: srpen 08
Pohlaví: Nespecifikováno
Stav:
Offline

Re: Excel (VBA) - funkce na součet matic

Příspěvekod navstevnik » 07 říj 2010 10:34

Neni mi jasne, co tim sledujes, co tohle, pokud jsem spravne pochopil (je zapotrebi predavat parametry):

Kód: Vybrat vše

Option Explicit

Public Function SoucetMatic(Matice1 As Range, Matice2 As Range) As Variant()
  Dim Mt1() As Variant, Mt2() As Variant

  ' vlozeni hodnot matic do poli Mt
  Mt1 = Matice1.Value
  Mt2 = Matice2.Value
  ' kontrola shody rozmeru matic
  If UBound(Mt1) = UBound(Mt2) And UBound(Mt1, 2) = UBound(Mt2, 2) Then
    SoucetMatic = ScitaniM(Mt1, Mt2)
  End If
End Function

Private Function ScitaniM(Mt1() As Variant, Mt2() As Variant) As Variant()
  Dim r As Integer, c As Integer
  Dim vyslPole() As Variant

  ReDim vyslPole(LBound(Mt1) To UBound(Mt1), LBound(Mt1, 2) To UBound(Mt1, 2))
  For r = LBound(Mt1) To UBound(Mt1)
    For c = LBound(Mt1, 2) To UBound(Mt1, 2)
      vyslPole(r, c) = Mt1(r, c) + Mt2(r, c)
    Next c
  Next r
  ScitaniM = vyslPole()
End Function

' nasledujici sub slouzi pro moznost krokovani (F8) funkcemi
Sub TestSoucetMatic()
  Dim MtR1 As Range, MtR2 As Range
  Dim SumM() As Variant
 
  Set MtR1 = Range("a1:B4")
  Set MtR2 = Range("d1:e4")
  SumM() = TestMatic(MtR1, MtR2)
End Sub

Gerill
nováček
Příspěvky: 30
Registrován: květen 08
Pohlaví: Nespecifikováno
Stav:
Offline

Re: Excel (VBA) - funkce na součet matic

Příspěvekod Gerill » 14 říj 2010 14:35

díky to je ono...ještě poslední věc, šlo by to nějak upravit, aby to fungovalo i na matice 1x1?

navstevnik
Level 4
Level 4
Příspěvky: 1142
Registrován: srpen 08
Pohlaví: Nespecifikováno
Stav:
Offline

Re: Excel (VBA) - funkce na součet matic

Příspěvekod navstevnik » 14 říj 2010 15:47

Upravit se da, ale nevidim smysl takoveto upravy, je to paslvil, ktery by nemel spatri svetlo sveta:

Kód: Vybrat vše

Option Explicit

Public Function SoucetMatic1(Matice1 As Range, Matice2 As Range) As Variant()
  Dim Mt1() As Variant, Mt2() As Variant
  Dim r As Integer, c As Integer
  Dim temp() As Variant
  If Matice1.Cells.Count = 1 And Matice2.Cells.Count = 1 Then
    ReDim temp(0)
    temp(0) = Matice1.Value + Matice2.Value
    SoucetMatic1 = temp()
  Else
    ' vlozeni hodnot matic do poli Mt
    Mt1 = Matice1.Value
    Mt2 = Matice2.Value
    ' kontrola shody rozmeru matic
    If UBound(Mt1, 1) = UBound(Mt2, 1) And UBound(Mt1, 2) = UBound(Mt2, 2) Then
      ' redefinice pole temp() podle rozmeru vstupnich matic
      ReDim temp(LBound(Mt1, 1) To UBound(Mt1, 1), _
          LBound(Mt1, 2) To UBound(Mt1, 2))
      ' smycka po radcich a sloupcich,
      ' vlozeni souctu do pole temp()
      For r = LBound(Mt1) To UBound(Mt1)
        For c = LBound(Mt1, 2) To UBound(Mt1, 2)
          temp(r, c) = Mt1(r, c) + Mt2(r, c)
        Next c
      Next r
      SoucetMatic1 = temp()
    Else
      Exit Function
    End If
  End If
End Function
Sub TestSoucetMatic1()
  Dim Suma() As Variant
  With Worksheets("list1")
    Suma = SoucetMatic1(.Range("a1"), .Range("d1"))
    Suma = SoucetMatic1(.Range("a1:b4"), .Range("d1:e4"))
  End With
End Sub


  • Mohlo by vás zajímat
    Odpovědi
    Zobrazení
    Poslední příspěvek
  • EXCEL -jak otevřít 2 excel sobory abych je viděla současne a samostatně
    od Ketty02 » 30 srp 2024 21:19 » v Vše ostatní (sw)
    2
    4778
    od Riviera kid Zobrazit poslední příspěvek
    02 zář 2024 16:21
  • Přechod z Excel 21 na Excel 24
    od Snekment » 29 led 2025 13:46 » v Kancelářské balíky
    2
    12192
    od Snekment Zobrazit poslední příspěvek
    29 led 2025 15:05
  • Pohoda a excel Příloha(y)
    od brownwld » 06 kvě 2025 17:28 » v Kancelářské balíky
    1
    4623
    od atari Zobrazit poslední příspěvek
    07 kvě 2025 09:41
  • Excel - výpočet nočních hodin Příloha(y)
    od Uziv00 » 17 říj 2024 11:22 » v Kancelářské balíky
    3
    3318
    od lubo. Zobrazit poslední příspěvek
    24 říj 2024 00:00
  • Tisk sloupců vedle sebe na A4 - Excel
    od atari » 24 dub 2025 10:51 » v Kancelářské balíky
    5
    3909
    od atari Zobrazit poslední příspěvek
    26 dub 2025 09:11

Zpět na “Kancelářské balíky”

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 3 hosti