» »

Visual Basic in Excel

Visual Basic in Excel

Kaiser ::

V Excelu bi rad napisal skripto za en gumb, ki ga imam v workbooku, da bi ob kliku nanj iz odštel neko od ene celice odštel vrednost druge, rezultat pa bi bil v prvi celici.
Zaenkrat znam v workbook namestiti gumb in posneti makro ter pogledati skripto posnetega makra.
"Very funny, Scotty. Now beam down my clothes!"

matic ::

Ne zastopim kaj bi rad... ampak zato ne rabis makra in programa!!??
Ce bi rad A3 celico odstel od A2 in shranil v A1 - ce to jaz prav zastopim, zapisi samo v celico A1: "=A3-A2" in to je to... ce bi pa rad da se ti to zapise v celico A1 sele ko pritisnes na gumb pa posnami makro kako zapises to v celico A1, ga shrani in nastavi da se sprozi ob tem gumbu, natu pobrisi vsebino celice A1 in to je to.

Samo dvomim da si to hotel... zato malce bolje pojasni zadevo pa bo..
-----------------------------------------
podpis: _____________

Kaiser ::

Rad bi, da se ob pritisku na gumb vrednost v neki celici zmanjša za določeno konstantno vrednost (ta vrednost pa je zapisana v neki drugi celici). Se pravi, če klikam na gumb se vrednost v celici zmanjšuje.
"Very funny, Scotty. Now beam down my clothes!"

losnah ::

Dim konstanta As Integer

Sub odstevanje()

'mesto konstante, v 1. vrstici in drugi koloni
Row = 1
Col = 2

'prebere vrednost konstante
konstanta = Cells(Row, Col)

'zmanjsa aktivno celico za konstanto
Cells(Row, Col) = ActiveCell.Value - konstanta

End Sub

losnah ::

Aja pa se to:

V meniju Tools->Customize, izberi Commands tab, pod Categories izber Macros.
Izberi :) Custom Button in ga nesi na toolbar.
Klikn na njega z desno tipko izberi Assign Macro. Izber makro, ki si ga napisu.
Poj pa zapri okno Customize.

losnah ::

1 Napaka:
vrstico:

Cells(Row, Col) = ActiveCell.Value - konstanta

zamenjaj z

ActiveCell.Value = ActiveCell.Value - konstanta

Kaiser ::

Super dela. Hvala!
"Very funny, Scotty. Now beam down my clothes!"

Vesoljc ::

da ne bom odpiral nove teme:

moram narest en makro v excelu, oziroma proceduro v vba.
prvi korak je tak, da moram odprt (ter kasneje tudi zaprt) eno xls datoteko v novem oknu. neki sem brsku na netu, ampak vse kar sem najdu je odpiranje fajlov prek "OpenFile" dialoga, kjer mora user sam izbrati file ter klikniti open. no, tega nocem... ker pac nimam pojma o VB sprasujem znalce kako prevesti fopen ter fclose ;)
Abnormal behavior of abnormal brain makes me normal...

Mercier ::

Oboje je čisto specifično excelu.

Odpiranje:
Workbooks.Open FileName:="X:\Pot\ExcelovaPeglednica.xls"

Zapiranje je pa rahlo bolj komplicirano:
Lahko zapreš vse odprte datoteke Workbooks.Close, določenega Workbooks("ExcelovaPeglednica.xls").Close ali pa preko ThisWorkbook ali ActiveWorkbook lastnosti (Application) npr. Application.ThisWorkbook.Close (oni application lahko spustiš). ActiveWorkbook tu pomeni trenutno aktivni, ThisWorkbook pa tistega kjer se nahaja makro (VBAProject). Če uporabljaš personal.xls ali add-on, thisworkbook navadno odpade.

Ko zapiraš, navadno excel zagnjavi s shranjevanjem. Temu se izogneš, da pred zapiranjem vpišeš Application.DisplayAlerts = False in po zapranju nazaj nastaviš na true (drugače se ohrani).

Zgodovina sprememb…

  • spremenil: Mercier ()

