Onclick i Excel VBA

stemmer
20

Er det en måte å fange et klikk på en celle i VBA med Excel? Jeg er ikke henvise til Worksheet_SelectionChangehendelsen, som det ikke vil utløse flere ganger hvis cellen blir klikket flere ganger. BeforeDoubleClickløser ikke mitt problem heller, så jeg ønsker ikke å kreve at brukeren å dobbeltklikke at requently.

Min nåværende løsningen fungerer med SelectionChangearrangementet, men det ser ut til å kreve bruk av globale variabler og andre suboptimale koding praksis. Det synes også utsatt for feil.

Publisert på 07/10/2008 klokken 12:34
kilden bruker
På andre språk...                            


6 svar

stemmer
0

Jeg tror ikke det. Men du kan lage en form objekt (eller WordArt eller noe lignende) krok Klikk-hendelsen og plassere objektet til posisjonen av den angitte cellen.

Svarte 07/10/2008 kl. 12:42
kilden bruker

stemmer
1

Endre er tilfelle innebygd i Excel Object modell for dette. Det bør gjøre akkurat som du vil, skyte noen gang brukeren klikker hvor som helst ...

Jeg er ikke sikker på at jeg forstår dine innvendinger til globale variabler her, vil du bare trenger en hvis du bruker Application.SelectionChange hendelsen. Men ville du ikke trenger noen hvis du bruker den arbeidsbok klassekoden bak (for å felle Workbook.SelectionChange hendelse) eller regneark klassekoden bak (for å felle den Worksheet.SelectionChange) hendelse. (Med mindre problemet er "global variabel reset" problem i VBA, for der er det bare en løsning: feilhåndtering overalt Ikke la alle ubehandlede feil, i stedet logge dem og / eller "soft-rapporten" en feil som en melding. boksen for brukeren.)

Du må kanskje også å felle Worksheet.Activate () og Worksheet.Deactivate () hendelser (eller tilsvarende i arbeidsbok klasse) og / eller Workbook.Activate og Workbook.Deactivate () hendelser, slik at du vet når brukeren har byttet regneark og / eller arbeidsbøker. The Window aktivere og deaktivere hendelser bør gjøre denne tilnærmingen fullført. De kan alle kalle de samme prosedyre, men de alle betegne det samme: brukeren endret "fokus", om du vil.

Hvis du ikke liker VBA, btw, kan du gjøre det samme ved hjelp av VB.NET eller C #.

[Edit: DBB gjør et meget godt poeng om endre hendelsen ikke plukke opp et klikk når brukeren klikker innenfor de valgte cellene. Hvis du trenger å plukke det opp, så du vil trenge å bruke subclassing.]

Svarte 07/10/2008 kl. 16:26
kilden bruker

stemmer
5

For å felle gjentatte klikk på samme celle, må du flytte fokus til en annen celle, slik at hver gang du klikker, du er faktisk å flytte valget.

Koden nedenfor vil velge det øverste venstre celle synlig på skjermen, når du klikker på en hvilken som helst celle. Selvfølgelig har den svakhet at det ikke vil felle et klikk på cellen øverst til venstre, men som kan styres (for eksempel ved å velge høyre cellen hvis activecell er øverst til venstre).

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
  'put your code here to process the selection, then..
  ActiveWindow.VisibleRange.Cells(1, 1).Select
End Sub
Svarte 07/10/2008 kl. 20:27
kilden bruker

stemmer
19

Klart, det er ingen perfekt svar. Men hvis du vil tillate brukeren å

  1. velge bestemte celler
  2. tillate dem å endre disse cellene, og
  3. felle hvert klikk, selv gjentatte klikk på samme celle,

så den enkleste måten synes å være å flytte fokuset bort den valgte cellen, slik at å klikke på den vil utløse en Velg hendelse.

Ett alternativ er å flytte fokus som jeg antydet ovenfor, men dette hindrer celle redigering. Et annet alternativ er å utvide utvalget av én celle (venstre / høyre / opp / ned), fordi dette tillater redigering av den opprinnelige cellen, men vil utløse en Velg hendelse hvis den cellen er klikket igjen på egen hånd.

Hvis du bare ønsket å felle valg av en enkelt kolonne med celler, kan du sette inn en skjult kolonne til høyre, utvide utvalget til å omfatte den skjulte cellen til høyre når brukeren klikket, og dette gir deg en redigerbar celle som kan være fanget hver gang den blir klikket. Koden er som følger

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
  'prevent Select event triggering again when we extend the selection below
  Application.EnableEvents = False
  Target.Resize(1, 2).Select
  Application.EnableEvents = True
End Sub
Svarte 08/10/2008 kl. 05:38
kilden bruker

stemmer
0

Dette har fungert for meg .....

Private Sub Worksheet_Change(ByVal Target As Range)

    If Mid(Target.Address, 3, 1) = "$" And Mid(Target.Address, 2, 1) < "E" Then
       ' The logic in the if condition will filter for a specific cell or block of cells
       Application.ScreenUpdating = False
       'MsgBox "You just changed " & Target.Address

       'all conditions are true .... DO THE FUNCTION NEEDED 
       Application.ScreenUpdating = True
    End If
    ' if clicked cell is not in the range then do nothing (if condttion is not run)  
End Sub

Merk: Denne funksjonen er i bruk omregnet en dreiebord hvis en bruker lagt et element i en dataområde av A4 til D500. De ble det beskyttede og ubeskyttede deler i arket slik at den faktiske sjekk for klikk er hvis kolonnen er mindre at "E" Logikken kan få så komplisert som du ønsker å inkludere eller ekskludere en rekke områder

block1  = row > 3 and row < 5 and column column >"b" and < "d" 
block2  = row > 7 and row < 12 and column column >"b" and < "d" 
block3  = row > 10 and row < 15 and column column >"e" and < "g"

If block1 or block2 or block 3 then
  do function .....
end if  
Svarte 13/10/2008 kl. 19:25
kilden bruker

stemmer
0

Jeg hadde et lignende problem, og jeg fikset ved å kjøre makro "i tide", og ved hjelp av noen globale variabler å bare kjøre når brukeren har stoppet å klikke.

Public macroIsOnQueue As Boolean
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    macroIsOnQueue = False
    Application.OnTime (Now() + TimeValue("00:00:02")), "addBordersOnRow"
    macroIsOnQueue = True
End sub
Sub addBordersOnRow()
    If macroIsOnQueue Then        
       macroIsOnQueue = False
       ' add code here
    End if
End sub

På denne måten når brukeren endrer utvalget innen 2 sekunder, macroIsOnQueue variabelen satt til false, men den siste tiden utvalget endres, macroIsOnQueue er satt til sann, og makroen vil kjøre.

Håper dette hjelper, ha det gøy med VBA !!

Svarte 25/05/2018 kl. 11:12
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more