No to bude záležať na tom, čo sa má s ktorými súbormi robiť. Nieje vôbec jasné požitie. Či sa distribuuje aj zdroj aj súbory súčasne a spolu, či sa mení cesta k zdroju či cesta k súborom, či môžu obsahovať makro aj samotné súbory, ... nič, žiadne upresnenie... .
Tak to je ale potom zvláštne. Keď tam majú dáta pribúdať, načo potom makrom vkladať vždy na to isté miesto vzorce a formátovať hlavičku ? Veď to urobte raz manuálne, a nepotrebujete na to opakovane makro, zbytočne, lebo to už je vykonané.
A keď si z obyčajnej tabuľky urobíte objekt Tabuľka (Ctrl+T), tak sa budú vzorce kopírovať do ďalších pridaných riadkov automaticky samé.
Otázkou je, akým spôsobom budú pribúdať údaje.
Ak ručne, tak je potreba potom ručne (alebo makrom) reinicializovať opätovné zoradenie.
Ak pribúdajú makrom, treba túto reinicializáciu vyvolať rovno pri importe.
No a na druhej strane, ak tie úpravy potrebujete robiť opakovane na nejaký export súbor od neviem odkiaľ, tak do export/reportu nemôžete pridávať dáta. Potom to už nezodpovedá tomu reportu. A zároveň je to v rozpore toho vyššie spomínaného opakovaného formátovania.
Alebo ???
Tu máte príklad takej Tabuľky. Stačí iba skopírovať z nejakého nového reportu/exportu/výkazu nové dáta na prvý voľný riadok pod Tabuľku. Vzorce v I:J sa doplnia samé. Potom už iba na karte Údaje kliknite v skupine Zoradiť a filtrovať na Znovu použiť. Neviem, či Vám celá operácia zaberie 10 sek. V dátach ale vidím typický neduh týchto exportov - zlý formát dát. Stĺpec A musí byť formát Text (ID materiálov sú aj číselné aj textočíselné, aby to nespôsobovalo problém napr pri vyhľadávaní 0123 vs 123), C:D sú čísla ako text a majú to byť čísla.
-buď ich pri exporte (ak to ide navoliť) exportujte správne
-alebo ich pri importe (ak vôbec importujete, možno máte už hotový súbor xlsx a nie napr. csv a pod.) zformátujte
-alebo použite:
---do bunky niekde bokom dočasne napíšte 1, túto bunku dajte Ctrl+C
---označte celé stĺpce Tabuľky "tblData[[Závod]:[Sklad]]" na hlalvičke týchto stĺpcov
---pravý klik na označené - Prilepiť špeciálne - Hodnoty - Násobenie - OK
---Zmažte tú 1-tku, a sú z toho skutočné čísla.
-alebo označte najskôr v Tabuľke stĺpec Závod (opäť na hlavičke, taká malá šípka), na karte Údaje - Text na stĺpce - Ďalej - Ďalej - Dokončiť. Potom to isté urobte so stĺpcom Sklad.
Všetko sú to jednoduché operácie, a žiadne makro zatiaľ nieje potreba. Usudzujem totiž, že nieje možné použiť súbor s makrom, ak makrom z iného súboru upravujete tento xlsx. Inak by mal predsa tento súbor makro v sebe, a nemuselo by sa to riešiť cez 2 súbory.
Key1:=Range("I1")
musíte zmeniť na
Key1:=Workbooks("sklad_2100.xlsx").Worksheets("Sheet1").Range("I1")
alebo zmente kód na napr. takýto:
Private Sub CommandButton1_Click()
With Workbooks("sklad_2100.xlsx").Worksheets("Sheet1")
.Range("A1:J1300").Sort Key1:=.Range("I1"), Order1:=xlDescending, Header:=xlYes
End With
End Sub
Private Sub Formatovani_Click()
With Workbooks("sklad_2100.xlsx").Worksheets("Sheet1").Range("I1")
.Interior.Color = RGB(0, 255, 0)
.ColumnWidth = 20
.Value = "Rozdíl Fyz. - SAP"
.VerticalAlignment = xlTop
End With
With Workbooks("sklad_2100.xlsx").Worksheets("Sheet1").Range("J1")
.Interior.Color = RGB(255, 255, 0)
.ColumnWidth = 20
.Value = "Absol. hod."
.VerticalAlignment = xlTop
End With
With Workbooks("sklad_2100.xlsx").Worksheets("Sheet1")
.Range("I2:I1300").Formula = "=H2-F2"
.Range("J2:J1300").Formula = "=ABS(I2)"
End With
End Sub
Prípadne obe procedúry dokopy a na menej krokov:
Private Sub Formatovani_Click()
With Workbooks("sklad_2100.xlsx").Worksheets("Sheet1")
With .Range("I1:J1")
.ColumnWidth = 20
.Value = Array("Rozdíl Fyz. - SAP", "Absol. hod.")
.VerticalAlignment = xlTop
End With
.Range("I1").Interior.Color = RGB(0, 255, 0)
.Range("J1").Interior.Color = RGB(255, 255, 0)
.Range("I2:J1300").Formula = Array("=H2-F2", "=ABS(I2)")
.Range("A1:J1300").Sort Key1:=.Range("I1"), Order1:=xlDescending, Header:=xlYes
End With
End Sub
Aj tak sa mi nezdá, to vkladanie vzorcov na 1300 riadkov. Určite ? Netreba to náhodou len na taký počet riadkov, koľko je dát ? Lebo teraz to dá tie záporné hodnoty až za 0 (nuly), čo je od riadku 1300 vyššie.
Takto by mi to viacej dávalo zmysel:
Private Sub Formatovani_Click()
Dim Riadkov As Long
With Workbooks("sklad_2100.xlsx").Worksheets("Sheet1")
With .Range("I1:J1")
.ColumnWidth = 20
.Value = Array("Rozdíl Fyz. - SAP", "Absol. hod.")
.VerticalAlignment = xlTop
End With
.Range("I1").Interior.Color = RGB(0, 255, 0)
.Range("J1").Interior.Color = RGB(255, 255, 0)
Riadkov = .Cells(Rows.Count, 1).End(xlUp).Row
If Riadkov > 1 Then
.Range("I2:J" & Riadkov).Formula = Array("=H2-F2", "=ABS(I2)")
.Range("A1:J" & Riadkov).Sort Key1:=.Range("I1"), Order1:=xlDescending, Header:=xlYes
End If
End With
End Sub
Hmm, tiež neviem, čo presne potrebujete, tak možno len inšpirácia...
Funguje to. ALE ! V tých zošitoch sú linky na zdrojový zošit. Teda aj s cestou. Vy keď si urobíte kópiu toho celého adresára so zdrojom, aj so súbormi, tak to fungovať nebude, lebo tie súbory stále obsahujú cestu k pôvodnému umiestneniu. Tiež som si to neuvedomil, že tie Vaše súbory z prílohy tiež obsahujú Vašu pôvodnú cestu. Riešením na vyskúšanie, bez rizika poškodenia origo súborov je, že si urobíte zálohu celého origo adresára, z ktorej nebudete nič otvárať ani meniť. Makro vložíte do pôvodného origo adresára, kde sú aj správne cesty k linkom a spustíte. Pôvodnú origo verziu všetkých súborov dostanete, ak tú zálohu nakopčíte na pôvodné miesto. Bez rizika.
Vyskúšajte toto, rozbalte to priamo do C:\ nech sa nám zhodujú foldre. Zmente hodnoty v hlavnom, použite makro. Zatvorte hlavný a zmente mu názov napr. na "zdroj2.xlsm". Premiestnite ABC niekde inde napr. na kľúč, a otvorte. Hodnota bude zmenená. Ale link bude na pôvodný súbor v C:\, len ho nenájde a nechá poslednú známu hodnotu (ak nieje nastavený Excel inak).
A nebola by k tomu lepšia jedna spoločná procedúra, ako kopčiť X obdobných ?
Sub Filtruj(Stlp As Integer)
Dim Radku As Long
Radku = Cells(Rows.Count, 1).End(xlUp).Row - 4
Radku = Radku + (Radku = 0 And 1)
Application.ScreenUpdating = False
If Columns(Stlp + 1).Hidden Then
Cells(5, Stlp + 1).AutoFilter
Columns(4).Resize(, 41).Hidden = False
Cells(4, 2).ClearContents
Else
Columns(4).Resize(, 41).Hidden = True
Columns(Stlp).Hidden = False
Cells(4, 2).Value = Cells(5, Stlp + 1).Value
Cells(5, Stlp + 1).Resize(Radku).AutoFilter Field:=1, Criteria1:=1
End If
Application.ScreenUpdating = True
End Sub
Private Sub BMSMainstream_Click()
Filtruj 4
End Sub
Private Sub BMSTransfer_Click()
Filtruj 6
End Sub
Private Sub BMLMainstream_Click()
Filtruj 8
End Sub
Private Sub BMLTransfer_Click()
Filtruj 10
End Sub
Private Sub MCW_Click()
Filtruj 12
End Sub
Private Sub SCW_Click()
Filtruj 14
End Sub
Private Sub FrontGril_Click()
Filtruj 16
End Sub
Private Sub BottomFrame_Click()
Filtruj 18
End Sub
Private Sub RadiantPanel_Click()
Filtruj 20
End Sub
Private Sub CoverAirOutlet_Click()
Filtruj 22
End Sub
Private Sub TV_Click()
Filtruj 24
End Sub
Private Sub GSI_Click()
Filtruj 26
End Sub
Private Sub Emura2_Click()
Filtruj 28
End Sub
Private Sub Stylish_Click()
Filtruj 30
End Sub
Private Sub SC1_Click()
Filtruj 32
End Sub
Private Sub SC2_Click()
Filtruj 34
End Sub
Private Sub SC3_Click()
Filtruj 36
End Sub
Private Sub SC4_Click()
Filtruj 38
End Sub
Private Sub SC5_Click()
Filtruj 40
End Sub
Private Sub SC6_Click()
Filtruj 42
End Sub
Keď bude chuť a súvislých pár hodín času (čo min do konca budúceho týždňa nehrozí), tak by som mohol urobiť taký rozbor, kde bude ukázaný postup a čo ktorá časť vzorcov robí a čo dáva za medzivýsledky. Ale nesľubujem. Prípadne si toto vlákno niekam uložte, a občas ho omrknite ak sem nechodíte často...
shq32 napsal/a:
V příloze testovací soubor s použitým makrem.
elninoslov napsal/a:
XLSM sa nedá priložiť priamo. Treba ho zabaliť do ZIP.
shq32 napsal/a:
nepotrebuji xlsm...
XLSM sa nedá priložiť priamo. Treba ho zabaliť do ZIP.
Aha, tak Vy potrebujete napr. preniesť súbory inam, ale aby mali aktualizované dáta zo zdroja? Lebo inak budú mať pôvodné hodnoty. No tak to asi jedine makro. Vyskúšajte niečo takéto.
Vytvorí novú inštanciu Excelu na pozadí, v nej postupne otvorí všetky súbory xls, xlsx, xlsm v adresári s týmto súborom, uloží ich, a zavrie. Teda budú mať aktualizované hodnoty.
Skúšajte to VÝHRADNE na kópii súborov v nejakom skúšobnom adresári ! Až kým nebude isté, že je to to, čo potrebujete.
Tak som sa pokúsil to vyriešiť pomocou maticového vzorca, bez pomocného hárku alebo stĺpca. Čisto vzorec, teoreticky umiestniteľný celý do bunky, ale to by som už následne neupravil ani ja ako autor :) Už takto keď som to rozložil na Definované Názvy, je to HardCore. Na toto by sa mala použiť asi Kontingenčná Tabuľka.
Každopádne si porovnajte výsledky, pretože mi s Vašimi jedny nesedia (tuším početnosť príčin v mesiaci). Neskúmal som ostatné vzorce, len tie 3 tbl v roku a 3 tbl v mesiaci, ktoré ste chcel zoraďovať. Teda či sa Vám odkazuje ešte niečo na tie pomocné listy netuším.
A ako berie tých niekoľko cieľových zošitov hodnoty zo zdrojového zošitu ? Vzorec ? Aktualizuje sa sám. Dotaz ? Stačí dať Údaje - Obnoviť všetko. Hodnoty sú natvrdo skopírované ? Jedine makrom, a to bude každý súbor na pozadí otvárať a znovu natvrdo vkladať dáta (podľa nejakých Vami nešpecifikovaných podmienok) a súbory ukladať.
Priložte prílohu s príkladom zdrojového, cieľového súboru, a prípadných podmienok manuálnej aktualizácie.
=MIN(3;FLOOR(D7/5000;1))
=MIN(3;ZAOKR.DOLŮ(D7/5000;1))
Ešte som Vám urobil malú zmenu:
-Odstránil som zabudnutú premennú na kontrolu počtu výsledkových stĺpcov, lebo ak to je takto, tak sú vždy len 2.
-Počet riadkov a stĺpcov ku kontrole sa určuje podľa A:A a 1:1.
-Urobil som nejakú kontrolu na neexistenciu dát.
-A hlavne som Vám detailne popísal každý riadok kódu, aby ste možno aj porozumel tomu, ako to funguje. To je dôležité, aby ste vedel povedať prípadne, že sme vyradili dáta, ktoré mali byť validné.
-V zdrojových dátach ste mal v bunkách B2344, B3326, B4171 to číslo ako text. Dáta by mali byť konzistentné.
-V kóde je zakomponovaná možnosť ukončenia/pokračovania kontroly v riadku pri nájdení prázdnej bunky. Popis v kóde - hľadajte ####
Pekný deň :)
Teda sa majú vypísať iba tie riadky dát, v ktorých je od stĺpca B aspoň 1 nejaké číslo ? A ak tam je, tak vo výsledku bude v A najskôr číslo z A zdroja (nejaké ID), a vedľa postupne pod sebou čísla z B:CV, a to tak, že sa V A opakuje stále to isté ID, ktoré im náleží z riadku zdroja ?
Z toho mi vyplýva, že riadky, ktoré majú iba ID v stĺpci A, a nemajú žiadne ďalšie čísla v B:CV, sa do výsledku zahrnúť nemajú. Je to tak ?
Platí teda, že sa prehľadávanie riadku zdroja končí v momente nájdenia 1. nečísla v B:CV ? Alebo sa musí vždy prehľadať celý riadok B:CV ? Proste či sú v riadku medzery.
Ak je to inak, dajte konkrétny príklad, ako sa majú vyhodnotiť načrtnuté situácie.
Tu je nástrel.
Sub VypisCisla()
Dim D(), Sloupcu As Integer, Radku As Long, y As Long, x As Integer, Col As New Collection, Polozka, Cisla() As Double, PocetCisel As Long, RadkuCelkem As Long, SloupcuCelkem As Integer
Sloupcu = 100
Radku = 10000
ReDim D(1 To Radku, 1 To Sloupcu)
D = Worksheets("VSTUP").Cells(2, 1).Resize(Radku, Sloupcu).Value
On Error Resume Next
For y = 1 To Radku
PocetCisel = -1
For x = 2 To Sloupcu
If LenB(D(y, x)) > 0 Then
If IsNumeric(D(y, x)) Then
PocetCisel = PocetCisel + 1
ReDim Preserve Cisla(PocetCisel)
Cisla(PocetCisel) = D(y, x)
End If
End If
Next x
If PocetCisel > -1 Then
Col.Add Array(D(y, 1), Cisla)
RadkuCelkem = RadkuCelkem + PocetCisel + 1
If PocetCisel > SloupcuCelkem Then SloupcuCelkem = PocetCisel
End If
Next y
On Error GoTo 0
With Worksheets("CIL")
.UsedRange.ClearContents
If RadkuCelkem > 0 Then
ReDim D(1 To RadkuCelkem, 1 To SloupcuCelkem + 1)
y = 0
For Each Polozka In Col
For x = 0 To UBound(Polozka(1))
y = y + 1
D(y, 1) = Polozka(0)
D(y, 2) = Polozka(1)(x)
Next x
Next Polozka
.Cells(1, 1).Resize(RadkuCelkem, SloupcuCelkem + 1).Value = D
End If
End With
End Sub
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.