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

Namn med många ej sammanhängande celler


short

Rekommendera Poster

Jag vill kunna ge samma namn till ett stort antal celler som inte hänger ihop (kanske 600 ytor där varje yta kan ha upp till 50 celler). Syftet är att när man klickar på någon av dessa celler ska en bearbetning ge värden i ett antal celler.

Problemet är att namnhanteraren inte "orkar" med så många ytor. Finns det något sätt att gå runt detta?

Länk till kommentar
Dela på andra webbplatser

Skapa flera mindre fält och numrera dem.

Då kan du enkelt i VBA stega igenom de olika namnen.

exempelvis

myArea1

myArea2

 

Tror det är bästa lösningen.

Länk till kommentar
Dela på andra webbplatser

Private Sub Worksheet_Change(ByVal Target1 As Range)
Dim a As Integer
Dim Område As Range
Dim cell As Range
Set Område = Range("Nyckel1")
Set cell = Target1
Dim Z As Integer


If Not Intersect(Target1, Område) Is Nothing Then
    If Not IsNumeric(Target1) Then
            For a = 1 To 12
                On Error Resume Next
                Range(cell.Address).Offset(0, a) = ""
            Next a
        Exit Sub
    End If
    If Target1 = "" Then
            For a = 1 To 12
                On Error Resume Next
                Range(cell.Address).Offset(0, a) = ""
            Next a
        Exit Sub
    End If
End If

If Not Intersect(Target1, Område) Is Nothing Then
        If Target2 > 20 Then
            MsgBox "Det finns bara 20 periodiseringssträngar"
            Exit Sub
        End If
        If Target1 < 1 Then
            MsgBox "Man måste välja en nyckel 1-20 "
            Exit Sub
        End If
   
    Z = 0
    For a = Z To 11
        Range(cell.Address).Offset(0, a + 1) = _
        Application.WorksheetFunction.VLookup(Target1, Sheets("Timplanering helår").Range("Tabell"), a + 2, False) * Range(cell.Address).Offset(0, -2)
    Next a
           
End If

End Sub

Så ser min kod ut och området "Nyckel1" är det stora icke sammanhängande området. Hur menar du att man kan numrera fälten och få ihop det till ett fält?

Länk till kommentar
Dela på andra webbplatser

Är det så här du menar?

Names.Add Name:="Huvudnyckel", RefersTo:=Application.Union(Range("Nyckel1"), Range("Nyckel2"))
Set Område = Range("Huvudnyckel")
Länk till kommentar
Dela på andra webbplatser

Skapar du namnen manuellt i namnhanteraren eller skapar du dem via kod?

 

jag antar att du skapat dina områden manuellt/att de redan är skapade.

 

Det jag menar är att du kan döpa dina området till, som i ditt exempel, Nyckel1, Nyckel2 osv.

Då kan du med enkel For-sats stega igenom dem

For i = 1 to 10
    set rnTarget = Me.Range("Nyckel" & i)
    .... din kod
Next i

Tips: Flytta ut så mycket som möjligt av din kod i en egen procedur, ha den inte i händelsefunktionen.

ha bara rudimentär kontroll i händelsefunktion, skicka sedan vidare.

Enklare att felsöka om du kan exempelvis initiera händelsen via en knapp istället för klicka på bladet.

Länk till kommentar
Dela på andra webbplatser

Jo jag har skapad dem manuellt i namnhanteraren (eftersom jag inte klarade att göra det maskinellt-tips?). Sedan gör jag så här:

Names.Add Name:="Huvudnyckel", RefersTo:=Application.Union(Range("Nyckel1"), Range("Nyckel2"), Range("Nyckel3"), Range("Nyckel4") _
, Range("Nyckel5"), Range("Nyckel6"), Range("Nyckel7"), Range("Nyckel8"), Range("Nyckel9"))

Det fungerar. Att initiera via knapp är knappast något alternativ. Det handlar om att med periodiseringsnycklar fördela en persons tid på årets månader för ett projekt. Projekten är ca 100 och det är 50 personer så det skulle bli ett massivt knapptryckande. 

Länk till kommentar
Dela på andra webbplatser

Nja, det jag menade var att du under utvecklingen kan initiera via knapp så att du slipper att funktionen startar lite då och då sant att det är bra att separerar händelsen och koden, dvs lägga koden i en funktion som händelsen anropar.

 

 

Din lösning fungerar den med, det är som vanligt att det finns mer än ett sätt att lösa det på.

Och att skapa dem manuellt är nog enklast om det nu inte finns en periodisering i vilka celler som ska vara med, då kan man skapa kod.

 

Mitt vanliga råd vad gäller händelsefunktion är att man bör undvika dem så långt det bara går. Om man ändå implementerar en av dem:

  • Se till att med så få rader kod som möjligt ta dig ur funktionen om den inte ska agera.
  • Se till att all kod har felhanterare, du vill inte att händelsefunktion ska stoppa pga fel.
Länk till kommentar
Dela på andra webbplatser

Tack jag ska ta vara på råden!

Jag skulle kunna skapa "delnamnen" i en sub men jag har inte riktigt fått till koden. Har du något tips?

Länk till kommentar
Dela på andra webbplatser

Hur menar du?

 Skapa delnamnen?

For i = 1 to 10
   Names.Add  "Nyckel" & i RefersTo:= Me.Range(..)
Next i

fast frågan är hur du adresserar rätt område. Går det att räkna fram utifrån föregående område, dvs på värdet på i ska det väl inte vara något problem egentligen. Cells, Offset osv kan passa, kanske resize även.

 

Alternativt att du skapar en dialog som frågar efter område och som sedan skapar ett namn av detta. Snurrar tills du trycker avbryt.

Sub NameMaker()
    Dim i As Integer
    Dim answ As Range
    i = 0
    Do
        i = i + 1
        Set answ = Nothing
        On Error Resume Next
        Set answ = Application.InputBox("Ange område, detta får index " & i, "Nytt nyckelområde", Type:=8)
        On Error GoTo 0
        If Not answ Is Nothing Then
            Names.Add "Nyckel" & i, RefersTo:=answ
        End If
    Loop Until answ Is Nothing
End Sub
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...