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

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

Příspěvekod Gerill » 03 led 2011 15:12

zdravim,
po delší době se opět hlásim s nějakými problémy. Rozhodl jsem se předělat funkci na makro a mám pár dotazů. Jedná se o veřejné makro, které zpracovává vstupní data přes dialogové okno userform.

userform vypadá takto:
Obrázek

kódy ke tlačítkům:

Kód: Vybrat vše

Private Sub buttOK_Click()

Dim mt1() As Variant
Dim mt2() As Variant
Dim hodnota As Variant

     'testuje zda jsou zadane hodnoty matic
    If RE_matice1 = "" Or RE_matice2 = "" Then
        MsgBox ("Musite vybrat hodnoty matic.")
        Exit Sub
    End If
   
    'naplnění proměnných daty
    mt1 = Range(RE_matice1).Value
    mt2 = Range(RE_matice2).Value
   
   
    'ošetření proti zadávání nečíselných hodnot a prázdných buněk
    For Each hodnota In mt1
    If IsNumeric(hodnota) = False Or IsEmpty(hodnota) Then
        MsgBox ("Některé z hodnot nejsou číselné nebo jsou prázdné.")
        Exit Sub
    End If
    Next hodnota
           
    For Each hodnota In mt2
    If IsNumeric(hodnota) = False Or IsEmpty(hodnota) Then
        MsgBox ("Některé z hodnot nejsou číselné nebo jsou prázdné.")
        Exit Sub
    End If
    Next hodnota
             
    ' kontrola zda jsou rozměry obou matic shodné
    If UBound(mt1) = UBound(mt2) And UBound(mt1, 2) = UBound(mt2, 2) Then
             
      Call NovyList
      Call SoucetM(mt1, mt2)
   
    Else
      MsgBox ("Obě matice musí mít stejné rozměry!")
      Exit Sub
    End If
   
    Unload UserForm1
   
End Sub

'pro tlačítko storno
Private Sub buttStorno_Click()
    Unload UserForm1
End Sub


modul1:

Kód: Vybrat vše

Sub SoucetMatic()
    UserForm1.Show
End Sub

' vytvoří nový list s řešením
Sub NovyList()
    Dim newSheet As Worksheet
    i = 1
    Set newSheet = Sheets.Add(after:=ActiveSheet, Count:=1)
    On Error GoTo chyba
        newSheet.Name = "Řešení " & Str(i)
        i = i + 1
    Exit Sub
chyba:
    i = i + 1
    Resume
End Sub

Function ScitaniM(mt1() As Variant, mt2() As Variant) As Variant()

  Dim r As Integer, c As Integer
  Dim vyslPole() As Variant
 
  ' redefinice výsledného pole podle rozměrů vstupních matic
  ReDim vyslPole(LBound(mt1) To UBound(mt1), LBound(mt1, 2) To UBound(mt1, 2))
   
  If UBound(mt1) = 1 And UBound(mt2) = 1 Then
    vyslPole(r) = mt1(r) + mt2(r)
  Else
 
    ' cyklus na procházení řádků a sloupců
    ' a následné vložení součtu do výsledného pole
    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 If
 
End Function


modul2:

Kód: Vybrat vše

Sub SoucetM(mt1() As Variant, mt2() As Variant)
   
    'Deklarace proměnných
    Dim vysledek As Variant

   
    'Volání vybrané funkce
    vysledek = ScitaniM(mt1, mt2)
   
    'Formátování na novém listu řešení
    Range("B2").Select
    ActiveCell.FormulaR1C1 = "Součet matic"
    With ActiveCell.Font
        .FontStyle = "Tučné"
        .Size = 11
    End With
   
    Range("B5").Select
    ActiveCell.FormulaR1C1 = "matice 1"
    With ActiveCell.Font
        .FontStyle = "Tučné"
    End With
   
    Range("C5").Select
    ActiveCell.FormulaR1C1 = "matice 2"
    With ActiveCell.Font
        .FontStyle = "Tučné"
    End With
   
    Range("D5").Select
    ActiveCell.FormulaR1C1 = "součet"
    With ActiveCell.Font
        .FontStyle = "Tučné"
    End With
   
    'výpis výsledku v určené oblasti
    Range("D6").Resize(3, 3).Value = vysledek
     
End Sub


1. dotaz - mám tu makro na generování nového listu s řešením a potřeboval bych, aby list vkládal za poslední list v sešitu

Kód: Vybrat vše

' vytvoří nový list s řešením
Sub NovyList()
    Dim newSheet As Worksheet
    i = 1
    Set newSheet = Sheets.Add(after:=ActiveSheet, Count:=1) /// tady nevim, jak to přepsat
    On Error GoTo chyba
        newSheet.Name = "Řešení " & Str(i)
        i = i + 1
    Exit Sub
chyba:
    i = i + 1
    Resume
End Sub


2. dotaz - na nový list s řešením (modul2) bych potřeboval vygenerovat i počítané matice (zadání), aby na výsledném listu s řešením bylo zadání + výsledek

Kód: Vybrat vše

  'výpis výsledku v určené oblasti
    Range("D6").Resize(3, 3).Value = vysledek
// a vysledek zde naformatovat podle skutecne velikosti vysledne matice, já tu zde mám "natvrdo" dané rozměry 3x3

Je to možná všechno trochu zmatené, ale jsem začátečník, tak bych prosil o trochu shovívavosti :)

Reklama
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 » 03 led 2011 15:57

