Tak za :
1. Vo VBA sa používajú ENG vzorce, teda žiadne POZVYHLEDAT ale MATCH.
2. ENG oddeľovačom argumentov nieje ";" bodkočiarka/středník, ale "," čiarka.
3. Názov listu obalte do apostrofov "'"
4. Úvodzovka musí byť uvedená 2x, aby ju VBA interpretoval ako úvodzovku, inak je to totiž jeden z riadiacich znakov určujúci zač./kon. reťazca.
Výsledok
"=OFFSET('Program'!$A$3,MATCH(1,('Program'!$B$4:$B$30=$X$5)*('Program'!$C$4:$C$30=""Ano""),0),0,COUNTIFS('Program'!$B$4:$B$30,$X$5,'Program'!$C$4:$C$30,""Ano""))"
A čo určí, do ktorej zo štyroch farebných tabuliek sa údaj má vložiť ? Akým spôsobom ? Doradu podľa pozice a turnusu pod seba ? Priložte vyplnený príklad, nech je vidieť, čo a kam.
EDIT:
Aha, v súbore máte asi chybu, lebo všetky tabuľky majú rovnaké označenie 1A/1B/1C, ale má to byť asi 1A/1B/1C, 2A/2B/2C, ...
Teda maticový vzorec by to mal zvládnuť, vyskúšajte.
Pochopil ste to, ale nie celkom to platí tak ako ste napísal, že v kolekcii môže byť rovnaký iba jeden prvok. Toto platí iba ak použijem 2. parameter metódy Add - [Key]. Ak tam dám iba Add, tak v poho môžem pridať aj rovnaké. Ale to Key mi zabezpečí, že každé pridávanie položky s rovnakým Key neprebehne.
Tu je ešte jednoduchý príklad aj na vzorcové riešenie.
Sub JedinecneHodnoty()
Dim Col As New Collection, D(), H(), x As Long, y As Long
D = Range("F5:N12").Value
On Error Resume Next
For x = 1 To UBound(D, 2) Step 2
For y = 1 To UBound(D, 1)
If Not IsEmpty(D(y, x)) Then Col.Add D(y, x), CStr(D(y, x))
Next y
Next x
On Error GoTo 0
If Col.Count > 0 Then
ReDim H(1 To Col.Count, 1 To 1)
For x = 1 To Col.Count
H(x, 1) = Col(x)
Next x
Range("B19").Resize(Col.Count).Value = H
End If
End Sub
Nastavte si v "Režim návrhu" vo vlastnostiach oblasť na vyplnenie ListBoxu (ListFillRange) a bunku pre odloženie hodnoty (LinkedCell), aby si ju pamätal. A potom nieje problém a stačí už iba:
Private Sub CommandButton1_Click()
Select Case ComboBox1.ListIndex
Case 0: MsgBox "čeština"
Case 1: MsgBox "angličtina"
Case 2: MsgBox "němčina"
Case 3: MsgBox "francouzština"
End Select
End Sub
Ktorá z tých oblastí je Definovaný názov so súčtom buniek ???
SOUHRN_OBRAT - používate ClearContents, teda evidentne oblasť, nie súčet vzorcom.
OJ_NAZVY - v cykle while a Offset, teda opäť oblasť buniek.
VZZ_OBRAT - toto je ten Def. názov so vzorcom ??? Tak potom skúste
Range("SOUHRN_OBRAT").Offset(i, 1).Value = [VZZ_OBRAT]
Koľko riadkov, takto spracovávate ? Musí to byť totiž pomalé. Vložte prílohu, prerobíme na rýchle polia, ak to pôjde...
Priložte nejakú prílohu.
Dalo by sa aj:
=VLOOKUP(F17;$K$3:$R$12;MATCH(C17;$L$2:$R$2;0)+1;FALSE)
=SVYHLEDAT(F17;$K$3:$R$12;POZVYHLEDAT(C17;$L$2:$R$2;0)+1;NEPRAVDA)
https://www.extendoffice.com/sk/documents/excel/771-excel-fill-blank-cells-with-value-above.html
Žiaľ nemám žiadnu literatúru k doporučeniu :(
Ale ani som nehľadal.
Ja som si vo VBA vystačil s netom. Ale zase aké také "programátorské" myslenie som mal naučené ešte z čias Delphi na Pentium I/II, či dokonca z Basicu a Assembleru na PMD-85 :)
Dnes sú určite lepšie možnosti ako kedysi. Takmer na všetko nájdete odpoveď pri zadaní EN dotazu v Googli.
V CZ napr. táto stránka, je tu všetkého mraky. Alebo office.lasakovi.
Z EN napr. stránky rondebruin alebo stackoverflow ...
Napr. takto:
Dim S(), Pocet As Long
Sub Zoznam_MP3()
Dim FSO As Object, fsoAdresar As Object, Cesta As String, T()
Pocet = 0 'Výmaz prípadných predošlých výsledkov v poli
Erase S
With wsMP3
Cesta = .Cells(1, 3).Value
If Right$(Cesta, 1) <> "\" Then Cesta = Cesta & "\" 'Kontrola cesty
If Len(Cesta) < 3 Or Len(Dir(Cesta, vbDirectory)) = 0 Then MsgBox "Chybná cesta :" & vbNewLine & Cesta, vbExclamation: Exit Sub
Set FSO = CreateObject("Scripting.FileSystemObject") 'Vytvorenie prístupu k súborom
Set fsoAdresar = FSO.getFolder(Cesta)
Call ZoznamSuborov(fsoAdresar) 'Načítaj prvý adresár
Application.ScreenUpdating = False
With .Columns(1)
.ClearContents 'Vymaž starý zoznam
Select Case Pocet 'Podľa počtu súborov v poli toto pole prevráť cyklom alebo transponuj (nedá sa transponovať viac ako 32767 prvkov)
Case Is > 32767: ReDim T(1 To Pocet, 1 To 1) 'Prevráť
For i = 1 To Pocet
T(i, 1) = S(i)
Next i
.Resize(Pocet).Value = T
Case Is > 0: ReDim Preserve S(1 To Pocet) 'Uprav správnu veľkosť a transponuj
.Resize(Pocet).Value = Application.Transpose(S)
End Select
End With
Application.ScreenUpdating = True
MsgBox "Počet súborov *.mp3 :" & vbNewLine & Pocet, vbInformation
End With
Erase S: Set FSO = Nothing: Set fsoAdresar = Nothing
End Sub
Sub ZoznamSuborov(ByRef fsoAdresar As Object) 'Rekurzívna metóda
Dim fsoSubor As Object, fsoPodAdresar As Object, PocS As Long
With fsoAdresar
PocS = .Files.Count 'Zisti počet súborov v aktuálne skúmanom adresári/podadresári
If PocS > 0 Then
ReDim Preserve S(1 To Pocet + PocS) 'Navýš jednorázovo pole, aj keď nebude využité
For Each fsoSubor In .Files 'Prejdi všetky súbory
If LCase(Right$(fsoSubor.Name, 4)) = ".mp3" Then 'Skontroluj príponu *.mp3
Pocet = Pocet + 1 'Navýš index v poli názvov
S(Pocet) = fsoSubor.Path 'Zapíš cestu súboru
End If
Next fsoSubor
End If
For Each fsoPodAdresar In .subFolders 'Prehľadaj aj prípadné podadresáre
Call ZoznamSuborov(fsoPodAdresar) 'Načítaj podadresár
Next fsoPodAdresar
End With
Set fsoPodAdresar = Nothing: Set fsoSubor = Nothing
End Sub
Ale prečo by to nefungovalo ???
Tak vymazať alebo preniesť ? Asi preniesť.
Tým extra súborom je myslený skutočne iný súbor, alebo len iný list ? (Ľudia v tom majú bežne chaos).
Ten súbor/list už existuje (ako sa volá, v prípade súboru aj kde sa nachádza) ? Ak áno, tak pridať dáta k už existujúcim za ne, alebo nahradiť tie čo tam už sú ?
Treba testovať od prvej bunky až po poslednú použitú v danom stĺpci, alebo je pevne daný rozsah (napr. objektom Tabuľka)?
Treba kopírovať aj formát (ohraničenie, farba a pod ...), alebo iba hodnoty do prednaformátovaných buniek ?
...
Príloha?
EDIT: Malý príklad prenosu dát do iného listu. Ak by hrozilo viac ako 32767 prenášaných riadkov, treba prirobiť ešte preklápací cyklus.
"Počet výskytov" a "Počet jedinečných hodnôt" je veľký rozdiel.
Počet jedinečných podľa 2 podmienok, by sa dal takto:
=SUM(--(COUNTIFS(OFFSET(E8:E14;;;ROW(E8:E14)-1);J8;OFFSET(F8:F14;;;ROW(F8:F14)-1);K8;OFFSET(D8:D14;;;ROW(D8:D14)-1);IF((E8:E14=J8)*(F8:F14=K8);D8:D14))=1))
=SUMA(--(COUNTIFS(POSUN(E8:E14;;;ŘÁDEK(E8:E14)-1);J8;POSUN(F8:F14;;;ŘÁDEK(F8:F14)-1);K8;POSUN(D8:D14;;;ŘÁDEK(D8:D14)-1);KDYŽ((E8:E14=J8)*(F8:F14=K8);D8:D14))=1))
Išlo by doplniť aj ďalšie podmienky (neskúšal som, teoretizujem), ale dajte reálny príklad, kde bude potreba viacero podmienok. Ak bude potreba variabilný počet podmienok, bez zmeny vzorca, tak to tato nepôjde. Len pevný počet podmienok, prípadne vždy zmeniť vzorec.
Riešením by mohol byť aj takýto vzorec:
=IFERROR(MATCH(TRUE;MMULT(COUNTIF(OFFSET(OBLAST;ROW(OBLAST)-2;;1);TRANSPOSE("*"&HLADAJ&"*"));--(ROW(HLADAJ)>0))>0;0);"")
=IFERROR(POZVYHLEDAT(PRAVDA;SOUČIN.MATIC(COUNTIF(POSUN(OBLAST;ŘÁDEK(OBLAST)-2;;1);TRANSPOZICE("*"&HLADAJ&"*"));--(ŘÁDEK(HLADAJ)>0))>0;0);"")
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.