Vesoljc ::

tnx!

se en Q:
kako pa naredis povsem nov prazen list ter mu das recimo svoje ime?
Abnormal behavior of abnormal brain makes me normal...

Vesoljc ::

se en :|

kako preveris ce obstaja dolocen sheet?
Abnormal behavior of abnormal brain makes me normal...

Vesoljc ::

sem pogruntal 8-)

workbooks.add
workbooks("id").sheets.count
workbooks("id").sheets.name
Abnormal behavior of abnormal brain makes me normal...

Vesoljc ::

vba exampli

ampak se vedno skoz podpicje pisem 8-)
Abnormal behavior of abnormal brain makes me normal...

Mercier ::

Najkoristnejše povezave so zbrane tu: http://www.matjazev.net/prtenjam/index....

www.matjazev.net in na www.webblod.net je forum namenjen VBA. Tole dvoje je domače, za kaj drugega pa ne vem.

Vesoljc ::

zakaj za wraga mi tole javlja subscript out of range error?

Set wb = Workbooks.Add
Application.DisplayAlerts = False
wb.SaveAs FileName:="output.xls"
Application.DisplayAlerts = True
MsgBox "blak"
Windows("output.xls").Select
Abnormal behavior of abnormal brain makes me normal...

Mercier ::

Objekta window ne moreš select-at. Je pa tisti output.xls itak trenutno aktivni zvezek, ko si ga dodal.

Set wb = Workbooks.Add
Application.DisplayAlerts = False
wb.SaveAs Filename:="output.xls"
Application.DisplayAlerts = True
MsgBox "blak"
Workbooks("output.xls").Activate

Subscript out of range pa mi ni jasen. Kje točno se ti pa ustavi izvajanje? Napoveduješ spremenljivke? (option explicit) V nasprotnem primeru lahko pride do čudnih napak...

Vesoljc ::

ma ja, sej mi je nekako ratal, sem uporabil activate pa je zacelo delat... :D

napako mi je pa javljalo direkt po blak-u 8-).

> je pa tisti output.xls itak trenutno aktivni zvezek, ko si ga dodal.

ja, sam vmes operiram se z enimi xls-i tko, da nisem ziher kater je aktiven in kater ne.

mam pa novo tezavco :O

imam en string zapis, ki je v biti hex vrednost (12 znakov). zdej morem izvest tole:
2000 A0B1 CCEE
1) po dva skupi vzet in jih obrnt
0200 0A1B CCEE
2) vzet en znak in njegov bitni zapis obrt (reverse)
0 - 0000 -> 0000
2 - 0010 -> 0100
A - 1010 -> 0101
0 - 0000 -> 0000
itd...

kako najlazje do tega?
Abnormal behavior of abnormal brain makes me normal...

Mercier ::

Ven vržeš presledke:
MyStr = Replace(niz, " ", "")


Najhitreje obrneš po dva znaka v nizu:
For i = 1 To 12 Step 2
  MyStrFUBAR = MyStrFUBAR & StrReverse(Mid$(MyStr, i, 2))
Next


Za bitni zapis nevem kaj točno počneš, ampak v osnovi boš rabil select case stavek s šesnajstimi selecti, noter pa napisano, kaj naj bo kaj. Recimo funkcijo, ki sprejme string (hex) in vrne string (bin).


--------------
edit
Eh, en šlampast del kode...

Zgodovina sprememb…

  • spremenil: Mercier ()

Vesoljc ::

no zadeva deluje tko kot mora...

me pa zanima se ena stvar: zdej je postopek tak, da odprem xls filet, naredim data extract ter filet zaprem, nato vzamem drugega in tako naprej... ob vsem tem se seveda dogaja todno to :)
okna se odpirajo in zapirajo kot zmesana. se da file odprt tako, da ne bo skaku gor? al bo treba za to presaltat na VB?
Abnormal behavior of abnormal brain makes me normal...

Mercier ::

Z Application.ScreenUpdating = False se znebiš bliskov. Ni treba vrednosti postavljat na true, ne spremeni nobene nastavitve excela.

