17. december 2015 - 20:52Der er
11 kommentarer og 1 løsning
Returnere flere værdier
Hej eksperter
Jeg mangler en løsning til følgende:
Ark 2: er en database og indeholder i kolonne B en dato (som fremkommer flere gange) og i kolonne F en postnummer. Ark 1: Kolonne C, f.eks. celle C5 indeholder en dato og i celle D5 vil jeg gerne have overført alle postnumre fra Ark 2. Dvs. den skal søge på alle rækker med pågældende dato og returnere postnumre fra kolonne D. Postnumre kan gentage sig inden samme dato. Det ville være fantastisk hvis man kunne undlade at hente dobbelt værdierne, kan det ikke lade sig gøre er det også fint.
Sådan se det ud
Ark 2: B F Date Postcode 02.11.2015 9280 02.11.2015 7700 02.11.2015 7752 03.11.2015 7752 03.11.2015 9830 03.11.2015 9830 04.11.2015 9560 04.11.2015 9640
Sådan skal resultatet se ud: Ark 1: C D 02.11.2015 9280; 7700; 7752 03.11.2015 7752; 9830 04.11.2015 9560; 9640
Public Function FindDatoer(Varenummer, Dataomrade As Range) As Variant Application.Volatile Data = Dataomrade For i = 1 To UBound(Data) If Data(i, 1) = Varenummer Then FindDatoer = FindDatoer & Data(i, 2) & ";" End If Next End Function
Function GetStrElement(s As String, n As Integer) As String GetStrElement = Replace(Split(s, ";")(n - 1), "", "") End Function
Kald den ved at skrive =Finddatoer i en celle
=finddatoer(C5;Ark1!B:F)
OBS! den performer ikke super godt hvis der er rigtig data :/
Sub HentPostNumre() Dim LastRowColC, LastRowColB, x, k, l As Integer Dim Temp As String Dim y As Long Temp = "" LastRowColC = Range("C65536").End(xlUp).Row LastRowColB = Sheets("Sheet2").Range("B65536").End(xlUp).Row k = 2 For x = 2 To LastRowColC y = Cells(x, 3) If Application.CountIf(Sheets("Sheet2").Range("B:B"), y) > 0 Then k = Application.Match(y, Sheets("Sheet2").Range("B:B"), 0) For Z = 2 To LastRowColB If Sheets("Sheet2").Cells(Z, 2) = y _ And Application.CountIf(Sheets("Sheet2").Range(Sheets("Sheet2").Cells(k, 6), _ Sheets("Sheet2").Cells(Z, 6)), Sheets("Sheet2").Cells(Z, 6)) = 1 Then Temp = Temp & "; " & Sheets("Sheet2").Cells(Z, 6) End If Next End If If Len(Temp) > 0 Then Temp = Right(Temp, Len(Temp) - 2) End If Cells(x, 4) = Temp Temp = "" Next End Sub
Så svært er det ikke med makroer. Kopier hele makroen, højreklik på fanebladet (Ark1), vælg Vis koder og indsæt den dem. Du kan køre makroen ved at vælge Vis - Makroer - Vis makroer og så køre den derfra. Eller du kan indsætte en knap, og linke den til makroen.
En lille detalje jeg glemte: Hvad hedder dine ark? Ark1/Ark2 eller Sheet1/Sheet2? I min makro hedder de Sheet1 og Sheet2 og det skal rettes i makroen hvis dine hedder Ark1/Ark2. Jeg gør det gerne for dig, så du kan kopiere hele makroen på en gang.
Jeg har nu udskiftet "Sheet 2" med "Sl.62" i makroen og har sat den ind - der sker dog ingenting i regnearket.
Men det ikke slutter her. Jeg har også Ark 3, som hedder "Sl.5688" - den sat op identisk til "Sl.62" Postnumrene fra denne ark skal hentes i ark "Postcode" i celle D30 og ned. Dvs. at D1:D29 skal referere til "Sl.62" og D30:D59 skal referere til "Sl.5688"
Synes du stadig det kan løses med makro? Jeg må indrømme jeg er mere tilhænger af formler, så har jeg også en chance for tilpasse/rette dem hvis der opstå behov :-)
Jeg har lavet makroen om, så den kører automatisk hver gang du sætter en dato ind i kolonne C på Ark1. Kopier hele makroen og sæt den ind under vis koder (højreklik på Ark1)
Private Sub Worksheet_Change(ByVal Target As Range) If Not Intersect(Target, Range("C:C")) Is Nothing Then Dim LastRowColC, LastRowColB, x, k, l As Integer Dim Temp As String Dim y As Long Temp = "" Range("D2:D60").ClearContents LastRowColB = Sheets("Sl.62").Range("B65536").End(xlUp).Row k = 2 For x = 2 To 29 y = Cells(x, 3) If Application.CountIf(Sheets("Sl.62").Range("B:B"), y) > 0 Then k = Application.Match(y, Sheets("Sl.62").Range("B:B"), 0) For Z = 2 To LastRowColB If Sheets("Sl.62").Cells(Z, 2) = y _ And Application.CountIf(Sheets("Sl.62").Range(Sheets("Sl.62").Cells(k, 6), _ Sheets("Sl.62").Cells(Z, 6)), Sheets("Sl.62").Cells(Z, 6)) = 1 Then Temp = Temp & "; " & Sheets("Sl.62").Cells(Z, 6) End If Next End If If Len(Temp) > 0 Then Temp = Right(Temp, Len(Temp) - 2) End If Cells(x, 4) = Temp Temp = "" Next Temp = "" LastRowColB = Sheets("Sl.5688").Range("B65536").End(xlUp).Row k = 2 For x = 30 To 59 y = Cells(x, 3) If Application.CountIf(Sheets("Sl.5688").Range("B:B"), y) > 0 Then k = Application.Match(y, Sheets("Sl.5688").Range("B:B"), 0) For Z = 2 To LastRowColB If Sheets("Sl.5688").Cells(Z, 2) = y _ And Application.CountIf(Sheets("Sl.5688").Range(Sheets("Sl.5688").Cells(k, 6), _ Sheets("Sl.5688").Cells(Z, 6)), Sheets("Sl.5688").Cells(Z, 6)) = 1 Then Temp = Temp & "; " & Sheets("Sl.5688").Cells(Z, 6) End If Next End If If Len(Temp) > 0 Then Temp = Right(Temp, Len(Temp) - 2) End If Cells(x, 4) = Temp Temp = "" Next End If End Sub
Det er nok makrosikkerheden der er sat således at makroer ikke accepteres. Det kan du ændre under Udvikler - Makrosikkerhed. Her skal du vælge en af de tre nederste valgmuligheder. Jeg bruger selv Deaktiver alle makroer med meddelelse.
Arket sendt retur. Problemet lå i datoen, som ikke var formateret som dato. Og makroen så den derfor som en tekststreng
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.