Neviem, či Ti moja rada pomôže, ale pri takom množstve záznamov, ktorý uvádzaš, by som osobne uvažoval o prechode na Access alebo MS SQL server express (ten je zadarmo).
o.k.
eLCHa: u toho i pmn trochu záleží i na predpoklade, rádovo koľko záznamov v kombe bude zobrazených, aby to kombo dávalo zmysel, toľko k mojej voľbe datového typu Byte
zoradiť podľa abecedy by to samozrejme šlo, napr. použitím nejakého triediaceho algoritmu. Dajte si vyhľadať v google trebárs bubble sort VBA (nie je to optimálny spôsob z pohľadu run-time, ale pre tieto účely postačí) a zakomponujte si do kódu, ja bohužiaľ už zas nemám čas, ale pokiaľ si s tým neporadíte, tak niekto šikovný Vám to sem hodí.
edit:len technická - lastRw stačí deklarovať ako Long, deklarácia Double je zbytočná
Do RowSource nebudete vkladať nič, pri inicializácii formulára si tento do Comboboxu načíta každú 3. bunku zo stĺpca B, listu Sheet2. Takže Vaša úprava bude spočívať akurát v tom, že Sheet2 nahradíte kódovým názvom listu, z ktorého sa majú hodnoty do Comba načítať. Rovnako ComboBox1 v kóde nahradíte tým správnym.
Jednotlivé premenné:
mySh - list, z ktorého sa majú do Comba načítať údaje
lastRw - číslo posledného použitého riadku v stĺpci B listu mySh
i - pomocná premenná pre krok cyklu (bunka B3 až Bxxx s krokom 3, t.j. každá tretia).
Je možné použiť cyklus; do kódového okna formulára zadať niečo v tvare:Private Sub UserForm_Initialize()
Dim mySh As Worksheet, lastRw As Double, i As Byte
Set mySh = Sheet2
With mySh
lastRw = .Cells(.Cells.Rows.Count, 2).End(xlUp).Row
For i = 3 To lastRw Step 3
Me.ComboBox1.AddItem .Cells(i, 2)
Next i
End With
End Sub
Do kódového okna ThisWorkbook vlož:Private Sub Workbook_BeforeClose(Cancel As Boolean)
ActiveWindow.Close
End Sub
Private Sub Workbook_Open()
ActiveWindow.NewWindow
ActiveWorkbook.Windows.Arrange ArrangeStyle:=xlVertical
End Sub
Pokiaľ klikneš v exceli na ten obrázok a nebudeš vidieť zelený puntík, tak obrázkom nie je možné otáčať. Niektoré objekty proste rotáciu neumožňujú, môže to byť i tento prípad...
Predpokladám, že ten obrázok bude pravdepodobne objekt Shape a bude mať pravdepodobne nejaké meno. V takom prípade nejako takto asi:Sub Rotuj()
Dim myPic As Shape
Set myPic = ActiveSheet.Shapes("Picture 1")
With myPic
.Rotation = 90
End With
End Sub
problém je, že se na tyto buňky vážou vzorce, které hledají přímo název měsíce
a to máš prečo také vzorce zase? Z dátumu predsa dokážeš mesiac vypreparovať cez funkciu Month...
Mno, a okrem toho i dátum (t.j. číslo) môžeš previesť na text a ako jeho formát použiť ten, ktorý som uviedol, t.j. niečo v tvare:=TEXT(A1; "[$-809]dd-mmm-rrrr;@")alebo=TEXT(A1; "[$-809]mmm;@")záleží, či chceš iba mesiac, alebo celý dátum. Ale keď si sa rozhodol si to komplikovať, tak si trvaj na makre. Ja v takom prípade nemôžem slúžiť, páč nie som presvedčený, že makro je najlepšia cesta a nebudem tvoriť niečo, zmysel čoho mi zostáva skrytý
[$-850 ] dd-mmm-rrrr
alebo
[$-809]dd-mmm-rrrr;@
@Lubo: good point
Na svoju chabú obhajobu uvediem, že ten Tvoj kód nesimuluje úplne presne zadanie, takže som ho trochu upravil, aby ho lepšie reflektoval:Sub test()
Dim cas As Single, myRngAddress As String
Application.Calculation = xlCalculationManual
Application.ScreenUpdating = False
[A1].Value = 1
' [A1:A30].DataSeries Rowcol:=xlColumns, Type:=xlLinear, Step:=1, Stop:=30
[A1:A500].DataSeries Rowcol:=xlColumns, Type:=xlLinear, Step:=1, Stop:=500
' [C1:C500].FormulaR1C1 = "=COUNTIF(C1,""<10"")"
myRngAddress = [A1:A500].Address(, , xlR1C1)
[C1:C500].FormulaR1C1 = "=COUNTIF(" & myRngAddress & ",""<10"")"
' ActiveSheet.Calculate ' Necháme spoèítat závislosti bunìk + pøípadnì rozbìhneme procesor
cas = Timer()
ActiveSheet.EnableCalculation = False
ActiveSheet.EnableCalculation = True
ActiveSheet.Calculate ' pøepoèteme list na èas
Debug.Print Format(Timer() - cas, "0.000000") & " =COUNTIF(C1,""<10"")"
' [C1:C500].FormulaR1C1 = "=SUMPRODUCT((C1<10)*ISNUMBER(C1))"
[C1:C500].FormulaR1C1 = "=SUMPRODUCT((" & myRngAddress & "<10)*ISNUMBER(" & myRngAddress & "))"
ActiveSheet.Calculate ' Necháme spoèítat závislosti bunìk + pøípadnì rozbìhneme procesor
cas = Timer()
ActiveSheet.EnableCalculation = False
ActiveSheet.EnableCalculation = True
ActiveSheet.Calculate ' pøepoèteme list na èas
Debug.Print Format(Timer() - cas, "0.000000") & " =SUMPRODUCT((C1<10)*ISNUMBER(C1))"
ActiveSheet.UsedRange.Clear
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
End SubUznávam ale bez mučenia, že Jezov prístup je vhodnejší a ja som vo svojej ješitnosti dal i svoje riešenie, ktoré som medzitým mal už napísané a medzitým odbehol od stroja.
když mám např. 1.1.2001
pokiaľ to excel skutočne berie ako dátum (číslo), a to som si skoro istý, že áno, tak na čo, prosím ťa, potrebuješ makro u niečoho, kde postačuje vlastný formát bunky???
Keď už som to písal, tak to sem dám tiež:
=IF(SUMPRODUCT((A1:H1<10)*ISNUMBER(A1:H1))>3;"splneno";"Ke splnění získej " & 4-SUMPRODUCT(--(A1:H1<10)) &" hodnotu")
v prílohe máš vzor
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.