Avatar billede richter1 Nybegynder
02. marts 2008 - 13:07 Der er 29 kommentarer

gennemsøg flere worksheet fortsat

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?

Hvem kan hjælpe?
Avatar billede jkrons Professor
02. marts 2008 - 14:03 #1
Kan du bruge noget i denne stil

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
Avatar billede richter1 Nybegynder
02. marts 2008 - 15:00 #2
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

Kan du finde fejlen?

Kan du se en fejl?
Avatar billede stefanfuglsang Juniormester
02. marts 2008 - 20:05 #3
Set rng = Range("B4:B" & counter + 3) 
er det samme som
  Set rng = ActiveWorksheet.Range("B4:B" & counter + 3) 

Din Set rng skal flyttes under den første For each
  Set rng = ws.Range("B4:B" & counter + 3) 

Kan dog ikke gennemskue, om det vil virke, da jeg ikke kan se hvad din counter gør?
Avatar billede richter1 Nybegynder
02. marts 2008 - 22:22 #4
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.
Avatar billede richter1 Nybegynder
02. marts 2008 - 22:24 #5
Lidt mere info: Hvis jeg søger et medlem der står på det første sheet, så finder jeg medlemmet uden problemer.
Avatar billede jkrons Professor
02. marts 2008 - 23:01 #6
Prøv med

For Each ws In ActiveWorkbook.Sheets
  Set rng = ws.Range("B4:B" & counter + 3)
Avatar billede excelent Ekspert
02. marts 2008 - 23:08 #7
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
Avatar billede richter1 Nybegynder
03. marts 2008 - 09:08 #8
-> 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?
Avatar billede excelent Ekspert
03. marts 2008 - 10:15 #9
hmm mon ikke
sh.range(rng).Find(medlem, LookIn:=xlValues).Row
eller
sh.range(rng.address).Find(medlem, LookIn:=xlValues).Row
skulle virke

og rækkenr.
y=sh.range(rng.address).Find(medlem, LookIn:=xlValues).Row
Avatar billede richter1 Nybegynder
03. marts 2008 - 10:57 #10
-> excelent
Den her virkede: sh.range(rng.address).Find(medlem, LookIn:=xlValues).Row
og rækkenummeret er også helt perfekt.

Kan jeg som det sidste også få arkets navn læst over i en variabel?
Avatar billede excelent Ekspert
03. marts 2008 - 11:13 #11
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
Avatar billede richter1 Nybegynder
03. marts 2008 - 17:39 #12
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.
Avatar billede excelent Ekspert
03. marts 2008 - 18:40 #13
Prøv lige at vise lidt mere af din kode
jeg kan se at du vil selecte i denne Find variant

men det er en eller anden form for error handling der skal til
Avatar billede richter1 Nybegynder
03. marts 2008 - 20:00 #14
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)
 
    change = 1
 
End Sub
Avatar billede excelent Ekspert
03. marts 2008 - 20:55 #15
du skal nok lige tilføje sh. i følgende linie
sh.Range("B4").Activate

men hvad skal der ske når du har fundet det søgte ?

og hvad gør denne : read_data (mlrowdisplayed) ?
Avatar billede richter1 Nybegynder
03. marts 2008 - 21:09 #16
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.
Avatar billede excelent Ekspert
03. marts 2008 - 21:57 #17
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
 
  Change = 1
 
End Sub
Avatar billede richter1 Nybegynder
04. marts 2008 - 09:12 #18
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)
 
  rk = sh.Range(rng.Address).find(txttrailer_reg, LookIn:=xlValues).Row

  read_data (rk)
  Next
 
  change = 1
 
End Sub

Med den ovenstående kode, så får rk aldrig noget indhold.
Avatar billede excelent Ekspert
04. marts 2008 - 09:48 #19
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
Avatar billede richter1 Nybegynder
04. marts 2008 - 16:48 #20
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.
Avatar billede excelent Ekspert
04. marts 2008 - 17:59 #21
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.

http://pmexcelent.dk/UserFind.xls
Avatar billede excelent Ekspert
04. marts 2008 - 18:09 #22
obs du skal først gemme - den virker ikke på nettet
Avatar billede richter1 Nybegynder
04. marts 2008 - 21:03 #23
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
Avatar billede excelent Ekspert
04. marts 2008 - 21:25 #24
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 ?
Avatar billede excelent Ekspert
04. marts 2008 - 21:31 #25
slet denne linie : Set rk = Range("A1:A" & counter)

ret denne : Set rng = sh.Range("A1:A" & rk)

til Set rng = sh.Range("A1:A" & counter)
Avatar billede richter1 Nybegynder
08. marts 2008 - 09:47 #26
så bliv det tid til lidt kode igen :=)

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

' rk = sh.Range(rng.Address).Find(medlem, LookIn:=xlValues).Row

adr = Mid(x, InStr(x, "#") + 1, Len(x))
ark = Left(x, InStr(x, "#") - 1)

If ark <> "" Then
    Me.TextBox2 = Sheets(ark).Range(adr)
    Me.TextBox3 = Sheets(ark).Range(adr).Offset(0, 1)
    Me.TextBox4 = ark
    Me.TextBox5 = rk
End If

If adr = "" Then
    MsgBox ("Ingen match")
    Me.TextBox2 = ""
    Me.TextBox3 = ""
    Me.TextBox1.SetFocus
End If

Me.TextBox1.SetFocus

End Sub
Avatar billede richter1 Nybegynder
13. marts 2008 - 06:41 #27
Jeg har løst problemet  - tak for hjælpen.

Lægger du et svar? :O)
Avatar billede excelent Ekspert
13. marts 2008 - 23:36 #28
ok
Avatar billede excelent Ekspert
14. juni 2008 - 12:21 #29
husk lige at lukke
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Excel kurser for alle niveauer og behov – find det kursus, der passer til dig

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester