Sub soeg() Range("B2:C5").Find(What:="hej", LookIn:=xlFormulas, _ LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _ MatchCase:=False, SearchFormat:=False).Activate End Sub
Der kan du ændre Range("B2:C5) til det område du gerne vil søge i
Jeg får fejlen både i 2003 og 2010 og ja, det er fordi den ikke finder værdien "hej".
Allerhelst ville jeg bruge den indbyggede søgefunktion, eller noget tilsvarende da det er vigtigt at modtage en brugervenlig besked hvis værdien ikke bliver fundet.
Desuden har jeg behov for at dialogboksen ikke forsvinder efter hver søgning, men forbliver aktiv, indtil jeg lukker den.
Denne tester med en CountIf om værdi findes Kunne også laves med en Error rutine
Koden søger i A1:D5 efter værdien i den aktive celle Søgeværdien kunne også angives via en input i koden
Sub xFind() x = ActiveCell.Value If Application.CountIf(Range("A1:D5"), x) = False Then MsgBox "Det søgte findes ikke" Exit Sub End If Range("A1:D5").Find(x, LookIn:=xlValues, LookAt:=xlWhole).Select End Sub
Excelent: Den virker og den er faktisk ok smart, men den søger kun i det aktive ark og den søger ikke i værdier som man kan angive i den indbyggede søgeboks!
dt = InputBox("Hvad vil du gerne søge efter?", "Din søgning") Set om = Range("B2:C5")
If Application.CountIf(om, dt) = False Then MsgBox "Findes ikke" Else om.Find(What:=dt, LookIn:=xlFormulas, _ LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _ MatchCase:=False, SearchFormat:=False).Activate End If End Sub
Jeg ønsker at lave gentagne søgninger af forskellige værdier der befinder sig i bestemte områder af et større regneark. Når værdien er fundet, tilføjes en kommentar eller 2, i celler der ligger i umiddelbar nærhed af værdien.
Jeg kan ikke gøre det du nævner da en markering ifm. søgningen forsvinder når værdien er fundet og man har skrevet sin kommentar. Desuden er der er større risiko for at data kan blive slettet hvis store områder konstant er markeret.
Den almindelige søgefunktion er som sådan perfekt da man kan søge på dele af ord og på tværs af projektmappen, men det tager for lang tid. Derfor var kombinationen af nævnte søgefunktion og et bestemt kodet søgeområde en løsning jeg virkelig kunne bruge.
Forslaget fra Excelent med at søge fra et bestemt felt af kan ligeledes bruges, da øverste række i projektmappen er frosset, men som tidligere nævnt skal der kunne søges på tværs af projektmappen og på dele af ord.
Public om As Range ' område der skal tjekkes igennem Public dt As String ' tekst der skal søges efter Public f As String ' første celle der skal søges fra på nye ark Sub soeg() Set om = Range("B2:C14")
dt = InputBox("Hvad vil du gerne søge efter?", "Din søgning") f = InputBox("Hvilken celle skal der startes med at søge i?", "Start på søgning")
Range(f).Select
Call selveSoeg End Sub Sub SoegNext() Dim felt As String
felt = ActiveCell.Address
Call selveSoeg
If ActiveCell.Address > felt Then MsgBox "her er en ny", vbOKOnly, "Søgning" ElseIf ActiveSheet.Index < ActiveWorkbook.Worksheets.Count Then Sheets(ActiveSheet.Index + 1).Select Range(f).Select ' Call selveSoeg Call SoegNext Else MsgBox "Der findes ikke flere", vbOKOnly, "Din søgning" End If End Sub Sub selveSoeg() On Error Resume Next om.Find(What:=dt, After:=ActiveCell, LookIn:=xlFormulas, _ LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _ MatchCase:=False, SearchFormat:=False).Activate End Sub
Det passer ikke helt hvad jeg siger ... der er lidt problemer med lidt af hvert ... men her skulle der være noget som virker:
Public om As Range ' område der skal tjekkes igennem Public dt As String ' tekst der skal søges efter Public f As String ' første celle der skal søges fra på nye ark Sub soeg() Set om = Range("B2:C14")
dt = InputBox("Hvad vil du gerne søge efter?", "Din søgning") f = InputBox("Hvilken celle skal der startes med at søge i?", "Start på søgning")
Range(f).Select
On Error Resume Next om.Find(What:=dt, After:=ActiveCell, LookIn:=xlFormulas, _ LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _ MatchCase:=False, SearchFormat:=False).Activate End Sub Sub SoegNext() Dim felt As String
felt = ActiveCell.Address
On Error Resume Next Cells.FindNext(After:=ActiveCell).Activate
If ActiveCell.Address > felt Then MsgBox "her er en ny", vbOKOnly, "Søgning" ElseIf ActiveSheet.Index < ActiveWorkbook.Worksheets.Count Then Sheets(ActiveSheet.Index + 1).Select Range(f).Select If ActiveCell.Value = dt Then MsgBox "her er en ny", vbOKOnly, "Søgning" Else On Error Resume Next Cells.FindNext(After:=ActiveCell).Activate If ActiveCell.Value = dt Then MsgBox "her er en ny", vbOKOnly, "Søgning" Else Call SoegNext End If End If Else MsgBox "Der findes ikke flere", vbOKOnly, "Din søgning" End If End Sub
De tre public er rigtig nok, de skal bare ligge for sigselv.
Årsagen til, at jeg har lavet så den spørger efter hvor den skal starter, var lidt fordi der skal være en celle i selve området der er aktivt. - Det var mest brugt som en debug ting for mig.
Det kan hurtig ændres til: f = "allerførste cellen i dit område" ' fx. "B2" Range(f).select
Det bliver brugt både til at fortælle hvor den skal starte første gang, men også hvor der skal startes, når der skal skiftes ark.
Genvej, der mener jeg - i excel 2003 Funktioner - Makro - Makro - (find den makro der skal have en genvej) - Indstillinger. Således opretter du en genvejskombination til at afvikle de enkelte makroer - Jeg har fx. brugt CTRL+q til den ene og CTRL+W til den anden.
Jeg har ikke lige oplevet de runtime errors efter jeg lavede den sidste ændring, kan du fortælle i hvilket tilfælde den kommer med det?
Jeg har ændret "f" til A1 og ændret Range til at starte i A1. Dette medfører i øvrigt at hvis jeg trykker cancel til dialogboksen "Hvad vil du gerne søge efter", kommer den ikke længere med runtime error. Jeg fik også en anden fejl tidligere, men den kan jeg pt. ikke fremprovokere og husker ikke hvad jeg gjorde.
Hvis jeg i celle A1 i ark1,2,3 indtaster "bt" og søger efter dette mens jeg er i ark1, findes "bt" i ark1, men ikke i ark2 og ark3. Jeg skal så aktivere makro2 der så vil hoppe til ark 2 eller ark3 hvor værdien så findes korrekt. Det virker lidt bøvlet, kan man ikke få de 2 makroer kørt sammen i én (dialogboksen skal helst forblive synlig indtil den lukkes manuelt).
Ligeledes, hvis jeg står i ark1 og søger på "bt" og denne værdi kun findes i ark2 eller ark3, får jeg ikke noget hit, medmindre jeg fyrer nr. 2 makro af bagefter.
Var ikke så meget tid jeg fik den anden dag til at se på det. Det er muligt, at det kan gøres lidt smartere, men dette burde virke:
Public om As Range ' område der skal tjekkes igennem Public dt As String ' tekst der skal søges efter Public f As String ' første celle der skal søges fra på nye ark Sub HeleSoeg() Dim felt As String Dim sFundet As Boolean 'True ved Fundet eller at der ikke er flere
dc = -1 sFundet = False f = "B2" 'første celle Set om = Range(f & ":C14") 'sidste celle If dt = "" Then Sheets(1).Select Range(f).Select dt = InputBox("Hvad vil du gerne søge efter?", "Din søgning")
On Error Resume Next om.Find(What:=dt, After:=ActiveCell, LookIn:=xlFormulas, _ LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _ MatchCase:=False, SearchFormat:=False).Activate
If InStr(ActiveCell, dt) > 0 Then sFundet = True MsgBox "Her er en!", vbOKOnly, "Din søgning" End If End If
While Not sFundet felt = ActiveCell.Address On Error Resume Next Cells.FindNext(After:=ActiveCell).Activate
If ActiveCell.Address > felt Then sFundet = True MsgBox "her er en!", vbOKOnly, "Søgning" ElseIf ActiveSheet.Index < ActiveWorkbook.Worksheets.Count Then Sheets(ActiveSheet.Index + 1).Select Range(f).Select If InStr(ActiveCell, dt) > 0 Then sFundet = True MsgBox "Her er en!", vbOKOnly, "Din søgning" End If Else sFundet = True dt = "" MsgBox "Der findes ikke flere", vbOKOnly, "Din søgning" End If Wend End Sub
Jeg har netop afprøvet den, men den er desværre ikke helt ok.
Hvis jeg skriver "bt" i b3 og "eb" i b4 i alle 3 ark og laver en søgning på "bt", finder koden den første værdi i ark2 og ikke værdien i ark1 og ark3.
Jeg får heller ikke mulighed for at ændre søgningen fra fx. "bt" til "eb", da koden tilsyneladende kører i ring når den først er i gang.
Uden at være sikker vil jeg tro at opgaven kun kan lykkes, hvis koden kalder den originale indbyggede søgedialogboks, bl.a. fordi dialogboksen har de forskellige muligheder jeg skal bruge indbygget fra start af, såsom "find næste", "søg på hele cellen/dele af cellen", "gennemsøg hele projektmappen", "søg i værdier" osv.
Hvad med koden jeg nævnte længere oppe i tråden Sub test() Range("a1:d5").Application.Dialogs(xlDialogFormulaFind).Show End Sub
Er der virkelig ingen muligheder for at få den til at søge i et bestemt område/rækker, for den virker 100% som den skal, bortset fra søgeområdet?
Jeg har lige prøvet det du har beskrevet. "bt" i alle b3 cellerne "eb" i alle b4 cellerne
Når jeg starter søgningen, så søger jeg efter "bt", og der finder den godt nok "bt" i celle b3 på ark1.
Det jeg har gjort ang. søgningen, er at hver gang du kører makroen, så fortsætter den på den gamle søgning indtil du har fået alle. Herefter skulle den nulstille dit søgningsord, og du skulle blive spurgt efter nyt søgeord.
.... Jeg har prøvet at lave noget lidt andet nu, som måske kan bruges. Det er godt nok noget anderledes end det der lige er spurgt til, men prøv kig på det. Det kræver, at du opretter et faneblad der hedder "data", og at det bliver lagt aller sidst i rækken af faneblade.
Sub heltnysoegning() Dim FoundCell As Range Dim LastCell As Range Dim FirstAddr As String Dim id As Integer Dim asheet As String Dim dt As String
Sheets("data").Cells.Delete Shift:=xlUp
dt = InputBox("Hvad vil du gerne søge efter?", "Din søgning") Sheets(1).Select While ActiveSheet.Index < ActiveWorkbook.Sheets.Count asheet = ActiveSheet.Name
With Range("A1:A10") Set LastCell = .Cells(.Cells.Count) End With Set FoundCell = Range("A1:A10").Find(what:=dt, after:=LastCell)
If Not FoundCell Is Nothing Then FirstAddr = FoundCell.Address End If Do Until FoundCell Is Nothing id = id + 1 Sheets("data").Hyperlinks.Add Anchor:=Sheets("data").Range("A" & id), Address:="", SubAddress:= _ "" & asheet & "!" & FoundCell.Address, TextToDisplay:="" & FoundCell
Set FoundCell = Range("A1:A10").FindNext(after:=FoundCell) If FoundCell.Address = FirstAddr Then Exit Do End If Loop
ActiveSheet.Next.Select Wend End Sub
Samtidig skal du ind 3 steder at rette i det område, hvor den skal søge i.
Koden finder umiddelbart alle de indtastede værdier.
Hvis jeg indtaster "bt" i celle A2 i ark1,2,3 og kører koden, findes "bt" ganske vist i alle 3 ark, men samtidig skiftes der ark til dataarket hvor der så er links til de 3 fundne værdier i ark1, ark2, ark3.
De fundne links er klikbare og virker også, men desværre er funktionaliteten ikke helt som jeg skal bruge...
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.