Příspěvky uživatele


< návrat zpět

Strana:  1 ... « předchozí  212 213 214 215 216 217 218 219 220   další » ... 286

Ak myslíte tým "vždy při změně některé proměnné" :

1. to, že Vy zmeníte bunku zadaním hodnoty tak skúste metódu "Worksheet_Change" každého dotknutého listu.

2. to, že sa mení výpočet vzorcom (bez Vašeho zásahu), na to skúste "Worksheet_Calculate" každého dotknutého listu. Plus kontrola starej uloženej hodnoty dotknutej premennej.

3. to, že sa zmení hodnota premennej kódu makra, napr. premenná ABC nadobudne hodnotu 1 alebo 5 ..., tak na to žiadna automaticky spúšťaná metóda nieje. Jedine si urobiť časovač, ktorý bude napr. každú 1s kontrolovať hodnotu danej premennej s jej starou (odloženou) hodnotou.

EDIT:

4. to, že vaše makro vracia jedinú vypočítanú hodnotu, tak použite UDF.

Všetko záleží na tom, čo máte na mysli, a čo to makro robí.

Veď to makro čo som Vám poslal robí práve to, že zistí ktoré bunky boli v C zmenené (kľudne milión), a po jednom Vám tieto (iba zmenené !) ponúka na zlatom podnose v cykle v premennej Bunka. V tom prostrednom bloku si robte čo chcete, pričom Bunka.Row je riadok práve spracovávanej bunky. To môžete použiť na vkladanie toho vzorca. Pozreli ste sa na to vôbec ? Veď je to presne to, čo požadujete.

Vo Vašom makre máte napr.
Cells(r, 2) = "=IF(RC[1]="""","""",R[-1]C+1)"

v mojom by to bolo
Cells(Bunka.Row, 2) = "=IF(RC[1]="""","""",R[-1]C+1)"
aj keď korektne by malo byť
Cells(Bunka.Row, 2).FormulaR1C1= "=IF(RC[1]="""","""",R[-1]C+1)"

Ale opakujem, že vkladanie Vašeho vzorca nebude fungovať, akonáhle bude niekde v stĺpci B prázdna bunka pred vzorcom. To tam vložte ten môj vzorec z prvého príspevku. Ten zvládne medzery.

Netuším, či Vás chápem správne, ale na to podľa mňa nepotrebujete makro, navyše to máte pravdepodobne vo Worksheet_Change, čím prichádzate o Undo.

EDIT:
Inak ak by ste chcel robiť psie kusy s každou zmenenou bunkou v C od riadku 2, tak napr:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim Zmena As Range, Bunka As Range, Hodnota
Set Zmena = Intersect(Columns(3).Resize(Rows.Count - 1).Offset(1, 0), Target)
If Not Zmena Is Nothing Then
Application.EnableEvents = False: Application.ScreenUpdating = False
For Each Bunka In Zmena
Hodnota = Bunka

'Tu si robte čo chcete s každou zmenenou bunkou v 3. stĺpci
If Not IsNumeric(Hodnota) Then
If CStr(Hodnota) <> "" Then
Cells(Bunka.Row, 2) = "=IF(RC[1]="""","""",R[-1]C+1)"
Else
Cells(Bunka.Row, 5) = ""
End If
End If

Next Bunka
Set Bunka = Nothing
Application.EnableEvents = True: Application.ScreenUpdating = True
End If
Set Zmena = Nothing
End Sub


Ale to čo tam v strede máte ako jadro kódu ... no neviem ... podľa mňa to nefunguje. Keďže vkladáte vzorec na číslo len v prípade, že bol v C vložený text, tak ak tam bude vložené číslo a po ňom text, tak sa nemá odkiaľ pripočítať 1. Dá Vám to chybu. Rovnako by ste mal pri zmene na číslo v C, zmazať vzorec na číslo, keď píšete, že tam má byť očíslovanie iba v prípade textu. To samozrejme znefunkční vzorec, tak ako ho máte.

Trochu to lepšie popíšte.

Ja tam ale žiadny stĺpec "Termín realizace" nikde nevidím. Tým myslíte stĺpec "TERMÍN" ? Potom napr takto, v tom prípade ale:
1. nesedia hodnoty"ANO/NE" čo ste tam mali, s dátumami, ktoré tam máte
2. problém nastane, ak TERMÍN ZADÁNÍ bude napr. v pondelok 31.12.2015 a TERMÍN bude 1.1.2016. Je to síce štvrtok a piatok po sebe idúce, ale iné čísla týždňov

Preto som Vám urobil aj druhý variant, ten sa s tým vysporiada (no popravde, zase až tak som to neotestoval :) )

Neviem, ako to presne myslíte. Ak potrebujete ešte k tomu aj presný Európsky kalendárny týždeň, na to som našiel zaujímavý "vzorček":
=IF(WEEKDAY(DATE(YEAR(J5);1;1);2)>4;(IF(WEEKNUM(J5;2)=1;WEEKNUM(DATE(YEAR(J5)-1;12;31);2)-IF(WEEKDAY(DATE(YEAR(J5)-1;1;1);2 )>4;1;0);WEEKNUM(J5;2)-1));WEEKNUM(J5;2))
=KDYŽ(DENTÝDNE(DATUM(ROK(J5);1;1);2)>4;(KDYŽ(WEEKNUM(J5;2)=1;WEEKNUM(DATUM(ROK(J5)-1;12;31);2)-KDYŽ(DENTÝDNE(DATUM(ROK(J5)-1;1;1);2 )>4;1;0);WEEKNUM(J5;2)-1));WEEKNUM(J5;2))

Tiež KT používam už častejšie na jedinečné záznamy. Napr. aj tu som to použil. Stačí to aj bez makra, na skrytom liste nechať niečo ako v danom príklade list Seznam a potom už stačí iba Definovaný názov napr. :
=Seznam!$A$1:INDEX(Seznam!$A:$A;COUNTA(Seznam!$A:$A))
=Seznam!$A$1:INDEX(Seznam!$A:$A;POČET2(Seznam!$A:$A))

Pre prípad aktualizácie - Údaje - Obnoviť všetko.

Možno si tam nájdete nejakú inšpiráciu. Netuším, čo to chcete vlastne robiť s tými súbormi ... preto je to len tak z brucha ...

Ak tie dáta importujete z nejakého súboru, tak tam mâte možnosť zvoliť oddeľovače.
Z Vašeho príspevku som tiež nepochopil, či bunka obsahuje aj bodku (tisíce) aj čiarku (desatiny), alebo 2 bodky...
Záleží na tom ako to presne máte, vyššie menovaný prípad by sa dal aj pomocným dočasným stĺpcom
=VALUE(SUBSTITUTE(D1;".";""))
=HODNOTA(DOSADIT(D1;".";""))

xlnc: Odkrývať ich v novom WB chceme/musíme, inak by to nešlo :)
Zaujímavý spôsob vytvorenia čiselného poľa pri Delete. Dobrá inšpirácia.

xlnc: To je super, o tom som netušil, aspoň polovička je ušetrená. Škoda že nejdú hromadne odkryť.

Ešte poznámku: Stretol som sa dávnejšie s problémom, ktorý nastal pri takomto kopírovaní, ak bola na liste Tabuľka (ListObject), a pomohlo len dočasné vypnutie .Calculation, preto som to v makre naznačil.

Sub Vytvor_Novy2()
Dim Cesta As String, LST, Pocet As Integer, i As Integer

LST = Array("List1", "List2", "List3") 'Pole listov
Cesta = ThisWorkbook.Path & "\"

With Application
.ScreenUpdating = False: .DisplayAlerts = False ': .Calculation=xlCalculationManual

