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

Felkod: duplicate declaration in currant scope


Viktor79

Rekommendera Poster

 

Hej.

Jag försöker göra en lista med endast unika värden, men får ovan felkod. Kan ngn hjälpa mig att se vad som är fel? Ska man inte ange returvärdet med samma namn som funktionen?

 

 

Function getpivot()

 

col = ActiveCell.Column

Range("activecell.column&2,activecell.column&Project").Select

j = 0

Selection.Copy

Sheets("pivot").Select

Cells(2, col).Select

Selection.Paste

Cells(2, col).Select

Do Until ActiveCell.value = ""

If StrComp(ActiveCell.Offset(1, 0).value, ActiveCell.value) = 0 Then

ActiveCell.Offset(1, 0).Select

Selection.Delete Shift:=xlUp

End If

j = j + 1

Loop

Dim getpivot As Range

Set getpivot = Range(Cells(2, col), Cells(j, col))

 

End Function

 

Länk till kommentar
Dela på andra webbplatser

Du ska inte deklarera retur-variabel som du försöker. Du har ju redan gjort det iochmed deklararingen av funktionen.

 

Sedan - undvik Select -satser. Arbeta internent med direktadressering av cellerna. Finns inget behov av att välja cellerna.

 

Och - unik lista, varför inte nytta Avancerat filter?

 

 

/T

 

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

 

Länk till kommentar
Dela på andra webbplatser

avancerat filter. Det låter smartare.

 

Finns det ngn bra metod för det?

 

Det borde inte behöva skrivas så många rader om det finns

 

Länk till kommentar
Dela på andra webbplatser

Spela in när du testar ett avancerat filter så får du koden på köpet.

 

Låt oss börja med det, men fråga gärna om du går bet.

 

Du hittar filtret i menyn Data -> Filter

 

/T

 

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

 

Länk till kommentar
Dela på andra webbplatser

Det blev utmärkt. Nu ska jag bara försöka få över det till min combobox.

 

Koden blev

 

Range("C2:C92").AdvancedFilter Action:=xlFilterInPlace, Unique:=True

 

Måste själva filtreringen ske i excel eller räcker det att ta en spegelbild och filtrera den och skicka som range till comboboxen?

 

En fråga till, hur tar man bort filtret från excel?

 

Länk till kommentar
Dela på andra webbplatser

Två sätt finns att få in värdena i din box.

1: Filtrerar till annan plats och ange denna plats som källa för din box

2: Stega igenom de synliga cellerna i din lista och lägg till dem till din box.

 

Enkelt och snabbt exempel på det sistnämnda:

    Dim myRn As Range
   Set myRn = Me.Range("a1:A10")
   myRn.AdvancedFilter xlFilterInPlace, , , True
   Dim myValues() As Variant
   ReDim myValues(myRn.SpecialCells(xlCellTypeVisible).Rows.Count)
   myValues = myRn.SpecialCells(xlCellTypeVisible).Value
   Me.ComboBox1.List() = myValues
   ActiveSheet.ShowAllData

Går givetvis även att stega genom cellerna i myRn med en For each-sats.

 

Koden körd på det arbetsblad som boxen finns, därav Me-referensen.

 

 

/T

 

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

 

Länk till kommentar
Dela på andra webbplatser

Angående arbetsblad, antar att du menar workbook. Ska jag skriva i denna kod i workbook eller userform? Jag har comboboxen i userform. I workbook har jag inte skrivit ngt mer än

 

Private Sub Workbook_Open()

 

Application.Visible = False

 

Load UserForm1

UserForm1.Show

End Sub

 

Länk till kommentar
Dela på andra webbplatser

Då gör vi om den lite:

With Worksheet("Blad1")
Dim myRn As Range
Set myRn = .Range("a1:A10")
myRn.AdvancedFilter xlFilterInPlace, , , True
Dim myValues() As Variant
ReDim myValues(myRn.SpecialCells(xlCellTypeVisible).Rows.Count)
myValues = myRn.SpecialCells(xlCellTypeVisible).Value
Me.ComboBox1.List() = myValues
.ShowAllData
End With

 

Placera denna i UserForm.Initialize eller i rutin i UserForm modulen som anropas från från Initialize. "Me" i detta fallet hänvisar till ditt UserForm ochh sista raden, .ShowAllData, tar bort filtret.

 

 

/T

 

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

 

Länk till kommentar
Dela på andra webbplatser

Hej igen. jag har nu lagt in koden. gjorde följande ändring

 

Dim myRn1 As Range

Set myRn1 = Range("B2:B" & Project)

myRn1.AdvancedFilter xlFilterInPlace, , , True

Dim myValues1() As Variant

ReDim myValues1(myRn1.SpecialCells(xlCellTypeVisible).Rows.Count)

myValues1 = myRn1.SpecialCells(xlCellTypeVisible).value

ComboBox2.List() = myValues1

Sheets("projektlista").ShowAllData

 

och la den i initialize direkt oxo döpte jag om myRn och MyValues till 1, 2 osv för jag har flera comboboxar som ska fylllas. Men jagg får inte in rätt lista. Det är flera likadana värden och för varje combobox som fylls blir antalet värden färre och färre.

 

Är det fler variabler än myRn och myValue som måste sttas en siffra på efteråt och är det ngt annat som måste ändras esom jag tagit bort with. funktionen ?

 

Länk till kommentar
Dela på andra webbplatser

Är det flera listor som ska initieras kan du utan problem återanvända myRn och myValues med värdena från de nya sorteringarna.

 

