Zoeken in een Array

Status
Niet open voor verdere reacties.

Oude leerling

Gebruiker
Lid geworden
30 aug 2010
Berichten
554
Geacht forum,
Ik heb 2 Array's gemaakt van een bepaald gebied van cellen.
Wil nu kijken of er waarde in Array2 , ook voorkomen in array1.
Zo ja , dan moet die waarde van Array 2 omgewisseld worden met een van te voren bepaalde andere waarde.
Ik heb een poging gewaagd maar krijg steeds een foutmelding dat de typen niet overeen komen
bij de "Match" functie.
Ik kom zelf niet verder.
Kunt u mij helpen!! (zie mijn macro in de bijlage)
Vriendelijke groet , Jaap

Bekijk bijlage Test bij match omwisselen.xlsm
 
Met in cel H1 van blad '2e-ronde' de vervangende naam.

Code:
Sub hsv()
 Sheets("1e-ronde").Cells(Rows.Count, 8).End(xlUp).Offset(-1).Resize(2, 6).Name = "bereik1"
 Sheets("2e-ronde").Cells(Rows.Count, 9).End(xlUp).Offset(-1).Resize(2, 6).Name = "bereik2"
 [bereik2] = [if(bereik2="","",if(bereik1=bereik2,h1,bereik2))]
End Sub
 
Harry,
Indien een waarde in de cel op de 2 onderste rijen van blad '2e-ronde' ook te vinden is op de 2 onderste rijen van blad '1e-ronde'
dan moet die waarde op blad '2e-ronde' vervangen worden door een waarde van een van te voren bepaalde cel.
Omgewisseld worden dus met een andere.
Nu is die andere cel NIET STEEDS DEZELFDE , maar afhankelijk van WELKE CEL op blad '2e-ronde' ook te vinden was op blad '1e-ronde'
Die mogelijkheid bied jou oplossing nog niet.
Indien waarde I12 overeenkomt , dan omwisselen met L9
J12 met L10
K12 met M9
L12 met J9
M12 met K9
N12 met K10
I13 met L11
J13 met J11
K13 met M10
Is dit nog te realiseren?
Wat mankeert er aan macro en komt die foutmelding.

Jaap
 
Application.match geeft als resultaat een fout of een getal een geen string. Als je in een 2 dimensionale array wil zoeken dan moet je aangeven in welke rij er gezocht moet worden. Dit kan met Application.index. Gebruik ook geen oneindig aantal if then else hiervoor is Select Case uitgevonden. En gebruik inpringpunten voor de leesbaarheid.
 

Bijlagen

  • Test bij match omwisselen.xlsm
    21,2 KB · Weergaven: 36
VenA,

Je heb helemaal gelijk.
Dit is de manier.
Het omwisselen gaat alleen nog niet helemaal goed.
bv.
Case 2
Code:
ro2Array(1, r) = Range("L10")      'deze wordt niet uitgevoerd
          Range("L10") = Temp


de 2e doet het wel.
Kunt u dit ook nog voor mij oplossen?
Jaap
 
Inhoudelijk heb ik er niet naar gekeken dat mag je zelf doen.
 
Transponeren van application.index is niet nodig.
Code:
Sub hsv()
Dim sq, sq1, hs, sv, i As Long, j As Long
With Blad2
 sq = Array(.Range("L9"), .Range("L10"), .Range("M9"), .Range("J9"), .Range("K9"), .Range("K10"))
 sq1 = Array(.Range("L11"), .Range("J11"), .Range("M10"), "", "", "")
 sv = Blad1.Cells(Rows.Count, 8).End(xlUp).Offset(-1).Resize(2, 6)
 hs = .Cells(Rows.Count, 9).End(xlUp).Offset(-1).Resize(2, 6)
    For i = UBound(hs) - 1 To UBound(hs)
     For j = 1 To 6
        If hs(i, j) <> "" And Not IsError(Application.Match(hs(i, j), Application.Index(sv, i, 0), 0)) Then
           hs(i, j) = IIf(i = 1, sq(j - 1), sq1(j - 1))
        End If
      Next j
    Next i
 .Cells(Rows.Count, 9).End(xlUp).Offset(-1).Resize(2, 6) = hs
 End With