Pripoj vysledek sveho snazeni (sesit) v priloze.

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 » 03 led 2011 16:29

výsledek mého snažení v příloze :)
Přílohy
soucet_matic.xlsm
(23.22 KiB) Staženo 32 x

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 » 03 led 2011 19:29

Doplneny a upraveny soubor je v priloze.
Přílohy
soucet_matic.xlsm
(35.87 KiB) Staženo 34 x

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 » 03 led 2011 20:07

Asi nemám zapnutou nějakou knihovnu, jelikož při spuštění mi to hodí chybu zde u funkce Left. Poté mi naskočí nabídka knihoven, ale nevím kterou mám zapnout.

Obrázek

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 » 03 led 2011 23:22

To je zajimave. Funkce Left je standardni funkci VBA, takze neni duvodu k instalovani nejake knihovny. Na druhe strane je avizovana chybejici knihovna: Missing: Ref Edit Control, ktera u mne neni aktivovana, ostatni knihovny se shoduji.
Pri zavolani Debuggeru je hlasena chyba? Po spusteni predchoziho neupraveneho souboru take vznika popisovany jev?

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 » 04 led 2011 00:34

Ano, při zavolání debuggeru byla hlášena chyba: Can't find project or library. V původní neupravené verzi chybu nehlásil. Vše nakonec vyřešilo deaktivování té Missing: Ref Edit Control, ale nevím proč se tento problém vyskytl.

Ke kódu, bych se chtěl zeptat jen na jednu věc a to právě k vytváření nového listu.

Kód: Vybrat vše

' vytvoří nový list s řešením
Sub NovyList(ByRef NewWsht As Worksheet)
  Dim Wsht As Worksheet
  Dim i As Integer
  i = 0
  For Each Wsht In ActiveWorkbook.Worksheets
    If Left(Wsht.Name, 6) = "Řešení" Then i = i + 1
  Next Wsht
  Set Wsht = Nothing
   i = i + 1
  Set NewWsht = Sheets.Add(after:=Worksheets(Worksheets.Count), Count:=1)
  NewWsht.Name = "Řešení " & Str(i)
End Sub


nějak moc nerozumím tomu, co následuje po foru, myslím ten "Set Wsht = Nothing" a znovu " i = i + 1", mohl byste zkusit mi to nějak vysvětlit?
Ještě teda jedna maličkost, dá se někde nastavit, aby se ty listy s řešením se po uzavření sešitu smazaly?
Také se zeptám zda máte nějaké zkušenosti s RibbonX? Plánuji totiž přidat na pás karet (office 2007) vlastní nabídku, ze které bude možno makro spouštět. To vše až ráno, tak by mě zajímalo, jestli se sem na Vás můžu také obrátit s případnými problémy. Každopádně už teď děkuji za pomoc.

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 » 04 led 2011 08:53

K prvni casti: v priloze je doplneny soubor, poznamky v procedure NovyList.
Ke druhe casti: v Module1 doplnena procedura Sub OdstranitListy() volana z modulu ThisWorkbook - Private Sub Workbook_BeforeClose.

Ribbon. Nesympaticke reseni, pokud lze, obchazim naplnenim panelu nastroju Rychly pristup prikazy ekvivalentnimi se starsimi verzemi a na sirokem monitoru jich lze zobrazit dostatek nejcasteji pouzivanych.
Doplnovat Ribbon tlacitkem ke spousteni konkretni procedury neni nejlepsi napad ve vztahu k prenositelnosti souboru na jine PC. Vhodne je resit individualne v souboru (sesitu).
Co se tyce vlastni upravy Ribbonu, tak na netu najdes radu odkazu, muzes zacit zde: http://msdn.microsoft.com/cs-cz/library/bb386097.aspx nebo http://forum.zive.cz/viewtopic.php?f=958&t=1017716
Přílohy
soucet_matic.xlsm
(32.66 KiB) Staženo 27 x

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 » 04 led 2011 21:51

Tak ribbon jsem úspěšně zvládl, ale narazil jsem ještě na jednu drobnost, která s ním nesouvisí. Vyhodí se chyba pokud jedna ze zadaných matic bude pouze jedno číslo (1x1). Pokud zadám matice např. 1x2 a 3x3 už je vše v pořádku a uživateli se zobrazí MsgBox. Dal by se nějak jednoduše tento problém vyřešit?

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 » 04 led 2011 22:54

Pozadavek na soucet matic 1x1 jsi daval a zaroven jsi dostal odpoved 14.10.10. No abys nerek, tak jsem to doplnil vcetne drobnych uprav (a odstran si nepotrebne neupravene zaremovane procedury), viz priloha:
Přílohy
soucet_matic.xlsm
(30.47 KiB) Staženo 24 x

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 » 05 led 2011 03:06

díky, já jsem to zkoušel než jsem se zeptal znova. Šel jsem na to podobně jako ty, ale ne a ne to dotáhnout do konce :)
Snad úplně poslední dotaz, dá se nějak zamezit tomu, aby uživatel psal něco ručně to těch RefEditů v dialogovém okně? Ono když se tam něco napíše, tak to vyhodí chybu. Koukal jsem na vlastnosti toho prvku, ale na nic kromě Locked a Enabled jsem nenarazil.

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 » 05 led 2011 08:58

Je nutno osetrit chybu prikazem On Error ...
V prilozenem souboru mimo doplneni jeste nejake drobne upravy (da se toho upravit jeste vice).
Přílohy
soucet_matic.xlsm
(30.66 KiB) Staženo 40 x


  • 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 8 hostů