Just nu i M3-nätverket
Jump to content

Vid TAB-tryckning kontrollera vilken ruta man står i.


Skeå

Recommended Posts

Tjena. Jag har inte hållit på med VBA i Excel förr. Heller inte i någon annan syfte för den delen. Men det jag vill göra är att när TAB-tangentet trycks ska den kontorllera vilkenruta den står i.

Är inte hundra på hur detta görs om det är via en loop eller om det finns en avbrotts hanterar som kan ställas in för att reagera på en tab-tryckning.

 

Vad detta ska användas till är en provbänk som ska köras några hundra gånger. Och då vill jag att det ska loggas automatiskt i ett excel blad. Mellan varje inmatning från proutrustningen så kommer en Tab-kod in genom PS/2 ingången, datorn uppfattar den som en tab-tryckning. och der är grunden till min fråga.

 

Link to comment
Share on other sites

Ett snabbt svar som dock inte är helt vad du önskar.

 

Ett fånga ett enskilt knapptryck tror jag inte är möjligt i Excel. Dvs när du editerar en cell så kan du ej upptäcka vad som sker där innan cellen valideras, dvs när fokus byts från cell till annan cell eller komponent i Excel.

 

När en cell ändras finns några rutiner man kan använda men dessa är lite bökiga och kan ställa till med problem om man ej tar i akt vad man gör.

 

Exempelvis:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
   MsgBox Target.Address
End Sub

Visar adressen på målcellen.

 

Om en ändring har skett i cellen så visar:

Private Sub Worksheet_Change(ByVal Target As Range)
   MsgBox Target.Address
End Sub

adressen på cellen som ändrats.

 

Men som sagt, kanske detta inte var vad du sökte. Betonar en gång till att dessa händelsefunktioner är kraftfulla och därmed lite struliga. Man måste se till att de har en fullständig felhantering och aldrig går så fel att koden stannar. Likaså bör man se till att första kontrollen som sker är enkel och sorterar ut alla eventuella anrop som ej bör köras. Samt - om man har annan kod som gör operationer på arbetsbladet så bör händelsefunktionerna stängas av då de annars kan slöa ned övrig kod kraftigt.

 

 

Det finns ett undantag. Om det är ett UserForm, ett VBA-element, som inmatningen sker till så kan man detektera enskilda knapptryckningar och ett tryck på TAB bör gå att fånga.

 

 

 

/T

 

Even when we know we´ll never find the answers, we have to keep on asking questions.

 

Link to comment
Share on other sites

TJena, jo jag kör på den lösningen. Satt o provade medan jag väntade på svar och den dök upp på skärmen. Och koden blev som nedan.

 

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)

Dim Adress, FirstWord, Post As String

Dim New_Adress As String

 

FirstWord = ActiveCell.Address

Adress = Mid(FirstWord, 1, 2)

Post = Mid(FirstWord, 4)

 

If (Adress = "$C") Then

Post = Post + 1

New_Adress = "A" + Post

Range(New_Adress).Select

End If

End Sub

 

 

 

Link to comment
Share on other sites

Finns det någon enkel sätt att med samma Workbook_sheetchange ändra ett diagrams käldata? ... hur är källdatan definerad ?

 

Link to comment
Share on other sites

Ahh. OK.

Snyggar till din kod lite:

[color="#0000ff"]Private[/color] [color="#0000ff"]Sub[/color] Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
    [color="#0000ff"]Dim[/color] rwIndex As Integer, colIndex As Integer
[color="#0000ff"]On Error[/color] GoTo errHandler
    [color="#0000ff"]If[/color] Target.Cells.Count <> 1 [color="#0000ff"]Then[/color]
        [color="#0000ff"]Exit[/color] [color="#0000ff"]Sub[/color]
    [color="#0000ff"]End[/color] [color="#0000ff"]If[/color]
    rwIndex = Target.Row
    colIndex = Target.Column
    [color="#0000ff"]If[/color] colIndex = 3 [color="#0000ff"]Then[/color]
        colIndex = 1
        rwIndex = rwIndex + 1
        Cells(rwIndex, colIndex).[color="#0000ff"]Select[/color]
    [color="#0000ff"]End[/color] [color="#0000ff"]If[/color]
[color="#0000ff"]Exit[/color] [color="#0000ff"]Sub[/color]
errHandler:
[color="#006400"]'om fel - gör inget?[/color]
[color="#0000ff"]End[/color] [color="#0000ff"]Sub[/color]

1: Släng ala händelser där fler än en cell är inblandade.

2: Nyttja rad/kolumnnummer istället.

3: En felhanterare är aldrig fel att ha.

Och - jag tar och flyttar denna tråd till forumet VBA

 

/T - moderator Excel & ...

Even when we know we´ll never find the answers, we have to keep on asking questions.

 

 

[inlägget ändrat 2006-01-02 14:57:36 av Monshi]

Link to comment
Share on other sites

Visst går det men det bör nog undvikas. Bättre att utföra den uppdateringen när alla data, finns annars risk att det slöar ned arbetsboken.

 

Men det finns smidiga sätt att göra grafens område dynamiskt:

1: Formeln:

=FÖRSKJUTNING(Blad1!$A$1;1;0;ANTALV(Blad1!$A:$A)-1)

ger en referens till området A2 till Ax där x är antal konsekutiva värden i kolumnen.

 

2: Skapa två, eller fler, namngivna områden. Exempelvis området grIndex som då ges formeln ovan (utgår från att A1 är en rubrikrad) samt grVärden1 som då ges formeln:

=FÖRSKJUTNING(Blad1!$B$1;1;0;ANTALV(Blad1!$B:$B)-1)

Namngivna referenser skapas i menyn Infoga - Namn

 

3: Skapa din graf. Sätt sedan din index-serie till

=minBok.xls!grIndex

samt dataseriern till

=minBok.xls!grVärden1

 

Där minBok.xls är namnet på din arbetsbok. (utav någon anledning är det nödvändigt)

 

Hänger du med i det ovan?

 

 

/T

 

Even when we know we´ll never find the answers, we have to keep on asking questions.

 

 

[inlägget ändrat 2006-01-02 14:57:16 av Monshi]

 

[inlägget ändrat 2006-01-02 14:58:02 av Monshi]

Link to comment
Share on other sites

Eller, för att gå tilbaks till ursprungsidén:

 

Även kontroller har keyevents. det går t.ex att fånga en utskrivbara "ANSI-key" med hjälp av KeyPress i VBA.

 

Private Sub object_KeyPress( ByVal KeyANSI As MSForms.ReturnInteger)

bla bla

end sub

 

men den är inte känslig för Tab (ja, världen är ond!!!)

 

 

VBA hjälpen rekommenderar istället KeyUP eller Keydown.

 

Du skulle t.ex kunna infoga en helt meningslös textkontroll och tvingar den att ta fokus med någon händelsehanterare:

Private Sub Worksheet_Activate()
ActiveSheet.Shapes("TextBox1").Select
End Sub

 

eller bara genom en välplacerad kodrad. Sen kan du testa någonting i stil med:

 