End Sub
 
HSV,
Ziet er prachtig en professioneel uit.
Daar moet ik eens voor gaan zitten hoe je dat doet.

MAAR

Deze oplossing heeft een zelfde soort probleem als die van VenA.
Hij wisselt de waardes niet om
De zoekwaarde zet hij wel in de cel waarmee hij omgewisseld zou moeten worden
maar in de omwissel cel blijft echter de oude waarde gewoon staan.

Ik heb al zitten kijken in die van VenA waar dat in kan zitten , zie het echter niet.
Raar dat jou oplossing eenzelfde soort probleem heeft

Weet u dat misschien?
Vriendelijke groet , Jaap
 
bv.
M12 wordt L10, en L10 wordt M12 ?
 
Ja precies.
Als M12 een match heeft dan moet M12 vervangen worden door L10
en L10 vervangen worden door M12 .
Omwisselen dus
 
Werkt het zo goed?
Code:
Sub hsv()
Dim sq, sq1, hs, sv, vtemp, i As Long, j As Long, n as long
With Blad2
 sv = Blad1.Range("H9", Blad1.Cells(Rows.Count, 8).End(xlUp)).Resize(, 6)
 hs = .Range("I9", .Cells(Rows.Count, 9).End(xlUp)).Resize(, 6)
 sq = Array("1,4", "2,4", "1,5", "1,2", "1,3", "2,3")
 sq1 = Array("3,4", "3,2", "2,5", "", "", "")
    For i = UBound(hs) - 1 To UBound(hs)
    n = n + 1
     For j = 1 To IIf(n = 1, 6, 3)
        If hs(i, j) <> "" And Not IsError(Application.Match(hs(i, j), Application.Index(sv, i, 0), 0)) Then
           vtemp = hs(i, j)
            If n = 1 Then
              hs(i, j) = hs(Split(sq(j - 1), ",")(0), Split(sq(j - 1), ",")(1))
              hs(Split(sq(j - 1), ",")(0), Split(sq(j - 1), ",")(1)) = vtemp
            Else
              hs(i, j) = hs(Split(sq1(j - 1), ",")(0), Split(sq1(j - 1), ",")(1))
              hs(Split(sq1(j - 1), ",")(0), Split(sq1(j - 1), ",")(1)) = vtemp
            End If
         End If
      Next j
    Next i
 .Range("I9", .Cells(Rows.Count, 9).End(xlUp)).Resize(, 6) = hs
 End With
End Sub
 
hsv,
Helemaal goed.
Ik zou willen dat ik al zo ver was.
Ik ga deze code eens heel goed bestuderen en kijken of ik kan volgen hoe hij in elkaar steekt.
Bedankt!!

VenA ,
kunt u mij echt niet uitleggen waarom uw code niet goed omwisselt.
Dit ter leering.
Hij is voor mij wel duidelijker te begrijpen.

Vriendelijke groet, Jaap
 
De code wisselt wel goed maar wordt opgeslagen in een array. Als je vervolgens niets met deze array doet dan zie je het natuurlijk niet terug in het werkblad.
Om code te doorgronden; zorg ervoor dat het scherm 'Locals' in de VB-editor aanstaat en gebruik <F8> om door de code te wandelen. Je kan dan stap voor stap volgen wat er gebeurt en zien welke variabele wel waarde krijgt.
 
VenA,
Nooit gerealiseerd dat je de waarde in de Array wijzigt en niet het betreffende
adres op je werkblad.
Ik ga eens kijken hoe ik de waarde in de Array naar het werkblad kan krijgen.
Bedankt voor de uitleg.
Weer veel opgestoken van deze sessie.

Vriendelijke groet , Jaap
 
Status
Niet open voor verdere reacties.
Steun Ons

Nieuwste berichten

Terug
Bovenaan Onderaan