With Workbooks.Add 'Nový súbor
Pocet = .Worksheets.Count 'Počet vytváraných listov
ThisWorkbook.Worksheets(LST).Copy After:=.Worksheets(Pocet) 'Skopíruj listy

For i = 0 To UBound(LST) 'Zviditeľni listy
.Worksheets(LST(i)).Visible = True
Next i
For i = 1 To Pocet 'Vymaž defaultné listy
.Worksheets(1).Delete
Next i

' iné práce na novom súbore

.SaveAs Cesta & "Nový súbor.xlsx" 'Ulož a zatvor
.Close
End With

.ScreenUpdating = True: .DisplayAlerts = True ': .Calculation = xlCalculationAutomatic
End With
End Sub

Ten vzorec funguje cca takto:
-časy sú na 3 desatinné miesta,t ak si ich vynásobíme *1000, a dostaneme celé číslo napr. 36,391*1000 = 36391.
-k tomu si na koniec prilepíme 6 miestne ID, napr ID = 000123, teda dostaneme text 36391000123.
-z toho si urobíme cez VALUE/HODNOTA čísla. Teda máme pripravené spojené čísla vyhovujúce podmienkam, kde pravá šestica je ID.
-zoraďovanie ale prebieha zľava, teda cez SMALL vyberieme požadované poradie od najmenšieho, a keď nám ho dá, urežeme si z neho poslednú šesticu, teda ID, a tento text si zkonvertujeme opäť cez VALUE/HODNOTA na číslo.
- a toto už normálne hľadáme cez VLOOKUP/SVYHLEDAT
-a ak správne premýšľam, nemalo by vadiť ani, ak by boli niektoré časy 5 číselné a iné 6 číselné (ak by bol niekto pomalý)

Snáď som to popísal pochopiteľne.

Ďalšia vec, ktorú neviem či ste si všimol je, že pri hľadaní verzie trate som nevedel, či môže byť v jeden deň viac verzií trate. Lebo teraz je to tak, že sa hľadá maximálne čísle verzie trate v poslednom dni (maximálny dátum) danej lokality. Ak môže nastať to, že v posledný deň danej lokality bude viac verzií, a posledná verzia bude menšia ako iné verzie toho dňa, tak vzorec vráti zlé číslo. To ešte upresnite, napadá ma možno jedno riešenie.

napr.

Ak sa použije toto:
Sheets(Array("List1", "List2", "List3")).Select
ActiveWindow.SelectedSheets.Visible = False

tak ich schováte naraz, ale naopak to urobiť neviem či pôjde.
Podľa toho či použijete kombináciu s ActiveWindow alebo ThisWorkbook dostanete chybu 1004 (Nie je možné nastaviť vlastnosť Visible triedy Sheets) alebo 438 (Object doesn´t support this property or method).

A naopak ak sa pokúsime použiť na schované listy
Worksheets(Array("List1", "List2", "List3")).Copy
Dostaneme 1004 (Metóda Copy triedy Sheets zlyhala).

Nechce sa mi to ďalej skúmať. Ak použijete ScreenUpdating = False máte to za okamžik aj po jednom.

Áno, to som robil len pokus. Musíte to použiť po jednom. Skryť by sa dali naraz, ak by ste použil na ne najskôr Select, ale ten je pomalý. Pri odkrývaní to použiť nejde. Takže viete, ktoré treba použiť. Som len na mobile, takže iba toľko.

Pri výpadku internetu ale nebude predsa fungovať žiadna možnosť. Nechce sa mi to teraz testovať, len hypotéza, ale tá bunka so vzorcom nehodí chybu #ODKAZ keď nenájde zdroj ?

Napr...


Strana:  1 ... « předchozí  212 213 214 215 216 217 218 219 220   další » ... 286

Uživatelské menu

Nejste přihlášen(a)
avatar\n

Menu

On-line nástroje

Formulář Faktura

Formulář Faktura IV

Oblíbený formulář Faktura byl vylepšen a rozšířen.
Více se dočtete zde.

Aktivní diskuse