Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: VBA/Pikanäppäin

Sivun loppuun

Netta [30.07.2005 00:31:00]

#

Pystyykö VBA:lla tekemään näppäimen, joka määrittelis haluttuun soluun sen hetkisen, tietokoneen aikaan pohjautuvan kellonajan? Eli pystyykö napin toimenpiteeksi jotenkin antamaan "Ctrl+shift+: -> enter"?

neau33 [30.07.2005 00:42:57]

#

Hei Netta!

Kyllä voi ja paljon muutakin...

Eka vaihtoehto: Avaat siinä Visual Basic editorissa pudotusvalikon View ja avaat Object Browser'in ja niin siinä on heti oikealla ensimmäisenä semmonen juttu kun ActiveCell. Aktivoi se ja paina F1 -näppäintä ja tutki mitä esimerkkejä sieltä löytyy...

Toinen vaihtoehto: Hanki vaikka tämä Microsoft Press'in kirjoittama kirja:
Microsoft OFFICE 97 Visual Basic ohjelmointi (ISBN 951-762-562-6, Kustantaja Suomen ATK-kustannus) tai uudempi.

Netta [30.07.2005 01:03:40]

#

Kirja löytyy jo, mutta en löydä keinoa siihen kuinka määrittelen toiminnaksi kyseisin näippäinyhdistelmän, kaikki kolme kun pitää käyttää pohjassa yhtä aikaa.

neau33 [30.07.2005 01:28:02]

#

Tee sellainen juttu että kun sä painat sitä näppäintä niin Keydown tapahtuma aiheutta, että sinne soluun tule sen näppäimen näppäinkoodi.
Siinä on muistaakseni argumentteina vaalmiiks jo sellaset jutut kuin (KeyCode As Integer, Shift as integer) joten jos Shift on pohjassa Shift = 1 ja jos Ctrl on pohjassa niin KeyCode on muistaakseni 17
No okei nythän sä tallennat nämä tiedot Globaaliin muuttujaan siitä KeyDown tapahtumasta elikä

'moduuliin
Global muuttuja as integer

'ja sit sinne tapahtumaan
If Sift = 1 And KeyCode = 17 and muuttuja = 0 Then
 muuttuja = 1: Exit Sub
End if
'ja sit tämmönen juttu
If KeyCode = 13 And muuttuja = 1 Then
 'esim.
 worksheet1.ActiveCell.text = Time$
 muuttuja = 0: Exit Sub
ElseIf Not KeyCode = 13 and Muutuja = 1 Then
 muuttuja = 0: Exit sub
End if

tää homma toimii jos sä painat eka sen Ctrl ja Shift napin ja painat sit Enteriä. Sä voit joko pitää Ctrl'n ja Shft'in pohjassa tai vapauttaa ne ja painaa Enteriä jos sä painat jotain muuta, kuin Enter'iä niin sun on tehtävä homma taas alusta eli Ctrl <> Shift + Enter.

neau33 [30.07.2005 05:46:03]

#

No niin Netta ihan pelkästä mielenkiinnosta...

Jos sä joskus tarvitset tollasta "pikanäppäintä" niin oo nyt niin kiva ja mailaa mulle...

neau33 [30.07.2005 13:11:28]

#

Sorry Netta!

Unohda toi aikasempi juttu, koska sen on syvältä...
En nimittäin muistanut, että Shift arvo muuttuu myös Ctrl -näppäimellä (Shift = 2). No ei lannistuta tehdään se helpommin eli:

'moduuliin...
Global muuttuja As Integer

'KeyDown event'iin...
Select Case Shift
 Case 1, 2: If muuttuja < 3 then muuttuja = muuttuja + 1
 Case 4: muutuja = 0: Exit Sub
End Select
Select Case KeyCode
  Case = 0: Exit Sub
  Case 13: If muuttuja < 3 then muuttuja = muuttuja + 1
  Case Else: muutuja = 0: Exit Sub
End Select
  If muutuja = 3 Then
   Worksheet1.Text = Date$: muuttuja = 0: Exit Sub
  End If

'KeyUp event'iin...
Select Case Shift
 Case 0 to 2: If muuttuja > 0 then muuttuja = muuttuja - 1
 Case 4: muutuja = 0: Exit Sub
End Select
Select Case KeyCode
 Case = 0
 Case 13: If muuttuja > 0 then muuttuja = muuttuja - 1
 Case Else: Muuttuja = 0: Exit Sub
End Select

No nyt sä voit tätä jutskaa soveltamalla ottaa ennemmänkin niitä "pikanäppäimiä" käyttöön (jos ei sormet riitä, voi ottaa myös varpaat mukaan...)


Toivottavasti tästä on SINULLE jotain muutakin antia, kuin vaan hyvät naurut....

peki [30.07.2005 14:01:28]

#

neau33: Oletko nyt aivan varma asiastasi? Käsittääkseni VBA on makroversio VB:stä Microsoftion Office -pakettia varten.
Pikaisesti vilkaisin kyseistä ohjelmaa ja mielestäni sillä voi luoda ainoastaan napeista/valikoista käynnistyviä toimintoja - ei niinkään näppäinyhdistelmän tai esimerkiksi ajan perusteella käynnistyviä. KeyDown/KeyUp metodeja voi toki käyttää, mutta vain lomakkeissa(form). Excel ei ainakaan anna mitään näkyvää keinoa liittää kyseisiä tapahtumia taulukoihin.
Näin uskoisin asian olevan, vaikka VBA:n käyttö on jäänyt vähälle. Tahtoisiko joku vahvistaa? :)

neau33 [30.07.2005 14:49:30]

#

Oletettavasti olet oikeassa peki, mutta nämä
"pikanäppäimet" ovat kyllä käytössä heti kun formi saadaan ladattua joka voi tapahtua aina esim. Worksheet1.Activate tapahtumassa. Ja tän forminhan ei tarvitse missään vaiheessa olla näkyvä(Me.Visible = False), joten ei tässä nyt pitäisi olla mitään ongelmaa. Sitäpaitsi musta jotenkin tuntuu, että Netta joka aloitti tän ketjun on senverran hajulla VBA:sta ettei tän soveltaminen tuota hänelle varmaankaan ongelmia.

'moduuliin
Global muuttuja As Integer, xShift As Integer, xKey  As Integer

'KeyDown event'iin
Select Case Shift
 Case 3
  If xShift = 0 Then
   xShift = 1: muuttuja = muuttuja + 1
  End If
End Select
Select Case KeyCode
 Case 13
 If xKey = 0 Then
  xKey = 1: muuttuja = muuttuja + 1
 End If
End Select

'KeyUp event'iin
 If muuttuja = 2 And xShift = 1 And xKey = 1 Then Worksheet1.ActiveCell.Text = Time$
 xShift = 0: xKey = 0: muuttuja = 0

peki [30.07.2005 20:34:50]

#

Neau33: Formit - ainakaan näkymättömät - eivät tässä tilanteessa auttane sillä formilla on oltava focus ennen, kuin mitään noista keydown/keyup metodeista kutsutaan. :) Näin siis ainakin VB:ssä; tiedä sitten VBA:sta..
Yksi keino (ainoa, jonka keksin) olisi ottaa koko näppis haltuun DirectInputilla ja sitä kautta kaiuttaa näppäimiä, mikä todennäköisesti on turhaa näin pienessä projektissa? ;)

neau33 [30.07.2005 22:25:12]

#

Hello Netta & peki!

No VB:n pohjalta mäkin oon koko aja tätä lähestynyt, mutta toimii se VBA:lla myös
Eli Visual Basic editorissa klikkaat sitä taulu1:stä ja laitat sinne Worksheet_Activate tapahtumaan

UserForm1.Show

Sit Sinne Formin Load tapahtumaan laita ekaks UserForm1.Top arvoks vaikka 1000 niin se formi ei näy enään ruudulla. Sit se aika tulostuu esim. näin:

'KeyUp event...
Worksheets."Taulu1".Cells(1, 1) = Time$

Se formi pitäs sit piilottaa tässä samassa tapahtumassa, että sen työkirjan saa aktiiviseks elikä:

UserForm1.Hide

Sit samassa sessiossa sen formin uudelleen aktivointiin riittää varmaan kun laittaa sen Taulu1:sen mouse_click tapahtummaan vaikka ehdoks, että:

If Button = 2 Then Form1.Show

luulisin, kokeile jos riittää aikaa ja mielenkiintoa...

-Nea-

Ps. ei tästä nyt niin kauheen pikanen näppäinyhdistelmä tullut...

BadSource [01.08.2005 07:51:49]

#

Onko tuo Entteri pakollinen tuohon makron aktivointiin? Helpoitenhan tuon saa tehtyä käyttämällä Excelin (tai minkä tahansa Office -ohjelman) Record New Macro-toimintoa.

Eli Tools->Macro->Record New Macro... jolloin avautuu ikkuna jossa kysellään uuden makron tietoja, joiden joukossa voidaan valita myös Shortcut Key. Entteriä tähän ei voi laittaa, mutta lähes tulkoon kaikki muut näppäimet sitten onkin käytössä. Kannattaa kuitenkin kiinnittää huomiota varattuihin Shortcutteihin (esim. Ctrl+c, Ctrl+v, Ctrl+x tai Ctrl+a), joita ei voi/kannata käyttää.

Jos haluat käyttää Makroa vain kyseisessä työkirjassa, niin valitse kohdasta Store Macro In: This Workbook. Jos valitset Personal Macro Workbook, niin makro on käytettävissäsi kaikissa käyttämissäsi työkirjoissa. Aloita makron nauhoittaminen OK:lla ja pysäytä se saman tien Stop:lla avautuneesta pienestä ikkunasta. Avaa Macro Editor Tools->Macro->Visual Basic Editor ja etsi nauhoittamasi makro moduulista. Mikäli projektisi ei sisällä entuudestaan moduulia, se on lisätty ja on nimeltään Module1. Nauhoittamasi makron alusta löytyy esim. seuraavan lainen tieto:

' CurrentTime Macro
' Macro recorded 1.8.2005 by bad
'
' Keyboard Shortcut: Ctrl+Å

Ajan saat lisättyä aktiiviseen soluun esim. näin...

ActiveCell.Value = FormatDateTime(Now, vbLongTime)
ActiveCell.NumberFormat = "hh:mm:ss" '<-ilman tätä ei sekuntteja normaalisti näytetä

Kokonaisuudessaan koodi näyttää jotakuinkin tältä...

Sub CurrentTime()
' CurrentTime Macro
' Macro recorded 1.8.2005 by bad
'
' Keyboard Shortcut: Ctrl+Å
'
    ActiveCell.Value = FormatDateTime(Now, vbLongTime)
    ActiveCell.NumberFormat = "hh:mm:ss"
End Sub

neau33 [01.08.2005 09:19:33]

#

Hei BadSource!

KIVAA, että löytyi ne pikanäppäimet...


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta