Just nu i M3-nätverket
Gå till innehåll

Hur får jag VBA att fungera interaktivt med Excel dvs ta in markerade celler, utföra beräkning, skriva ut dem på Excelbladet


Marjatta

Rekommendera Poster

Hej alla proffs :)

Jag har ett problem som jag inte hittar lösning på. Det jag försöker göra är att i ett excelblad markera en cell som har ett siffervärde. Det värdet ska användas  i makrot för att räkna upp värdet i de celler som sedan markeras. Man ska kunna markera åt alla håll, höger, vänster, upp och ner.

Har inte så stora kunskaper i VBA, har fått cellerna i markeringen att räkna upp om jag hårdkodar siffran som egentligen ska hämtas från bladet och bara markerar nedåt. Koden fungerar haltande minst sagt :(

Skulle verkligen uppskatta lite hjälp på traven!

 

Sub valjSiffra()
    Dim tnr As Integer
    MsgBox ("Välj siffra")
    tnr = ActiveCell                                            /* Hur får jag tnr vidare till Private Sub?
    MsgBox ("Markera")
    
End Sub
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Dim x As Long
    Dim i As Integer
    Dim tnr As Integer
   
        x = Target.Cells.Count
        For i = 0 To x - 1
            If ActiveCell = "Klar" Then Exit Sub
            MsgBox (x)
            ActiveCell.Offset(i) = (i + 1) * tnr    /* Här är tnr tomt, men jag får rätt antal nollor iaf
    
        Next i
   
End Sub
 

Länk till kommentar
Dela på andra webbplatser

Jag skulle nog rekommendera dig att

 

1: Sätt tnr som en global variabel, dvs definiera den först av alla i modulen.

 

2: I SelectionChange, gör en första koll på tnr-värdet, om tnr = 0 avsluta. Så lite kod som möjligt för att terminera exekveringen.

 

3: i SelectionChange, använd Target, inte ActiveCell.

Ja skriv helt enkelt

Dim tnr as Interger

Sub valjSiffra()
    tnr = 0
    On Error Resume Next 'om cellen inte har ett talvärde
    MsgBox ("Välj siffra")
    tnr = ActiveCell.Value 
    If tnr = 0 Then Exit sub                                       
    MsgBox ("Markera")
    
End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Dim x As Long
    Dim i As Integer
    Dim myCell As Range
    On Error Resume Next 'du vill inte få fel i denna funktion
   If tnr = 0 Then Exit Sub
   
        
        For Each Mycell in Target
            If MyCell = "Klar" Then 
               tnr = 0
               Exit Sub
            End If  
            Target = Target + tnr
            
    
        Next myCell
   
End Sub

Om jag nu förstod vad du önskar korrekt.

dvs att du markerar en cell med ett värde i.

Detta värde ska sedan läggas till alla celler du markerar fram till att du markerar med värdet Klar i.

 

Det finns bättre sätt att göra detta på tror jag nog, man ska helst undvika händelsefunktionerna.

Länk till kommentar
Dela på andra webbplatser

Eventmacro är svåra. Lätt att dem körs av misstag och när det gäller macro så går det inte att backa med ångra-knappen.

 

Om du inte tvunget skall använda macro så kan du göra enligt nedan.

 

1. Markera cellen som du ska kopiera till andra celler.

2. Kopiera

3. Markera cellområdet som du ska kopiera till.

3. Klistra in special och välj addera.

4. Klart.

Länk till kommentar
Dela på andra webbplatser

Jag skulle nog rekommendera dig att

 

1: Sätt tnr som en global variabel, dvs definiera den först av alla i modulen.

 

2: I SelectionChange, gör en första koll på tnr-värdet, om tnr = 0 avsluta. Så lite kod som möjligt för att terminera exekveringen.

 

3: i SelectionChange, använd Target, inte ActiveCell.

Ja skriv helt enkelt

Dim tnr as Interger

Sub valjSiffra()
    tnr = 0
    On Error Resume Next 'om cellen inte har ett talvärde
    MsgBox ("Välj siffra")
    tnr = ActiveCell.Value 
    If tnr = 0 Then Exit sub                                       
    MsgBox ("Markera")
    
End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Dim x As Long
    Dim i As Integer
    Dim myCell As Range
    On Error Resume Next 'du vill inte få fel i denna funktion
   If tnr = 0 Then Exit Sub
   
        
        For Each Mycell in Target
            If MyCell = "Klar" Then 
               tnr = 0
               Exit Sub
            End If  
            Target = Target + tnr
            
    
        Next myCell
   
End Sub

Om jag nu förstod vad du önskar korrekt.

dvs att du markerar en cell med ett värde i.

Detta värde ska sedan läggas till alla celler du markerar fram till att du markerar med värdet Klar i.

 

Det finns bättre sätt att göra detta på tror jag nog, man ska helst undvika händelsefunktionerna.

Tack för ett snabbt svar men jag har fortfarande problem. Värdet i tnr följer inte med till Private Sub (har testat i direktfönstret) och jag får bara den övre suben att exekvera, dvs välja siffra och markera sen händer inget mer... Deklarerade tnr som public men det hjälpte inte. :(

Jag måste ha detta i ett makro för användaren kan inte excel. Detta är bara en del av programmet.

Länk till kommentar
Dela på andra webbplatser

Ett stavfel av mig.

Dim tnr As Integer

ska det stå på första raden. Inget annat.

Och denna kod, allt detta, ska ligga på det blad som koden ska köras på.

 

Fungerar, ivartfall för mig. men som sagt, man bör undvika händelsefunktionerna om man kan.

Länk till kommentar
Dela på andra webbplatser

  • 1 month later...

Tack för hjälpen!

Har fått det att fungera.

Finns det något enkelt sätt att kontrollera om intilliggande cell, kan vara ovanför eller till höger eller vänster om min markering, har ett siffervärde?

Länk till kommentar
Dela på andra webbplatser

Ett sätt är

IsNumeric(.Offset(, -1)) And .Offset(, -1) <> ""

för att kolla till vänster om given referens.

tom cell, dvs "", betraktar excel som nollvärde därav andra kontrollen.

Länk till kommentar
Dela på andra webbplatser

Arkiverat

Det här ämnet är nu arkiverat och är stängt för ytterligare svar.



×
×
  • Skapa nytt...