@marjankaj
??? Teraz ide o čo ? O tú moju vetu, že je blbé, lebo treba myslieť na 2 veci ? Áno je to blbé, a uviedol som alternatívu na získanie relatívnej adresy, ktorá mi na pochopenie pripadá ľahšia (Address). To neznamená, že sa má prepracovávať výkonné jadro Excelu. Samozrejme, že si Excel interne neprekladá písmenká stĺpcov na čísla, ale pracuje rovno s číslami R1C1. To by boli vysoké "režijné náklady".
Ak má byť na to UDF, nieje problém, ale ak tých vzorcov bude veľa, tak to UDF neúmerne zaťaží, a preto to chce zadávateľ urobiť tak, že sa validné vzorce pripravia, a vložia naraz v jednej procedúre. To sú síce cca rovnaké režijné náklady ako UDF, ale následne sú už vzorce natívne počítané, a to je výhoda oproti UDF (pri veľkom množstve).
Nemienim sa tu baviť o MS. Na to sú iné Flame diskusie. Ja som to spomenul iba všeobecne, ako reakciu na Vás. To je celé. Ale ak chcete príklad, nech sa páči. Nechcete mi snáď povedať, že nemožnosť vytvoriť zoznam listov pomocou vzorca (napr. pomocou indexu), je ojedinelý problém... Ale Excel je výborný program, o tom žiadna diskusia. To nemôže nikto napadnúť. Väčšina problémov tak či onak, je spôsobená iba nedostatočnými vedomosťami.
Ak niečo nejako je alebo nieje, nikto s tým nič neurobíme, iba to môžeme akceptovať.
Teraz si počkáme na zac1234, či sa to bude dať teda takto riešiť.
Sub ZapisVzorec()
Dim sB As Integer, rB As Long, sV As Integer, rV As Long
sB = 5 'stĺpec bunky kam chceme zapísať nový vzorec - E5
rB = 5 'riadok bunky kam chceme zapísať nový vzorec - E5
sV = 2 'stĺpec bunky, ktorá je počítaná v novom vzorci - B2
rV = 2 'riadok bunky, ktorá je počítaná v novom vzorci - B2
Cells(rB, sB).FormulaR1C1 = "=R" & rV & "C[" & sV - sB & "]+R[" & rV - rB & "]C" & sV & "*R" & rV & "C" & sV
End Sub
V skratke, ak chcete $ (absolútne) nedávate [ ], ak chcete bez dolára (relatívne) musíte zadať [ ], a v nich je treba číslo ktoré počíta posun hodnoty riadku/stĺpca čo má vo vzorci byť, od hodnoty riadku/stĺpca tej bunky, do ktorej sa vzorec vkladá.
OT: Áno, Microsoft na zákazníkov nedbá, a ich želania (ak vôbec) prehodnocuje až po rokoch.
Skúsil som maticu, vyskúšajte. (Dátumy som pomenil)
??? Absolútne nemám potuchy, čo chcete. Akože vybrať názov oblasti zo zoznamu ? Akej oblasti, tej ktorá sa bude kopírovať ? Čiže sa bude od teraz kopírovať iba jedna oblasť (tabuľka) ? Alebo chcete do databázy zapísať iba súčet zaplnených buniek v jednej jedinej oblasti určenej tým zoznamom oblastí, ktoré sa pred tým kopírovali cez tlačítko ? A ako bude makro vedieť z ktorého listu chcete túto oblasť adresovať, keď vravíte že listov bude viac ? Asi bude výber oblasti v každom liste.
Narýchlo som pozrel na to makro, a poviem Vám to na rovinu, vôbec sa mi nechce to makro celé naštudovať, vymyslieť riešenie toho čo požadujete, a hlavne zisťovať to čo vlastne chcete. A napíšte pre lepšie pochopenie aj presne čo chcete mať v tom zozname, nie xxx,yyy, to nič nikomu nenapovie.
Takže lepšie, presnejšie napíšte čo chcete. Krištáľová guľa sa mi rozbila, a tak som pri týchto slovných logicko-vešteckých úlohách fakt natvrdlý.
Definované názvy, by sa dali jednoducho priradiť iba k určitým listom, čiže by mal každý list svoje, alebo by ich možno šlo nahradiť poľom.
Do pondelku nemám absolútne čas, od utorka ešte neviem. Ja osobne Vám to teda určite nesľúbim.
To Address máte dobre vysvetlené na MSDN:
https://msdn.microsoft.com/en-us/library/office/ff837625.aspx
To R1C1 (konkrétne relatívny odkaz pomocou []) mi príde úplne blbý, pretože treba myslieť nielen na premenné vo vzorcoch, ale navyše aj na konkrétne súradnice bunky, pretože do [] sa zapisuje rozdiel (posun chcenej bunky oproti aktuálne nastavovanej).
Tak to skúste okľukou :
Cells(hoa, hoa).Formula = "=" & Cells(hoa, hob).Address(0, 0)
Áno, napadlo ma to po odoslaní, že by to malo byť nakoniec asi takto. Všetko funguje, eLCHa je hlava, darmo ...
Ja do toho nechcem rýpať, to v žiadnom prípade, ale ak tam mal zostať aj posledný deň z predošlého mesiaca, tak u mňa teda neostane. Chybu to nehodí, ale ani posledný deň tam nieje. Je tam iba 01, teda prvý deň, čo vlastne bolo tak isto aj pred úpravami.
Mier...
Chyba je inde.
Tu je treba iba presunúť ")"
Set sh = ThisWorkbook.Sheets(Format(dDen - 1), "dd")
Set sh = ThisWorkbook.Sheets(Format(dDen - 1, "dd"))
Ale po vyplnení 31 v Júli a stlačení Ďalší deň, sa správne vytvorí nový mesiac s posledným dňom predošlého (31), ale ak dám opäť Ďalší deň, tak to stroskotá na
Set sh = Worksheets(Format(dDen - 1, "dd") & " (2)")
pri odkaze na neexistujúci list, lebo dDen má už hodnotu 2.8. List "01" tam ale nieje.
Pri prechode na nový mesiac, bude treba ako som písal, zachovať 3 listy, nie 2. (31, 01, SAKO)
To akože chcete mať po vytvorení napr. nového mesiaca Júl (Červenec), ako prvý list posledný deň z Júna (Červen) čiže 31 ? Potom budete mať vlastne 3 listy - 31,01,SAKO. Takto ? Tak to bude problém, pretože keď prídete potom na koniec Júla (Červenec), tak sa vytvorí list 31, to ale nieje možné keď už list 31 existuje (ten Júnový - Červnový). Muselo by sa napr. testovať, pri vytváraní listov, či je deň číslo 2, a vtedy ten posledný Júnový 31 zmazať. Plus iné komplikácie, spojené s náväznosťou na list 01. Možno keď bude čas a chuť ... snáď si ale eLCHa nájde ešte na Vás čas, predsalen je to najlepšie upravovať autorovi makra.
Vyskúšajte toto, urobil som to aj na D, N, očr, akurát netuším, či som trafil správne stĺpce.
Toto dajte do I3 s Ctrl+Shift+Enter. Potom nakopírujte do potrebného počtu riadkov. Ale ako vidíte bolo by potrebné nastaviť dynamickú oblasť (posledný riadok). Budete s tým vedieť pohnúť ?
=IFERROR(INDEX($C$2:$C$23&" vs. "&$D$2:$D$23;MATCH(G3;IF($B$2:$B$23=H3;$A$2:$A$23);0));"")
Urobil som Vám možnosť si zvoliť, ktoré údaje sa pri splnení podmienky budú mazať. Máte tam aj použitie funkcie COUNTA s vrátenou chybou ak je 0, dá sa to použiť napr. pri dynamickom rozbaľovacom zozname (Vaše použitie COUNTA ako som písal nepoznám).
Pozrite si toto. Upravil som Vám tam filter aj pre "všeobecné chyby (desky laser)", a nastavil automatické formátovanie orámovania pri každom riadku, v ktorom je nejaká hodnota, pre všetky 3 listy. Teda orámovanie nebude presahovať tabuľku.
Môže to byť takto ako je to teraz urobené v "opravené chyby (desky laser)" ?
Ak áno, tak Vám tak urobím aj ostatné listy, keď je treba. Stačí potom iba klik na filter v prvom stĺpci a dať zoradiť zostupne či vzostupne. Lenže predtým, je treba rozdeliť všetky zlúčené bunky. Preto Vám to nešlo.
Oblíbený formulář Faktura byl vylepšen a rozšířen.
Více se dočtete zde.
Používáte podnikový systém Helios iNuvio? Potřebujete pomoci se správou nebo vyvinout SQL proceduru? Více informací naleznete na stránce Helios iNuvio.