Som iba na mobile, tak si prílohu nepozriem, každopádne ak chcete vypisovať alebo inak pracovať s položkami, nemôžete použiť
MsgBox strNames()
ale
MsgBox Item
Alebo
For i = LBound(strNames) To UBound(strNames)
MsgBox strNames(i)
Next i
Parameter procedúry Open ?
ReadOnly:=True
Čistý nezmysel. To chcete upravovať aj riadky v liste, aj zároveň riadky v kóde, a to tak, že sa vždy spoľahnete na to, že sa nepomýlite? A to nevravím o logike veci, keďže výrobky iba vyrábate na sklad, no nevyskladňujete. Tie "vzorce", ktoré niesú vzorcami ... to vážne keď máte na sklade 100 pomarančov a vyrobíte ďalšie 2 pomaranče, tak na sklade ich bude zrazu 200 ?
Ak chcete urobiť normálny odpis skladu, tak uvádzajte príjem, výdaj (započítajte poškodenie) a stav sa bude dať predsa dopočítať univerzálnym riadkom/riadkami kódu, bez ohľadu na pozíciu. Ak nie, musíte uviesť skutočné výpočty, čo s čím a prečo počítate. Ak máte 4 druhy absolútne iných výpočtov (čo nesedí s načrtnutou prílohou), tak si zaveďte tabuľku, kde bude uvedené aký druh výpočtu platí pre aký výrobok, a podľa tejto tabuľky sa určí spôsob výsledku.
Tak či tak, ja osobne nerozumiem o čo iné by tu mohlo ísť.
To nie sú vzorce, ale riadky kódu.
Jedine ma napadá len tak z hlavy niečo v zmysle:
R = 3
Cells(R, "B").Value = Cells(R, "B").Value - Cells(R, "D").Value: R = R + 1
Cells(R, "B").Value = Cells(R, "B").Value + Cells(R, "D").Value: R = R + 1
Cells(R, "B").Value = Cells(R, "B").Value * Cells(R, "D").Value: R = R + 1
Cells(R, "B").Value = (Cells(R, "B").Value + Cells(R, "C").Value) * (Cells(R, "D").Value): R = R + 1
aj keď najlepšie by bolo, pridať prílohu a vysvetliť to tam, či sa to nedá urobiť aj inak, lebo z tohto nevieme presne čo potrebujete robiť.
Všetky zošity majú 1 list, a ten s rovnakým názvom? Umiestnenie dát je rovnaké a začína na A1? Počet stĺpcov je rovnaký alebo rôzny? Riadky sa zisťujú podľa A:A?
Síce sa mi to fakt nechce robiť, ale keď to upresníte, možno ...
EDIT: Ešte sa dá použiť aj ADO aj dolovanie vzorcami.
VLOOOKUP / SVYHLEDAT
Dobré je vložiť požadovaný počet riadkov medzi posledný a predposledný, skopíruje sa tak formát buniek, podmienený formát sa nefragmentuje, a potom už iba natiahnete vzorce, prípadne orámovanie.
Pozor na to, maticový súčin (teda "AND", v CZ "A") sa zadáva pomocou * (hviezdička) a maticový súčet (teda "OR", v CZ "NEBO") sa zadáva pomocou + (plus) a testu na väčšiu hodnotu od 0.
Ja som to spichol takto, s pomocným stĺpcom.
Ak nemáte Office 2019 tak treba MAXIFS a MINIFS nahradiť maticovým vzorcom rovnakej funkcionality. To dajte prípadne vedieť.
Dobrá pakáreň. Obyčajné MAX/MIN alebo MAXIFS/MINIFS nebude stačiť,a to asi ani s kombináciou COUNTIFS na kontrolu odchodu. Môžu nastať blbé prípady, že MAXIFS bude dávať najvyšší čas napr. 23:01, ale to bol fajčiť, v skutočnosti bol ten deň do 24:00, atď. Keď prídem ešte na to kuknem, nápad už je, len čas nie...
Kým som napísal môj predošlý elaborát, tak ste upresnil nezmyselnosť toho času. No nič, v tomto prípade si urobte pomocný stĺpec, kde čas upravíte, podľa podmienky, že ak sa jedná o jeden z tých 3 odchodov, a čas je <= 6:00 tak k času pripočíta 1 deň, inak napíše rovnaký čas. A tento upravený stĺpec potom použijete na výpočet aký potrebujete.
EDIT:
"před 23:59" ??? Veď ste písal, že treba meniť dátum po 00:00 na nasledujúci deň, a nie ten pred 23:59 meniť na predošlý deň.
To je to, čo som písal, že by data mali byť spolu, nie po dňoch. Ale dá sa to tak, že ak bude najskôr odchod, teda je jasné, že za "príchod" môžeme považovať 00:00, a rovnako ak je tam iba príchod za "odchod" môžeme považovať 24:00 (teda 24:00 neexistuje, je to tiež 00:00, ale takto to píšem pre pochopenie, že ide o koniec dňa). Teda MIREK strávil v práci 6:00 hodín z prvej nočnej a 02:29 z druhej nočnej. Ale ako chcete k tomu prirátať prvú časť prvej nočnej a druhú časť druhej nočnej, ak nemáte dáta z predošlého ani nasledujúceho dňa?
Hmm... píšete o prechode cez polnoc, no ja tam žiadny prechod cez polnoc nevidím. Ako určujete, kto je v práci pred polnocou, keď nemáte data po kope?
No a ako píše marjankaj - mená. Kde sú? Nemôžete chcieť od nás aby sme robili spätné inžinierstvo a vhodnou kombinatorikou zisťovali, ako napáskovať vym yslené mená na tabuľku tak, aby sedeli príchody a odchody po logickej stránke. To by nedali výpočtovo ani číňania . Tie Vaše reálne mená cez funkciu Nahradiť nahraďte vymyslenými, ak ch je veľa dá sa urobiť jednoduchá prevodná tabuľka za 3 min.
Aký terminál sa považuje za príchod do práce, a aký sa považuje za odchod z práce ? Parkovisko, hala, šatňa, ... ?
Vy chcete zisťovať odpracovaný čas, alebo čas strávený v objekte medzi príchodom do práce a odchodom z práce? Pretože fajčiar odpracuje menej času, ten čo chodí stále do šatne telefonovať asi tiež. A čo upratovačka, ktorá chodí do šatne a fajčiarne vykonávať prácu? Tej to zas nemôžete odrátať z odpracovaného času...
Noo bude to zábava.
Osekajte "trochu" tie data, či sa nevojdete do 300 KB. Ak nie, použite niektorú online Free službu, alebo určite sa v rodine nájde niekto s telefónom s Androidom, teda má určite účet Google, a ku každému je automaticky 15 GB Cloud "Google Disk" ("Google Drive"). Nahrajte, kliknite pravým a dajte Získať odkaz na zdieľanie (či tak nejak), a ten nám pošlite. Po vyriešení môžete z GD vymazať.
To musí isť do modulu listu, nie do normálneho modulu. Robil som to tak, aby to zvládlo viacnásobné zmeny, a tak som to aj testoval, ale netestoval som zmenu 1 bunky. Inak by ma trklo, že treba vo verzii 1 doplniť jednoprvkové pole. Takže upravené.
Vo verzii 2 by mohol nastať v špecifickom prípade kopírovania do multioblasti nesprávny výsledok. Išlo o to, že ak by ste skopíroval 2 bunky, a na vloženie by ste označil jednu 2 bunkovú oblasť a o niečo ďalej druhú 1 bunkovú oblasť, Excel automaticky vyplní aj tú jednobunkovú kópiou zdrojovej dvojbunkovej. A tá druhá vrátila zlý výsledok. To si musíte vyskúšať. Opravené.
Private Sub Worksheet_Change(ByVal Target As Range)
Dim Zmena As Range, Are As Range, Kde(), H(), i As Long
Set Zmena = Intersect(Cells(2, 2).Resize(Rows.Count - 1), Target)
If Zmena Is Nothing Then Exit Sub
Kde = Worksheets("List2").Range("B2:C27").Value
Application.ScreenUpdating = False
Application.EnableEvents = False
On Error Resume Next
For Each Are In Zmena.Areas
With Are
If .Rows.Count = 1 Then ReDim H(1 To 1, 1 To 1): H(1, 1) = .Value Else H = .Value
For i = 1 To UBound(H, 1)
H(i, 1) = WorksheetFunction.VLookup(H(i, 1), Kde, 2, False)
If Err.Number <> 0 Then H(i, 1) = Empty: Err.Clear
Next i
.Offset(0, 1).Value = H
End With
Next Are
Application.ScreenUpdating = True
Application.EnableEvents = True
End Sub
Private Sub Worksheet_Change(ByVal Target As Range)
Dim Zmena As Range, Are As Range
Set Zmena = Intersect(Cells(2, 2).Resize(Rows.Count - 1), Target)
If Zmena Is Nothing Then Exit Sub
With Zmena.Offset(0, 1)
Application.ScreenUpdating = False
Application.EnableEvents = False
.Formula = "=IFERROR(VLOOKUP(B" & Zmena.Row & ",List2!$B$2:$C$27,2,FALSE),"""")"
For Each Are In .Areas
Are.Value = Are.Value
Next Are
Application.ScreenUpdating = True
Application.EnableEvents = True
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.