Če rabiš excel, da ti kaj postori, ne rabiš ga pa gledat, bi mogoče skripta bila OK.


Set objExcel = CreateObject("Excel.Application")

'odpre excelov zvezek
objExcel.Workbooks.Open("X:\zvezek.xls")

'posuje excel z nevidnim prahom
objExcel.Visible = False

'nekaj napiše, da ne bo zgledalo,
'da smo bezveze odpirali
objExcel.Range("A1") = "WSH was here"

'naredi, da excel ne gnjavi pri shranjevanju
objExcel.DisplayAlerts = False

'shrani zvezek.xls kot zvezek1.xls
objExcel.Workbooks("zvezek.xls").SaveAs ("X:\zvezek1.xls")

'dovoli excelu nazaj gnjavit
objExcel.DisplayAlerts = True

'ugasne excel
objExcel.Quit

Set objExcel = Nothing

Vesoljc ::

heh, samo tezit mu moras, kaj? ;)
Abnormal behavior of abnormal brain makes me normal...

Vesoljc ::

false screen updating deluje ok.

me pa zanima ena stvarca: ce bi hotu zadevo narest v "pure" VB z takim fancy gui-jem ter brez kakrsnih koli vidnih excelovih datotek, je koda zelo drugacna al bi se lahko zmuznu cez sz ctrl+c in ctrl+v ter kaksnim find/replace? :8)
Abnormal behavior of abnormal brain makes me normal...

Mercier ::

Če bi delal z excelom, bi zgledalo cca. kot zgornji VBS. Skoraj isto kot v samem excelu, ampak spredaj vedno 'objExcel'. Po tem kopitu.

Vesoljc ::

v VB:
lExcel je Excel.app, selectam en sheet, nato pa hocem se en select:
lExcel.Selection.SpecialCells(xlCellTypeLastCell).Select
error:
Ni mogoce dobiti lastnosti: SpecialCells razreda: Range
Abnormal behavior of abnormal brain makes me normal...

Vesoljc ::

If lExcel.Workbooks(lFileList(iFile)).Sheets(iGeneral).Cells(iRow, jLAA) <> Empty Then


tole tud noce, je empty problem (kot variant)?
Abnormal behavior of abnormal brain makes me normal...

Mercier ::

v VB:
lExcel je Excel.app, selectam en sheet, nato pa hocem se en select:
lExcel.Selection.SpecialCells(xlCellTypeLastCell).Select
error:
Ni mogoce dobiti lastnosti: SpecialCells razreda: Range


Problem je, da pri pozni gradnji ne moreš uporabljat poimenovanih konstant excela.

xlCellTypeLastCell = 11

torej:
lExcel.Selection.SpecialCells(11).Select


If lExcel.Workbooks(lFileList(iFile)).Sheets(iGeneral).Cells(iRow, jLAA) < > Empty Then

tole tud noce, je empty problem (kot variant)?


Hmm... Meni dela (VBS). Mogoče, če dodaš na konec še Value? (ali Value2, še bolje)

Vesoljc ::

sem spravil skupaj |O
vcasih je dobro pri projektu dodati se kako referenco :8)

ampak ni mi jasno zakaj je zadeva tako pocasna! kodo sem rahlo preuredil (beri optimiziral!), poskusil sem uporabljati cim manj late bindinga, faktor razlike hitrosti pa je vsaj 10x (tko na uc). warum? :|
Abnormal behavior of abnormal brain makes me normal...


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

Calc/excel delo s tabelo

Oddelek: Programiranje
131343 (1110) salabajs
»

excel+visual basic

Oddelek: Pomoč in nasveti
101455 (1342) švrk
»

VISUAL BASIC - Makro v wordu - prenos podatkov iz tabel v excel

Oddelek: Programiranje
52773 (2635) FlashM
»

[Excel]Vrednost celice = ime dokumenta

Oddelek: Programska oprema
314527 (3949) veteran
»

[Visual studio .NET] Rabim pomoč

Oddelek: Programiranje
91521 (1363) darkolord

Več podobnih tem