Zmenťe riadok
.Cells(3, 1).Resize(1, UBound(F2)).Value = F2
na
.Cells(3, 1).Resize(1, UBound(F2)).Formula = F2
Pred týmto riadkom urobte BreakPoint, spustite makro, zastaví pred týmto riadkom, kliknite pklik na "F2" v kóde a dajte "Add Watch", dole v okne "Watches" rozplusknite to F2, upravte šírky stĺpcov tak aby boli vydieť celé hodnoty "Value", z tohto pošlite ScreenShot. Potom stlačte F8, vykoná sa krok. Uvidíme či to prejde.
Inak neodpovedali ste skoro na nič. Máte v tej zložke aj iné súbory ako tie z ktorých sa majú vyberať v tomto makre dáta ?
A ďalšia veľmi dôležitá vec, súbor ktorý ste poslal predtým, má v hľadanej oblasti riadky 4:18, a v tomto poslednom súbore máte 4:20. To je veľký problém. Súbory musia byť rovnako koncipované. Neviem, ako by sme jednoducho zisťovali, ktorý súbor má tu oblasť ako veľkú.
No inak ako takto to neviem.
-Každá položka v liste Výber, musí mať svoju samostatnú oblasť v Temp, na počítanie validných dát pre danú položku. To sú tie skupiny po 10 riadkov. To je aj obmedzenie, že na jeden výrobok môže byť 10 druhov, z čoho vyplýva že môže byť na výrobku iba jeden druh a môže mať 10 rozmerov. Nemôže byť 10 druhov po 10 rozmerov. Rozmerov môže byť max 10 pre všetky rozmery všetkých druhov jedného výrobku. Snáď sa chápeme.
-Ak chcete mať viac položiek výrobkov v Data ako 40, tak treba pretiahnuť vzorec v Temp!A na požadovaný počet položiek +rezerva.
-Ak chcete mať viac položiek ako 30 v Výber, tak pretiahnite vzorce vo Výber na požadovaný počet, ale aj takýto počet musí byť tých skupín po 10 v Temp.
- plus platí aj to čo som písal minule
Otestujte to a dajte vedieť.
Ale aj tak mám silné tušenie, že to nebudete chcieť takto, ale posunuté o X riadkov dole, nad tým nejaká hlavička, možno aj posunuté o Y riadkov do strany. Je to šité na mieru na takéto usporiadanie! A zmena, ak sa pozriete na brutálne vzorce (hlavne tie v Definovaných názvoch) nieje jednoduchá. Bude sa mi musieť veeeeľmi chcieť, aby som to ešte upravoval.
Možno Vám dám ešte jednu šancu na upravenie, ale musíte mi poslať presný dizajn ako to má vyzerať. Žiaden slovný popis, ale súbor s presne označenou plochou v ktorej bude to, čo je teraz v Výber.
Ak Vám to takto stačí, budem len rád
To by mohlo byť pretečenie premennej alebo žiadna hodnota v nej. Alebo nedostatok pamäti, Excel niekedy zle "čistí" alokovanú pamäť. Ďalej by to mohlo spôsobovať umiestnenie makra do listu a nie do modulu. Ďalej by to mohol byť iný názov listu v hlavnom súbore alebo v niektorom z prehľadávaných súborov. Ďalej by to mohla byť iná štruktúra v prehľadávaných zošitoch, ako tá s ktorou sa počíta (napr. posun o riadok/stĺpec, zlúčené bunky...). Ďalej to môže byť iný adresár, ako ste mi napísal. Ďalej tento hlavný súbor NESMIE byť v adresári s prehľadávanými súbormi (dá sa urobiť, aby tam mohol byť).
Inak mne makro funguje bez problémov v Excel 2013 Pro SK x64 na Windows 8.1.1 Pro SK x64, aj na Excel 2010 Pro SK x86 na Windows 7 Pro SK x86.
Ja to skúšam na 211 kópiách toho súboru čo ste mi dali (6131880_LBR15 Paris - Brickley - tail_BOM_V2.xlsx), a v presne takom adresári ako ste napísal. Zmenili ste si prípadne cestu k tým súborom ? A máte tam také súbory aké tam majú byť, alebo aj iné ? Skúšajte rovno tento súbor čo Vám posielam, nič zatiaľ nedávajte do žiadneho iného Vašeho súboru, záleží na každej maličkosti. Ak ste to makro premiestňovali, dali ste si pozor na to formátovanie v tomto hlavnom súbore, hovorím o správnom zlúčení buniek.
Proste nemôžem u mňa vypozorovať chybu. Ale aj tak som Vám pridal nulovanie polí do kódu, a presunul som ho do modulu.
Momentalne nie som doma, tak len z tabletu. Je potrebne makro spustiť z VBA cez F8, a krokovať cez F8. Tak zistíte riadok na ktorom Vám to dá chybu.
U mňa pracuje OK (Office 2013), skúste potom teda verziu vedľa, kde je určený riadok 1.
A ešte drobnosť, dávate si tam CZ ekvivalent funkcie MATCH - POZVYHLEDAT ?
Môžete skúsiť toto:
=INDEX($A$1:$Y$1;MATCH(AB2;A2:Y2;0))
a nakopírovať bunku so vzorcom aj do ostatných buniek v AC
Myslíte niečo takéto ?
Pri počte 100 riadkov je to asi zanedbateľné, ale ak by sa jednalo o veľké množstvo, bolo by asi kratšie nepristupovať na list pri každom 0 riadku, ale hromadne. Zmenený test bunky na 0 nie aj na "" či Empty. Je lepšie odkazovať na nejaký list, zatiaľ je tam ActiveSheet. Proste iba trochu iná alternatíva.
Sub Skryj_Zobraz()
Dim iRow As Integer, r As Range
Application.ScreenUpdating = False
With ActiveSheet
If .Columns(6).EntireColumn.Hidden Then
.Rows("1:100").EntireRow.Hidden = False
Else
For iRow = 1 To 100
If .Cells(iRow, 3).Value = 0 And .Cells(iRow, 3).Value <> "" Then If r Is Nothing Then Set r = .Rows(iRow) Else Set r = Union(r, .Rows(iRow))
Next iRow
If Not r Is Nothing Then r.EntireRow.Hidden = True
End If
.Columns(6).EntireColumn.Hidden = Not .Columns(6).EntireColumn.Hidden
End With
Application.ScreenUpdating = True
End Sub
-Pomocný list "Temp", kde prebieha výcuc dát z Vašej tabuľky, a nachystanie pre rozbaľovacie zoznamy. Tento list potom skryte.
-Vo Vašej tabuľke nemajte medzi dátami v stĺpcoch C a D prázdne riadky.
-Celé to počíta dynamický počet položiek. Nastavte si iba pretiahnutím vzorec v stĺpci A v liste Temp, na požadovaný počet položiek + rezerva (zatiaľ je nastavené 40).
-Pod tabuľku v liste "Data" nevpisujte iné data, na to používajte list "Výber".
-Nevýhoda rozbaľovacích zoznamov je, že sa nevynulujú, ak v nich ostala hodnota z minulosti, ale vzhľadom na zmenu v inom závislom zozname by tam tá hodnota byť nemala. Malá náplasť je že Vám v tomto prípade hodí výsledok "Hodnota" chybu.
Ešte by som mal jedno dôrazné odporúčanie:
Vo Vašom kóde chýba odkazovanie na nejaký list. Odkazujete hneď na Cells, čiže na buňky práve aktívneho listu. Môže sa Vám stať a škaredo vypomstiť, ak sa omylom prepnete na iný list, Excel si zapamätá tento list, a nabudúce súbor otvorí na ňom. A je vymalováno. Riešenie je buď používať v zošitoch len jediný list, alebo .ActiveSheet nahradiť za .Worksheets("meno_listu"), a v každom súbore sa musí upravovaný list volať rovnako, vtedy môžete použiť aj viac listov, aj môže byť ktorýkoľvek aktívny.
Spájanie hodnôt buniek do textového reťazca nieje natívnymi funkciami Excelu možné. Používa sa na to pomocný stĺpec či list
nájdete napr tu :
, alebo ak je to len pár vlastností, tak môžete použiť CONCATENATE+IF.
Potom nieje problém použiť makro.
Ale stále nerozumiem ako to myslíte. Kde uvažujete tie zaškrtávacie políčka ? V každom riadku každej položky a samostatne fungujúce pre každú položku ? No to pri 2000 položkách a 10 vlastnostiach bude záhul. Alebo takto, pre všetky položky naraz?
Ďalej v liste s výsledkom, alebo v liste s datami ?
Bez príloh sa robí vééééľmi ťažko.
Bude potrebné ale vedieť umiestnenia dát, pretože matica musí počítať s číslami riadkov a stĺpcov, a hlavne keď to chcete ob-riadok, tak sa musí nastaviť, ktorý údaj je na párnom riadku.
Ďalej treba nastaviť samozrejme rozsahy tbauľky, a vzorec skopírovať na počet riadkov rovnajúci sa 2-násobku počtu stĺpcom kde je "ano" a "-". Ale to je samozrejmé.
A ak chcete aby Vám "ANO" ukázalo len v tom jedinom riadku kde došlo zmene oproti "očakávanému", tak potrebujete najskôr pomocnú tabuľku, v ktorej bude určené, ktorý servis je pre ktorú značku "očakávaný", a porovnáte údaje s touto tabuľkou. Vyskočí na Vás potom ANO len v tom riadku, kde je nesprávny servis, nie aj v ostatných riadkoch, kde je správny servis. Záleží čo chcete.
Sub SpustiZmenu_Click()
Dim Cesta As String, Subor As String, WB As Workbook, x As Long
Cesta = ThisWorkbook.Path & IIf(Right(ThisWorkbook.Path, 1) = "\", "", "\")
Subor = Dir(Cesta & "*.xlsx", vbNormal)
Application.ScreenUpdating = False
While Subor <> vbNullString
On Error GoTo CHYBA
Set WB = Workbooks.Open(Cesta & Subor)
On Error GoTo 0
With WB
With .ActiveSheet
For x = 1 To .Cells(Rows.Count, 2).End(xlUp).Row
.Cells(x + 1, 1) = .Cells(x + 1, 3).Value & .Cells(x + 1, 4).Value
Next x
End With
.Save
.Close
End With
GoTo POKRACUJ
CHYBA:
MsgBox ("Chyba pri spracovaní súboru :" & vbNewLine & vbNewLine & Cesta & Subor)
POKRACUJ:
Subor = Dir()
Wend
Application.ScreenUpdating = True
End Sub
Vytvorte si v zložke s Vašimi súbormi jeden súbor XLSM v ktorom napr. tlačítkom spustite makro.
PS: Ešte som zabudol dodať, že to otvorí a Vašim spôsobom upraví všetky súbory "*.xlsm", ktoré v danom adresári nájde. Takže pokusy robte na kópii adresára s ostrými dátami.
Chýba Vám nadpis v skrytom stĺpci A. Je potrebný aj kvôli Rozšírenému filtru, aj kvôli zisťovaniu posledného riadku.
Ak chcete, pošlite mi na mail reálne súbory, pozriem sa Vám na to a sprevádzkujem. Ale priložte mi tam aj ručne urobený vzhľad ako to má vyzerať. Stačí s kúska údajov. Ak teda chcete. Zneužitie Vašich dát je vylúčené.
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.