Jeg har brug for hælp til at teste på resultatet på en søgnign. min kode ser ud som følger: (forsimplet da den er taget ud af et sammenhæng).
Sub test() Dim ws As Worksheet Dim rng As Range Dim firstflag As Boolean
Set rng = Range("B4:B10)
medlem = "Hans Peteren"
For Each ws In ThisWorkbook.Worksheets
If ws.Name <> ActiveSheet.Name Then
Range("B4").Activate rng.find(What:=medlem, After:=ActiveCell, LookIn:=xlFormulas, _ LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, _ MatchCase:=False, SearchFormat:=False).Activate End If Next
End Sub
Jeg skal have koden til at steppe gemmen min worksheets indtil den finder et match. Når matchet er fundet skal jeg vide i hvilken row matchet er fundet.
Er der en variabel der bliver sat (true / false), når der søges?
Sub t() medlem = "Hans Petersen" For Each ws In ActiveWorkbook.Sheets For Each c In ws.UsedRange.Cells If c.Value = medlem Then MsgBox medlem & " blev fundet i ark " & ws.Name & ", række " & c.Row End If Next c Next ws End Sub
Hejsa Jeg har prøvet din kode men kan kun få den til at give et match,hvis jeg står på siden, hvor medlemmet optræder. Målet var at komme gennem alle ark. Jeg har dog ændret lidt i koden grundt det sammenhæng som koden skal indgå i. Min kode ser således ud.
Sub t()
counter= 10 ' jeg har en rutine der tæller antal anvendt rækker.
Set rng = Range("B4:B" & counter + 3)
medlem = "Hans Petersen" For Each ws In ActiveWorkbook.Sheets For Each c In rng If c.Value = medlem Then MsgBox medlem & " blev fundet i ark " & ws.Name & ", række " & c.Row End If Next c Next ws End Sub
Den fejl havde jeg opdaget, men den løser desværre ikke problemet. Hvis jeg indsætter: MsgBox ActiveSheet.Name så kan jeg se, at der ikke skiftes mellem de enkelte worksheets.
Counteren tæller antal rækker, med række 3 som udgangspunkt.
Sub xFind() medlem = "Hans Petersen" On Error Resume Next For Each sh In ThisWorkbook.Sheets x = sh.Name & "-" & sh.Range("A1:IV65500").Find(medlem, LookIn:=xlValues).Row Next MsgBox x End Sub
-> excelent - Din kode virker fint ;O)). Men det undre mig, at jeg ikke kan ændre
x = sh.Name & "-" & sh.Range("A1:IV65500").Find(medlem, LookIn:=xlValues).Row til x = sh.Name & "-" & sh.rng.Find(medlem, LookIn:=xlValues).Row, når jeg har defineret rng således:
counter= 10 Set rng = Range("B4:B" & counter + 3)
Grundet arkenes opbygnign er jeg nødt til at anvende denne struktur.
Hvordan får jeg rækkenummeret lagt over i en variabel?
evt. sådan sh.range(rng.address).Find(medlem, LookIn:=xlValues).Row : ark=sh.name kan muligvis også stå i linien lige under - altså (ark=sh.name) har ikke testet
Jeg vil gerne sige tak for indsatsen til alle - dejligt med hurtigt respons.
excelent - du har løst opgaven til UG, så lægger du et svar.
Sidste del af opgaven: Ved du om man kan teste på en søgning med true / false? eks. rng.Find(What:=medlem.Text, After:=ActiveCell, LookIn:=xlFormulas, _ LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, _ MatchCase:=False, SearchFormat:=False).Activate
således at den ikke går i fejl, hvis den ikke kan finde noget på et ark.
Koden er en del af en søgerutine i en userform, hvor jeg ønsker at gennemsøge flere sheets. Koden er her reduceret til kun at indeholde den del der har med søgningen at gøre. Jeg kan blot ikke få den til at gennemløbe flere ark. Hvis det søgte medlem findes på ark 1, så er den ok, findes medlemmet på et af de andre ark går det galt.
Private Sub cmdSøg_Click()
Dim msg, svar, var2 As String Dim counter As Integer Dim rng As Range
Set rng = Range("B4:B" & counter + 6) For Each sh In ThisWorkbook.Sheets If firstflag = False Then Range("B4").Activate rng.find(what:=txttrailer_reg.Text, After:=ActiveCell, LookIn:=xlFormulas, _ LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, _ MatchCase:=False, SearchFormat:=False).Activate firstflag = True
Else rng.FindNext(After:=ActiveCell).Activate End If next mlrowdisplayed = Selection.Row
read_data (mlrowdisplayed) indlæser de data, som står i den pågældende række ind i en userform. Brugeren har efterfølgende mulighed for at rette/gemme data, så de placeres på samme ark i samme række.
prøv om denne dur, jeg kan ikke teste den i den form som jeg tror du skal have den i men er i tvivl om du har behov for at steppe mellem flere ens match, noget i din kode tyder på dette hvis det er tilfældet, så må vi se på det i morgen.
Private Sub cmdSøg_Click()
Dim msg, svar, var2 As String Dim counter As Integer Dim rng As Range
Set rng = Range("B4:B" & counter + 6) On Error Resume Next
For Each sh In ThisWorkbook.Sheets rk = sh.Range(rng.Address).Find(txttrailer_reg, LookIn:=xlValues).Row firstflag = True read_data (rk) Next
Der er ikke flere ens match. Det som er opgaven er, at vælge et sheet, søge kolonne 2 igennem, hvis ikke der er et match, så vælg næste sheet, gennemsøge kolonne2 osv. indtil den har fundet et match. Når jeg har fundet et match skal rækkens indhold indlæses i userformen. Jeg har indsat sh.Select, da counter skal stå på siden for at tælle antal rækker på det enkelte sheet. Private Sub cmdSøg_Click()
Dim msg, svar, var2 As String Dim counter As Integer Dim rng As Range Dim sh As Worksheet
Set rng = Range("B4:B" & counter + 3) On Error Resume Next
For Each sh In ThisWorkbook.Sheets sh.Select counter = optælAntalRækker(2)
Er værdien du søger frembragt af en formel for så skal: rk = sh.Range(rng.Address).find(txttrailer_reg, LookIn:=xlValues).Row ændres til rk = sh.Range(rng.Address).find(txttrailer_reg, LookIn:=xlFormulas).Row
det er ikke nødvendigt at selecte arket med sh.select - kører fint hos mig uden
det er muligt at du skal tilføje userfor-navn eller Me i søgevariablen : Me.txttrailer_reg eller userform-navn.txttrailer_reg
Den værdi som søges er ikke et resultat af en formel, er blot en indtastning af tal og tekst i en celle.
Når jeg afprøver koden, så får rk ikke et indhold, selvom der burde være et match. Jeg vil lige lave en simpel opstillen for at se om jeg af den vej kan isolere problemet.
sh.select er nødvendigt, da min funktion counter skal stå på siden for at kunne tælle antal rækker. Funktionen kan selvfølgelig udvides således at arkets navn tages med over som et argument.
ok der er selfølgelig ikke sådan lige at tilpasse en bestående kode, så her er et forsimplet eks. på hvordan jeg ville gøre Her hentes kun 2 værdier (er kun 2 kolonner med data) men kan i princippet hentes lige så mange værdier som er nødvendig med OFFSET kik på den og se om ikke du kan bruge det til inspiration.
Hej excelent -> den virker fint helt som den skal. Jeg har dog to problemer, som skal løses inden jeg kan indbygge den i min kode.
Kan du se, hvorfor mine ændringer ikke virker? når jeg bruger counter til at tælle antal rækker - nødvendigt, da det ikke er alle data på en side som skal medtages. Når jeg laver en debug.print rk. så får jeg det korrekte antal rækker ud. Din kode finder fint et match, det gør min ikke!
Den anden udfordring er, at jeg har brug for arknavnet, når data skal skrives tilbage efter evt. rettelser. I dit eksempel har du præcis 4 cifre, mens min kolonne 1 består af et variabelt antal tal og bogstaver. Kan du indbygge det i koden?
Private Sub CommandButton1_Click() medlem = Me.TextBox1.Text ark = "": adr = "" On Error Resume Next For Each sh In ThisWorkbook.Sheets
counter = optælAntalRækker(sh, 1)
Set rk = Range("A1:A" & counter)
Set rng = sh.Range("A1:A" & rk) x = sh.Name & "#" & sh.Range(rng.Address).Find(medlem, LookIn:=xlValues).Address Next ark = Left(x, InStr(x, "#") - 1) adr = Mid(x, InStr(x, "#") + 1, Len(x)) If ark <> "" Then Me.TextBox2 = Sheets(ark).Range(adr) Me.TextBox3 = Sheets(ark).Range(adr).Offset(0, 1) End If If adr = "" Then MsgBox ("Ingen match") Me.TextBox2 = "" Me.TextBox3 = "" Me.TextBox1.SetFocus End If Me.TextBox1.SetFocus End Sub
Private Function optælAntalRækker(sh, kol) sh.Select
Dim række, count count = 0 række = 4 While Cells(række, kol).Value <> "" count = count + 1 række = række + 1 Wend optælAntalRækker = count End Function
prøv udskift denne linie counter = optælAntalRækker(sh, 1) med denne counter = sh.Range("A4").End(xlDown).Row
herefter kan du slette funktionen optælAntalRækker hvis den ikke anvendes til andet
variablen x får værdien Arknavn + # + adressen på det søgte herefter udskilles arknavnet til variablen ark - den burde virke uanset hvor lang arknavnet er, gør den ikke det ?
Jeg er på bagrund af dit eksempel nået frem til følgende, som virker helt efter hensigten. Counter er jeg nødt til at anvende, da mit sheet er opbygget af flere sektioner, hvor ikke alle sektioner skal tælles med. Jeg mangler kun at finde rækken hvori der er match. Kan du hjælpe?
Option Explicit
Private Sub CommandButton1_Click() Dim counter, rk As Integer Dim sh As Worksheet Dim medlem, ark, adr As String Dim rng As Range Dim x As Variant ' da det er et array
medlem = Me.TextBox1.Text
ark = "": adr = "" On Error Resume Next
For Each sh In ThisWorkbook.Sheets
counter = optælAntalRækker(sh.Name, 1)
Set rng = sh.Range("A1:A" & counter) ' kører 3 gange da hele ranget checeks på en gang.
x = sh.Name & "#" & sh.Range(rng.Address).Find(medlem, LookIn:=xlValues).Address Next
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.