Private Sub TextBox1_KeyUp(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
If KeyCode = 9 Then
   ActiveSheet.Range("A1").Value = _
   ActiveSheet.Range("A1").Value + 1
End If
End Sub

 

 

Eller gå in på API-spåret:

 

http://www.awprofessional.com/articles/article.asp?p=366892&seqNum=4&rl=1

 

Ser så där lagom roligt ut...

 

Link to comment
Share on other sites

TJa, Tack för upprensningen av koden. vart ju skitsnyggt. Fan va länge sedan det är sen man programmerade ngt!

Jag ändrade COL värdet bara till 2 så att efter det att jag skrivit in värdet i column två så återgår den till column ett.

 

Private Sub object_KeyPress( ByVal KeyANSI As MSForms.ReturnInteger)

Lite synd att den är okänslig mog mot Tab. För just apparaten jag har är förprogrammerad att skicka en Tab tecken imellan varje värde den har mät Av. Så det blir nog första exemplet du gav mig.

 

Och sen ska jag nu lägga in för att få dynamiska grafen sen är klart.... inte världens mest avacerade redovisnings program men den får duga :P

 

Tack än en gång för hjälpen.

 

Med vänliga hälsningar

Peter Möller

 

Link to comment
Share on other sites

För att vara helt ärlig så hänger jag inte helt med.

 

Formeln i punkt 1.

Vart ska den skrivas och vad referar den till ?!...

 

För jag vill att medan fler Siffror mattas in i tabellen så ska diagramet uppdateras för varje ny Test omgång.

Ex

A----B

5----3 Dia.Upt

2----2 Dia.Upt

9----4 Dia.Upt

2----4 Dia.Upt

1----6 Dia.Update

 

 

Så att man kan se den växa.

 

 

 

Link to comment
Share on other sites

Punkt 1 vara bara en liten beskrivning av formeln...

 

 

Skapa namngivna referenser med varianter av formeln i punkt 1 son anger de områden du önskar. När du skapat namnet kan du se vart formeln/namn et referera genom att klicka på formeln i "skapa-namn-dialogen". Då markeras området på arket namnet/formeln anger.

 

ja, det är lite klurigt att förstå vad det är man gör, men testa så ska du nog få ihop det.

 

Se även den bifogade bilden, den borde göra det någorlunda klart för dig.

 

Edit:

Du ska givetvis anpassa formeln så att referensen

Blad1!$A$1

är första cellen i tabellen på ditt blad.

Och mmh, formlen kan ju egentligen skrivas om till enklare:

=FÖRSKJUTNING(Blad1!$A$2;0;0;ANTALV(Blad1!$A:$A))

där då Blad1!$A$2 är första cellen med värde/index i och ej rubrikraden på tabellen.

 

 

 

/T

 

Even when we know we´ll never find the answers, we have to keep on asking questions.

 

[bild bifogad 2006-01-02 16:42:45 av Monshi]

 

[inlägget ändrat 2006-01-02 16:46:39 av Monshi]

789362_thumb.jpg

Link to comment
Share on other sites

För alternativ pedagogik kan du kolla direkt hos Monshis och min husgud:)

http://www.xldennis.com/diagram.htm

 

Eller en omskrivning (fler input kan ju göra det tydligare, eller bara skapa förvirring... eller, ähh, det tar emot att kasta något man skrivit bara för att man missade en post)

 

Namngivet område= infoga->namn->definiera (det är alltså där förskjutningsformeln skall in)

 

I normalfallet så används det för att ge ett område ett begripligt namn, men luriga typer som Monshi och Dennis kan skriva in en formel istället (se nedan) och få ett anpassningsbart område

 

*********************************************

FÖRSKJUTNINGS-formeln är bara ett sätt att skapa en dynamisk adress

 

FÖRSKJUTNING(ref;rader;kolumner;höjd;bredd)

 

ref= startpunkten och din fasta punkt (Blad1!$A$1)

 

rader= en förskjutning av startpunkten med en rad (om du tittar på Dennis sida så har han valt att starta i A2 och struntar i förskjutningen istället). Smaksak

 

kolumner= en "ickeförskjutning" med noll steg = 0

 

höjd = Det fjärde argumentet är det listiga. Du räknar helt enkelt hur många ifyllda celler det finns i kolumnen (-1 för radrubriken). Sen flyttas slutet av området ner så många steg.

ANTALV(Blad1!$A:$A)-1) = hur många värden finns det i kolumn A (-1)

 

bredd= kan lämnas tom eller =1

 

 

*********************************************

Skapa figuren som vanligt, SEN klickar du på staplarna, i formelfältet står det nu någonting i stil med:

=SERIE(;Blad1!$A$2:$A$6;Blad1!$B$2:$B$6;1)

 

Ändra det så att det följer Monshis exempel;

=SERIE(;Bok1!grIndex;Bok1!grVärden1;1)

 

(av någon anledning kan det omvandlas till vanliga adresser om man går in den "riktiga" vägen. vet inte varför)

 

Link to comment
Share on other sites

Archived

This topic is now archived and is closed to further replies.



×
×
  • Create New...