Grundläggande rådet när man programmerar är att samma kod ska aldrig förekomma på två ställen, all kod ska vara mer eller mindre unik. Dvs i ditt fall skulle jag skapa en funktion i ditt UserForm som tar som argument cellområdet som ska filtreras och boxen som ska fyllas.

 

Då blir det enkelt att hela tiden se till att det fungerar och koden i din initialize blir renare och enklare att följa.

Nämen oj - inser att liten del av den kod jag gav var helt onödig så exemplet blir väldigt kort och fint nu:

Sub FillList(source As Range, box As ComboBox)
   source.AdvancedFilter xlFilterInPlace, , , True
   box.List() = source.SpecialCells(xlCellTypeVisible).Value
   source.Parent.ShowAllData
End Sub

så ser koden ut för att fylla en ComboBox. Egentligen går den nog att göra generell så att den accepterar även ListBoxar, de fungerar på samma sätt vad gäller detta. Men det låter vi vara.

Sedan anropar du den med:

FillList Blad1.Range("a1:A8"), Me.ComboBox1

ex.v.

 

Snyggt och enkelt. Givetvis - du kanske ska sortera på annat vis/ta annat data. Då får du anpassa funktionen så att den kan ta de argument som krävs. Kanske det inte passar med en funktion om variationen är stor men det borde gå.

 

 

/T

 

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

 

Länk till kommentar
Dela på andra webbplatser

Ja det blev genast snyggare kod.

 

Dock funkar det inte riktigt fortfarande. Den första comboboxen tar de 6 värdena, nästa tar de första 3 och den sista tar de första 2.

 

Är det ngt i filtreringskoden som inte blir rätt tro, eller har jag ngn pekare åt fel kolumn?

 

Länk till kommentar
Dela på andra webbplatser

Nog fel i sorteringen. Sätt en brytpunkt och stega och ta en titt på hur det ser ut på arket innan importen till boxarna.

 

Jag har ju ingen aning om hur dina data egentligen ser ut.

 

 

/T

 

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

 

Länk till kommentar
Dela på andra webbplatser

OK. Ska göra det.

 

Hur skriver jag för att sätta en sådan brytpunkt

 

Länk till kommentar
Dela på andra webbplatser

Ta en titt under menyn felsökning i VBA-editorn. Eller enklast - klicka på gråa listen i vänsterkanten på text-ytan i VBA-editorn så infogas en brytpunkt på den raden du anger.

 

Sedan kan man stega och undersöka variabler och annat. Mycket användbart och en grund i all programmering.

 

 

/T

 

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

 

Länk till kommentar
Dela på andra webbplatser

Det vill sig inte.

 

Är denna metoden rätt om det är text i cellerna?

 

Länk till kommentar
Dela på andra webbplatser

Ny gren;

Vi kanske ska rekapitiulera och börja om från början. Den enkla frågan är då:

Vad är det du vill göra? Vad är det för data, vad vill du göra med det?

 

Det verkar ju som om den gren jag barkat in på inte riktigt ger det resultat du önskar.

 

 

/T

 

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

 

Länk till kommentar
Dela på andra webbplatser

OK det är så här.

 

Jag har en lista med en massa projekt. Till denna listan finns info såsom vilket land, ansvarig person, vilkeet företag osv. Det finns flera projekt med samma person och land, men dessa data ska in i en combobox endast en gång så man kan sortera listan efter namn och land osv.

 

Länk till kommentar
Dela på andra webbplatser

Du ska in detta data i ett UserForm?

 

Annars kan ett vanligt Autofilter vara ett alternativ.

 

Kan annars titta lite på det senare. Du har alltså, säg, poster över flera kolumner. Varje post, i en kolumn, kan förekomma flera gånger, ex.v. namn på en person eller ett land. Du vill sortera ut alla unika länder in i en combobox, sedan alla unika personer givet landsorteringen till en annan box?

Eller är det bara unika namn, oavsett land, du vill få fram?

 

 

/T

 

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

 

Länk till kommentar
Dela på andra webbplatser

Nej det är precis så, unika namn in i en box, unika land i en annan osv

 

Länk till kommentar
Dela på andra webbplatser

jag tror det går att använda ungefär samma kod, men att man får ändra ngt i filtreringen

 

Länk till kommentar
Dela på andra webbplatser

Om jag nu förstått dig korrekt så bör det jag testat vara applicerbart:

 

I A1:A12 har jag en mängd företagsnamn

I B1:B12 har jag en mängd personnanm.

 

Vill få ut alla unika företagsnamn och alla unika personamn till varsin combobox.

 

Kör koden jag tidigare givit och, voila!, det fungerar!

Så jag måste missa något?

 

Dvs exakt det jag testa var:

Sub test()
   FillList Me.Range("A1:A12"), Me.ComboBox1
   FillList Me.Range("B1:B12"), Me.ComboBox2
End Sub

Sub FillList(source As Range, box As ComboBox)
source.AdvancedFilter xlFilterInPlace, , , True
box.List() = source.SpecialCells(xlCellTypeVisible).Value
source.Parent.ShowAllData
End Sub

 

 

/T

 

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

 

Länk till kommentar
Dela på andra webbplatser

jag skriver FillList Me.Range("A:A"& räknare), Me.ComboBox1

 

i boxarna får jag några av de första värdena i listan. Flera är samma värde

 

 

Länk till kommentar
Dela på andra webbplatser

korrektion

 

jag skriver FillList Me.Range("A1:A"& räknare), Me.ComboBox1

 

Länk till kommentar
Dela på andra webbplatser

Och hur ser det ut på arbetsbladet efter filtreringen? Har den filtrerat rätt område? Testa med en brytpunkt.

 

 

/T

 

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

 

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...