Avatar billede List Praktikant
25. september 2017 - 10:30 Der er 11 kommentarer

VBA søgefunktion og returnering

Hej

Er der nogen der har erfaringer med, at lave en VBA kode. Hvor man via en klik knappe fremkalder en tekstboks til søgning på en del af et ord i et helt data Sheet og så returnere de rækker hvor i der er fundet et match, i et andet sheet?

Jeg håber ovenstående giver mening.
Avatar billede finb Ekspert
25. september 2017 - 11:03 #1
Har ikke tid, kort:
sheet 1: inputbox: søge-ordet
lav et array til at holde "høsten":
for each cell in ditDefineredeRangeIsheet1
if cell = søgeordet then
ArrayVærdi(1)=aktuelRække
  redim preserve
osv...
Og aflæs så høsten på sheet 2
...Det var den ultrakorte version...
Avatar billede Jan Hansen Ekspert
25. september 2017 - 15:34 #2
Ja da
Avatar billede Mads Jensen Praktikant
25. september 2017 - 21:22 #3
Kigger lige med..

Best Regards,
Mads Jensen
www.Performance-Parts.dk
Avatar billede Jan Hansen Ekspert
26. september 2017 - 14:20 #4
Userform med en label, en tekstboks og to knapper:

Kode

Option Explicit

Dim MyArray() As Variant
Dim NewArray() As Variant

Private Sub CbLuk_Click()
    Unload uSøg 'Usøg er Userform.Name
End Sub

Private Sub TxtSøg_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    ReDim NewArray(LBound(MyArray, 1) To UBound(MyArray, 1), LBound(MyArray, 2) To UBound(MyArray, 2))
    Dim R As Long, C As Long, iCount As Integer
    Dim lCount As Long: lCount = 2
    Dim ws As Worksheet: Set ws = Sheets("Søge Output")
    Dim rArea As Range: Set rArea = ws.Range("A1")
    If TxtSøg.Value = "" Then GoTo Videre
    For R = 1 To UBound(MyArray, 1) ' 1. array dimension er rækker.
        For C = 1 To UBound(MyArray, 2) ' 2. array dimension er kolonner.
            If R = 1 Then
                NewArray(R, C) = MyArray(R, C)
            Else
                If C = 2 Then 'Kolonne der skal tjekkes
                    If MyArray(R, C) Like "*" & UCase(TxtSøg.Value) & "*" Then ' gør det skrevne til storebogstaver og sætte joker foran og bag
                        For iCount = 1 To UBound(MyArray, 2)
                            NewArray(lCount, iCount) = MyArray(R, iCount)
                        Next
                        lCount = lCount + 1
                    End If
                End If
            End If
        Next C
    Next R
    Set rArea = rArea.Resize(UBound(NewArray, 1), UBound(NewArray, 2))
    rArea.Value = NewArray ' retunerer facit til retur ark
Videre:
    Erase NewArray
End Sub

Private Sub UserForm_Initialize()
Dim wsData As Worksheet: Set wsData = Sheets("Data")
Dim rData As Range, lColumn As Long, lRow As Long

lColumn = wsData.Cells(1, Columns.Count).End(xlToLeft).Column
lRow = wsData.Cells(Rows.Count, 1).End(xlUp).Row
Set rData = wsData.Range(wsData.Cells(1, 1), wsData.Cells(lRow, lColumn))
    ' tilpasser Controls på Userformen
    With LbSøg ' Label
        .Caption = "Søg:"
        With .Font
            .Size = 16
        End With
        .AutoSize = True
        .Left = 5
        .Top = 10
    End With
    With TxtSøg 'Tekstboks
        With .Font
            .Size = 12
        End With
        .Left = LbSøg.Width + LbSøg.Left * 2
        .Height = 20
        .Top = LbSøg.Top + 1
    End With
    With CbOk ' ok knap - Usynlig da den ikke blev nødvendig, må ikke fjernes, da luk knap bruge placeringen
        .Left = LbSøg.Left + TxtSøg.Left + TxtSøg.Width
        .Top = LbSøg.Top
        .Height = TxtSøg.Height
        .Visible = False
    End With
    With CbLuk 'Luk knap
        .Left = LbSøg.Left + TxtSøg.Left + TxtSøg.Width
        .Top = CbOk.Top + CbOk.Height + 5
    End With
    ' tilpasser størrelsen på Userformen
    With uSøg ' Userform
        .Width = CbLuk.Left + CbLuk.Width + 20
        .Height = CbLuk.Top + CbLuk.Height * 2 + 10
    End With
    ' indlæser arket i et array
    MyArray() = rData.Value
