Příspěvky uživatele


< návrat zpět

Strana:  1 ... « předchozí  283 284 285 286 287 288 289 290 291   další » ... 300

@marjankaj:
Nechcem sa dohadovať (strata času), tak krátko:
-Head1 sa má mazať rovnako ako ostatné. Myslel som na to hneď v prvom príspevku (otázka 2). Odpoveď je jasná - ÁNO mazať.
-Na môj prvý súbor ? Dal som iba jeden, a ten fungoval tak, ako boli do tej doby keď som ho postoval špecifikované požiadavky. Ak sa pridala požiadavka na nemazanie v prípade kompletného zaplnenia, pripísal som len potrebnú podmienku.
-Je šuma-fuk koľko riadkov, ale dotyčný písal do 150 riadkov = no problém (maximálne dočasne vypnúť ScreenUpdating). Každopádne, ak by spomenul, že to chce na 20000 Rows, tak určite nie takto, ale cez pole, a jedno načítanie a jeden zápis celého poľa naraz. Ale o tom nebola reč.
-Stačí keď Vám v kóde akokoľvek uhladenom a krátkom nefunguje jedna jediná vec, tým pádom kód proste nefunguje. A to som napísal. Často stačí iba jediná drobná podmienka od uživateľa, a kód sa znásobí do dĺžky aj komplikovanosti.
-Vo Vašom novšom kóde, rovnako nieje vyriešený problém odstránenia Head1 - takže opäť nefunguje, nech je akokoľvek krátky. Elegantná metóda xlDown a spol, sa niekedy nedá jednoducho použiť.
-Tento nový kód dokonca akonáhle raz zapíše hodnoty do Head5, ďalšie spustenie už nič neurobí. Ďalšie posledné hodnoty už proste neposunie.

Pripravil som novú verziu, ak by si uživateľ prial napr. zmazať riadky, kde už nič nieje, tak napr. takto.

Presne takto jednoducho - to nefunguje. Head1 tam stále necháva, nikdy ho nezmaže, aj keď to je podmienka. Preto som to trochu "zkomplikoval". Pretože ak to urobíme tak, aby sa zmazal Head1, tak ako sa má, tak nám ostane v Head5 posledný záznam. Ten by rovnako nebol nikdy zmazaný. Preto som tam musel dať kontrolu celej šírky oblasti na posledný riadok. Aby sa aj toto eliminovalo.
Tak isto tento Váš kód nefunguje, keď sú zaplnené Head1 až Head4. Pretože vtedy xlToRight vracia odkaz na Head5, kde je výsledok. Čiže vystrihne výsledok a vloží ho na to isté miesto, na výsledok. Neberie poslednú hodnotu, čiže Head4.
...

EDIT:
@Michal_85:
Iba vymeniť
Cells(i + 1, Posl) = blank
za
If Posl <> 4 Then Cells(i + 1, Posl) = blank

Nech sa páči.
Najskôr som myslel, že to má byť hneď pri zmene nejakej bunky, preto som vravel, že to nemá logiku, lebo by sa nikdy nič iné okrem práve zapísanej bunky, nepresunulo. Na tlačítko to už zmysel má.

No to je zasa popis. Takže otázky:
1. V Head1 sú vždy data ? Teda sa dá považovať riadok za zaplnený keď sú v tomto stĺpci data ?
2. Tento stĺpec Head1, ak je ako jediný zaplnený, tiež sa má "posunúť" do stĺpca Head5, tak ako stĺpce Head2, Head3, Head4?
3. Čo znamená to "posunúť" ? Ak to, že sa skopíruje posledná bunka z rozsahu Head2-Head4 (príp. Head1-Head4 viď vtššie) do bunky Head5, tak OK. Ak ale "posunúť" znamená presun, tak to znamená, že nikdy sa nedostaneš na ďalšiu bunku. Napr. zistíme zápis do Head3, a toto presunieme do Head5, čiže Head3 je opäť prázdna. Na Head4 sa teda ani nedostaneš (za predpokladu že pôjdeš doradu)
...

Presne tak, všetky premenné musia mať rovnaký typ, alebo musia byť na rovnaký typ retypovateľné. A to číslo -1 nieje. Inak by to boli klasické jablká a hrušky.

Ktorú verziu toho môjho návrhu používate ? V novších verziách to vyhodí zoznam nulových produktov IBA ak v nejakej bunke (čiže v Excely to väčšinou znamená v aktívnej bunke) nastane 0. Ak je tam X núl, ale práve sa nejaká hodnota na 0 nezmení, tak nič nevypíše.
Snažím sa dešifrovať, čo ste napísali. Takže vy teraz chcete, aby keď nastane 0, sa nevypísal zoznam nulových produktov, ale aby napísanie 0, spôsobilo odčítanie jednotky od neviem odkiaľ ? Neviem ako sa dá odpočítať 1 od počtu ks, keď práve ten počet ks, som práve zmenil na 0.
Skúste to prosím povedať nejako inak.

A prečo nám to sem nenapíšete. Od nás chcete odpovede, ale o svoje sa nepodelíte. No no no 1
Inak takto:
Application.CommandBars("Ply").Enabled = False

Do modulu dajte:
Sub RightClick()
Dim WS As Worksheet, i As Integer
Dim oMenu As CommandBar, oItem As CommandBarControl
Set oMenu = CommandBars.Add("", msoBarPopup, , True)
For Each WS In Worksheets
Set oItem = oMenu.Controls.Add
oItem.Caption = WS.Name
oItem.OnAction = "'Vyber """ + WS.Name + """ '"
Next WS
oMenu.ShowPopup
End Sub

Sub Vyber(WS As String)
Worksheets(WS).Activate 'Nejaká Vaša činnosť s vybraným listom
End Sub

Do ThisWorkbook dajte toto :
Private Sub Workbook_SheetBeforeRightClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean)
RightClick
Cancel = True
End Sub


Pri Pkliku na ktoromkoľvek liste Vám dá na výber zo zoznamu všetkých listov, a vykoná procedúru Vyber, v ktorej si už ošetrite ako potrebujete. Parameter WS v nej obsahuje názov zvoleného listu v kontextovom menu.

Len na okraj:

Ak je to ten zošit "Protokol_o_hlaseni_poruchy" z iného príspevku, tak urobte:

Zmente si v "Datový list" hodnoty dátumov z "1.". "2.", "3.", ... na 1,2,3 (proste bez bodiek).

V tomto liste zmente formát bunky s dátumom na Vlastný dd.mm.yyy (v CZ asi dd.mm.rrrr), a aj vzorec na výpočet dátumu na :
=DATE(Protokol!D8;Protokol!C8;Protokol!B8)

Zmente si v Databáza celý stĺpec Datum na formát Vlastný dd.mm.yyyy (CZ viď vyššie)

Na liste Protokol zmente formát Den a Mesiac na Vlastný General"."

Overenie údajov v Deň dajte na reálne možné dni :
=OFFSET('Datový list'!$G$2:$G$32;;;DATE(D8;C8+1;1)-DATE(D8;C8;1);1)
Tu by bolo ešte dobré v makre dorobiť úpravu, keď napr máte v roku február s 29 dňami, a zmeníte rok na rok kde je 28, tak Excel aj keď má správne vypoťítaný rozsah čísel predošlým vzorcom, tak v prípade prekročenia to najvyššie možné automaticky nevloží.

A ten Váš vzorec na výpočet počtu výskytov, neviem síce ako funguje (odkiaľ berie vstupné dáta na filter), tak by mohol vyzerať upravený pre vstup z buniek aj takto
=COUNTIFS(Databáze!$A:$A;$C$1&"*";Databáze!$C:$C;">"&DATE($D$8-1;12;31);Databáze!$C:$C;"<"&DATE($D$8+1;1;1))
kde si za $C$1 dosadte bunku s hľadaným textom, a za $D$8 si dosadte bunku s hľadaným rokom.

Len toľko na margo...

Neviem, ako ste to poriešili, ale ak by ešte niekto mal záujem, tak asi takto by to mohlo byť:
Sub ClearZeroRows()
Dim PR As Long, Pole(), i As Long, Zero As Range
PR = Cells(Rows.Count, 1).End(xlUp).Row
If PR < 2 Then Exit Sub
Pole = Range("A2:B2").Resize(PR - 1).Value
For i = LBound(Pole) To UBound(Pole)
If Pole(i, 1) = 0 And Pole(i, 2) = 0 Then
If Zero Is Nothing Then Set Zero = Rows(i + 1) Else Set Zero = Union(Zero, Rows(i + 1))
End If
Next i
If Not Zero Is Nothing Then Zero.EntireRow.Delete
End Sub


EDIT: A ak by bolo potrebné celé riadky nemazať, napr. kvôli iným dátam vedľa tabuľky, tak potom takto:
Sub ClearZeroRows2()
Dim PR As Long, Pole(), i As Long, NonZero(), NZ As Long
PR = Cells(Rows.Count, 1).End(xlUp).Row
If PR < 2 Then Exit Sub
Pole = Range("A2:C2").Resize(PR - 1).Value
ReDim NonZero(1 To UBound(Pole), 1 To 3)
For i = LBound(Pole) To UBound(Pole)
If Pole(i, 1) <> 0 Or Pole(i, 2) <> 0 Then
NZ = NZ + 1
NonZero(NZ, 1) = Pole(i, 1)
NonZero(NZ, 2) = Pole(i, 2)
NonZero(NZ, 3) = Pole(i, 3)
End If
Next i
Range("A2:C2").Resize(PR - 1).Value = NonZero
End Sub

Overflow je pretečenie. Prvá chyba je hneď tu :
Set rng = Range("A2:C105" & LastR)
má byť
Set rng = Range("A2:C" & LastR)
alebo
Set rng = Range("A2:C105")
v tomto prípade fnc LastR potom nieje treba

Zmeniť, vyskúšať, dať vedieť. Nech to nemusím nadarmo lúskať a hádať čo by tam mohlo byť ešte zmenené.

Modul s deklaráciou globálnej premennej tam máte, však?

Šmarjá, som nevedel, že je tu taká diskusia a v tichosti som pracoval na "novom" variante. Už ho sem dám, čo už s ním, ostatné návrhy budem (ak vôbec bude čas a chuť) študovať neskôr.
Importuje to rovno do listu s tabuľkou. Žiaľ tabuľka nereflektuje na pridanie riadkov za ňou cez import (do nej cez import nejde vkladať - konflikt), tak sa musí urobiť resize. Ak tam vložím iným spôsobom data (Paste, priradenie poľa), tak to funguje, ale nie import.
Cez pole ma to tiež napadlo, to som chcel skúsiť ako ďalší variant. Proste všetko iba v pamäti a potom Flush (tak ste to tuším čo narýchlo pozerám aj robili).
Je to nastavené na Vaše podmienky (A-AI text data, AJ-AR vzorce). Otestoval som to a +- 114200 riadkov to spraví za 20s. Dočasný list sa nevytvára.
Rozmýšľal som aj nad tým aby to ťahalo rovno XML, to by sme potrebovali náhľad na to XML.

PS: Ešte na konci by bolo treba zmazať riadky, ktoré boli použité. Celé Rows, nie ClearContent. Po ClearContent na 114000 riadkoch je súbor 2,2MB. Po odstránení Rows má 30KB. Snáď by to šlo aj nejako sofistikovanejšie.

Asi takto nejako som to mal na mysli. Musel som použiť vytvorenie a zmazanie pomocného dočasného listu pre import, lebo mi stále nechcelo nastaviť tabuľku do importovanej oblasti a opačne. Možno len treba inak zmazať Connection, ako som sa snažil ja. Takže zatiaľ takto. Je to zatiaľ koncipované len na CSV s jedným stĺpcom (cca 25000 Rows). Pre Vaše potreby to treba upraviť na požadované parametre.

Tu som pridal ešte popis makra.

Aj tak by som sa pre seba pokúsil o zjednodušenie. Na 1 klik.
-vymaže sa tabuľka okrem prvého riadka, a zmení sa jej veľkosť na 1 dátový riadok
-zistíme ktorý CSV (akéhokoľvek názvu) v adresári má najvyšší dátum, to bude asi náš favorit. Ak tam bude vždy len jeden, je to ešte jednoduchšie.
-od druhého riadka sa naimportuje CSV, to by malo zabezpečiť pridanie vzorcov. Do tabuľky importovať totiž nejde. Musí to byť jednorazový import, nie vytvorenie pripojenia, keďže sa názov CSV mení.
-prvý dátový riadok tabuľky zmažeme
-a máme tabuľku o správnom počte riadkov (bez prázdnych na konci), so vzorcami, takže updatneme KT.
-ak by sa všetky stĺpce CSV nevkladali jeden vedľa druhého, ale medzi nimi by bol nejaký stĺpec so vzorcami, tak by sa to muselo urobiť inak.

Uvažujem správne, že by takto bol potrebný len jediný klik, a CSV by sa ani neotváralo, nevkladali by sa hodnoty...?


Strana:  1 ... « předchozí  283 284 285 286 287 288 289 290 291   další » ... 300

Uživatelské menu

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

Menu

Formulář Faktura

Formulář Faktura IV

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

Helios iNuvio

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.

On-line nástroje