Bol som stanovený predsedom inventarizačnej komisie na hnuteľný majetok.
V majetku je vyše 2 000 položiek a väčšina z nich má po viac kusoch.
Navyše sú položky rôzne rozčlenené zhruba do 148-ich súčastí.
Teraz to vysvetlím ľudsky.
Napríklad:
Ja som jedna súčasť, moja kancelária je druhá súčasť.
Ja mám na karte (položka) - PC, (položka) - tlačiareň, (položka) - scaner.
V mojej kancelárii je (položka) - písací stôl, (položka) - stôl pod PC, (položka) - skriňa atd.
Potreboval som v Exceli 2007 vytvoriť súbor, v ktorom by som mal prehľad o tom, aké položky máme na stave, aké sú súčasti, čo majú na stave jednotlivé súčasti, kontrola či sa skutočnosť rovná tomu čo je na stave a všetko to musí spolupracovať aj po zadaní akejkoľvek zmeny.
Za pomoci jednoduchého makra som vytvoril 148 nových listov očíslovaných od 1 do 148.
(komentáre tu začínajú apostrofom ')
Kód:
Sub VytvorListy()
Dim i As Integer ' deklarácia premennej typu int
For i = 1 To 148 ' cyklus 1 až 148
Worksheets.Add After:=Worksheets(Worksheets.Count) ' vytvor nový pracovný hárok
Worksheets(Worksheets.Count).Name = i ' s názvom i, teda 1 až 148
Next i
End Sub
Takto sa vytvára makro:
Príloha:
excel1a.JPG [ 24.86 KiB | Zobrazené 4803 krát ]
Napíšeš názov a dáš vytvoriť.
Príloha:
excel2.JPG [ 38.25 KiB | Zobrazené 4803 krát ]
Obsah tela makra treba dopísať.
Príloha:
excel3.JPG [ 30.13 KiB | Zobrazené 4803 krát ]
Takto sa spustí:
Príloha:
excel4.JPG [ 27.58 KiB | Zobrazené 4803 krát ]
Ďalší list som nazval "celkom", vytvoril som v ňom tabuľku s údajmi o položkách (vyše 2000), toto bolo najpracnejšie, pretože som ich tam musel nahádzať jednotlivo po riadkoch so všetkými potrebnými údajmi.
Ukážka:
Príloha:
excel.JPG [ 104.97 KiB | Zobrazené 4816 krát ]
Potom som vytvoril makro, ktoré do listov 1 až 148 vložilo tabuľku z listu "vzor" (upravená tabuľka !celkom") s pridaným stĺpcom na zadanie skutočného množstva položiek u súčastí (všade je tlačitko pre skok na list "obsah").
Kód:
Sub VlozDatabazuNovu()
'
' VlozDatabazu Makro
'
'
' definovanie celočíselnej premennej i
Dim i As Integer
' pracuje na pozadí
Application.ScreenUpdating = False
' aktivácia listu vzor
Sheets("vzor").Select
' vybranie stĺpcov
Columns("A:H").Select
' skopírovanie vybratých stĺpcov do pamäti
Selection.Copy
' vytvorenie slučky 1 až 148
For i = 1 To 148
' aktivácia i-teho listu v poradí (nie názvu)
Sheets(i).Select
' aktivácia bunky A1
Range("A1").Select
' vloženie skopírovaného
ActiveSheet.Paste
' zápis do bunky E2 i-té číslo
Cells(2, 5) = i
' aktivácia bunky A1
Range("A1").Select
' ukončenie slučky
Next i
' aktivácia listu vzor
Sheets("vzor").Select
' zrušenie označenia kopírovanej oblasti
Application.CutCopyMode = False
' aktivácia bunky A1
Range("A1").Select
' koniec práce na pozadí
Application.ScreenUpdating = True
End Sub
Ďalej som vytvoril 148 makier - skok na list č. 1 - 148.
Ukážka:
Kód:
Sub tlac1()
Sheets("1").Select
End Sub
Sub tlac2()
Sheets("2").Select
End Sub
Sub tlac3()
Sheets("3").Select
End Sub
Sub tlac4()
Sheets("4").Select
End Sub
Sub tlac5()
Sheets("5").Select
End Sub
Sub tlac6()
Sheets("6").Select
End Sub
Sub tlac7()
Sheets("7").Select
End Sub
...
Nasledujúci list som nazval "obsah" a v ňom som vytvoril 148 tlačítok na 148 súčastí a priradil som im makrá skok na list č.1 - 148
(zmazal som názvy súčastí, to vás nemusí zaujímať
)
Príloha:
excel1.JPG [ 11.16 KiB | Zobrazené 4816 krát ]
Ďalšie makro je aktualizácia databázy, to sa použije vždy, keď sa niečo zmení v liste "celkom", aby sa zmeny premietli do listov 1 - 148.
Kód:
Sub AutualizujDatabazu()
Dim i As Integer
' pracuje na pozadí
Application.ScreenUpdating = False
' aktivácia listu číslo celkom
Sheets("celkom").Select
' vybranie oblasti buniek
Range("A4:E1600").Select
' skopírovanie vybratých stĺpcov do pamäti
Selection.Copy
' vytvorenie slučky 1 až 148
For i = 1 To 148
' aktivácia i-teho listu v poradí (nie názvu)
Sheets(i).Select
' aktivácia bunky A1
Range("A4").Select
' vloženie skopírovaného
ActiveSheet.Paste
' zápis do bunky E2 i-té číslo
' Cells(2, 5) = i
' aktivácia bunky A1
Range("A1").Select
' ukončenie slučky
Next i
' aktivácia listu číslo celkom
Sheets("celkom").Select
' zrušenie označenia kopírovanej oblasti
Application.CutCopyMode = False
' aktivácia bunky A1
Range("A1").Select
' koniec práce na pozadí
Application.ScreenUpdating = True
End Sub
Na toto všetko mi stačili stránky o visual basic excel 2007 a základy céčka.
Teraz som však potreboval aby sa mi do jednej bunky v liste "celkom" automaticky spočítavali obsahy bunky (napr.) E7 z každého listu (1 - 148).
Minulý rok som to robil tak, že som klikol na liste "celkom" na príslušnú bunku, kde sa to malo spočítavať, potom na "suma" a pomaly som prechádzal list po liste, všade označil bunku E7 a stlačil +.
Trvalo to hrozne dlho, bolo to deprimujúce a mohol som sa pomýliť, niečo vynechať, niečo zapísať viackrát.
Tohto roku som to vyriešil veľmi jednoducho.
Jednoduchý programík v céčku vytvoril potrebný (poriadne dlhý) reťazec, ten som z výstupu programu skopíroval, vložil do word súboru (bolo treba odstrániť znaky '\n', ktoré pri výpise príkazový riadok automaticky vytvorí) na malú úpravu, odtiaľ do konkrétnej bunky listu "celkom" a bolo vystarané.
Kód:
#include <stdio.h>
#include <string.h>
int main (void)
{
int i;
char slovo[2000], pom[10];
slovo[0] = '\0';
for ( i = 1; i <= 190; i++) {
sprintf(pom,"'%d'!F4+", i);
strcat(slovo, pom);
}
printf("%s\n", slovo);
return 0;
}
Výpis vytvoreného reťazca:
Kód:
'1'!F4+'2'!F4+'3'!F4+'4'!F4+'5'!F4+'6'!F4+'7'!F4+'8'!F4+'9'!F4+'10'!F4+'11'!F4+'12'!F4+'13'!F4+'14'!F4+'15'!F4+'16'!F4+'17'!F4+'18'!F4+'19'!F4+'20'!F4+'21'!F4+'22'!F4+'23'!F4+'24'!F4+'25'!F4+'26'!F4+'27'!F4+'28'!F4+'29'!F4+'30'!F4+'31'!F4+'32'!F4+'33'!F4+'34'!F4+'35'!F4+'36'!F4+'37'!F4+'38'!F4+'39'!F4+'40'!F4+'41'!F4+'42'!F4+'43'!F4+'44'!F4+'45'!F4+'46'!F4+'47'!F4+'48'!F4+'49'!F4+'50'!F4+'51'!F4+'52'!F4+'53'!F4+'54'!F4+'55'!F4+'56'!F4+'57'!F4+'58'!F4+'59'!F4+'60'!F4+'61'!F4+'62'!F4+'63'!F4+'64'!F4+'65'!F4+'66'!F4+'67'!F4+'68'!F4+'69'!F4+'70'!F4+'71'!F4+'72'!F4+'73'!F4+'74'!F4+'75'!F4+'76'!F4+'77'!F4+'78'!F4+'79'!F4+'80'!F4+'81'!F4+'82'!F4+'83'!F4+'84'!F4+'85'!F4+'86'!F4+'87'!F4+'88'!F4+'89'!F4+'90'!F4+'91'!F4+'92'!F4+'93'!F4+'94'!F4+'95'!F4+'96'!F4+'97'!F4+'98'!F4+'99'!F4+'100'!F4+'101'!F4+'102'!F4+'103'!F4+'104'!F4+'105'!F4+'106'!F4+'107'!F4+'108'!F4+'109'!F4+'110'!F4+'111'!F4+'112'!F4+'113'!F4+'114'!F4+'115'!F4+'116'!F4+'117'!F4+'118'!F4+'119'!F4+'120'!F4+'121'!F4+'122'!F4+'123'!F4+'124'!F4+'125'!F4+'126'!F4+'127'!F4+'128'!F4+'129'!F4+'130'!F4+'131'!F4+'132'!F4+'133'!F4+'134'!F4+'135'!F4+'136'!F4+'137'!F4+'138'!F4+'139'!F4+'140'!F4+'141'!F4+'142'!F4+'143'!F4+'144'!F4+'145'!F4+'146'!F4+'147'!F4+'148'!F4
_________________
kódy píšem na platforme: linux Ubuntu 12.04 (Geany, Code::Blocks), WinXP (Code::Blocks, PsPad editor),
Skype: libcokamo, ICQ: 56312279
Ak treba, napíš mi na
libcosenior@gmail.com. To mám v mobile a stále po ruke.