End Sub



Jan
Avatar billede List Praktikant
27. september 2017 - 07:23 #5
Hej Jan

Super, en lidt anden tilgang end jeg selv var startet ud med - Tak
Måske jeg bare ikke lige kan gennemskue det, men kan den rettes til, at kan søge i alle kolonner i en søgning?
Avatar billede Jan Hansen Ekspert
27. september 2017 - 07:49 #6
Ja da
Kikker lige
Avatar billede Jan Hansen Ekspert
27. september 2017 - 07:53 #7
If C = 2 Then 'Kolonne der skal tjekkes

til ret

If C <14 Then 'Kolonne der skal tjekkes
Avatar billede Jan Hansen Ekspert
27. september 2017 - 07:56 #8
Brug af Array's gør at tingene går mega hurtig i forhold til at copy række for række fra det ene ark til det andet.
Avatar billede Jan Hansen Ekspert
27. september 2017 - 08:13 #9
#7 måske giver det problemer med dubleter
Altså finder ord i flere kolonner i samme række vil tage rækken med to gange

udskift:



Private Sub TxtSøg_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    ReDim NewArray(LBound(MyArray, 1) To UBound(MyArray, 1), LBound(MyArray, 2) To UBound(MyArray, 2))
    Dim R As Long, C As Long, iCount As Integer, RækkeCopy As Boolean
    Dim lCount As Long: lCount = 2
    Dim ws As Worksheet: Set ws = Sheets("Søge Output")
    Dim rArea As Range: Set rArea = ws.Range("A1")
    If TxtSøg.Value = "" Then GoTo Videre
    For R = 1 To UBound(MyArray, 1) ' 1. array dimension er rækker.
        RækkeCopy = False
        For C = 1 To UBound(MyArray, 2) ' 2. array dimension er kolonner.
            If R = 1 Then
                NewArray(R, C) = MyArray(R, C)
            Else
                If C < 14 Then 'Kolonne der skal tjekkes
                    If RækkeCopy = False Then
                        If MyArray(R, C) Like "*" & UCase(TxtSøg.Value) & "*" Then ' gør det skrevne til storebogstaver og sætte joker foran og bag
                            For iCount = 1 To UBound(MyArray, 2)
                                NewArray(lCount, iCount) = MyArray(R, iCount)
                            Next
                            RækkeCopy = True
                            lCount = lCount + 1
                        End If
                    End If
                End If
            End If
        Next C
    Next R
    Set rArea = rArea.Resize(UBound(NewArray, 1), UBound(NewArray, 2))
    rArea.Value = NewArray ' retunerer facit til retur ark
Videre:
    Erase NewArray
End Sub



så kommer du dubletter til livs

Jan
Avatar billede List Praktikant
27. september 2017 - 09:30 #10
Jeg har ikke arbejdet med MyArray før, men kan da se det er noget jeg skal lære. Men jeg ved også jeg har langt vej igen ;-)

Tak for ovenstående rettelse - Der meldes debug i linien:

If MyArray(R, C) Like "*" & UCase(TxtSøg.Value) & "*" Then ' gør det skrevne til storebogstaver og sætte joker foran og bag

Som er står i den sidste rettelse.
Jeg kan ikke se hvor det går galt henne?
Avatar billede Jan Hansen Ekspert
27. september 2017 - 10:26 #11
1 Array er ikke så svært som det ser ud!!
2. Er det i den fil som jeg har, og hvordan fremprovokerer du den?

Jan
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

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