Verticaal zoeken op linkse/1e letter

Status
Niet open voor verdere reacties.

Feijtert

Gebruiker
Lid geworden
9 jan 2008
Berichten
37
Hallo,

Momenteel ben ik druk bezig met het ontwikkelen van een bestand om de voorraad te tellen. Hierbij heb ik een vba code toegepast die zoekt naar locaties waarin bv de letter 'A' voorkomt. Nu zou ik graag willen dat deze code alleen de locaties ophaalt die met de letter 'A' beginnen. Dit moet volgens mij wel mogelijk zijn met iets van left(string, 1), maar ik heb onvoldoende kennis van VBA om dit te schrijven. De gegevens moeten worden opgehaald uit het tabblad 'Tellijst totaal' en geplaatst worden in het tabblad 'Tellijst per locatie'.

Ik hoop dat iemand hierbij kan helpen.

Gr. Arjen
 

Bijlagen

Feijtert,

Wellicht heb je hier iets aan. Ik heb het gehele stuk van Do - Loop vervangen door het onderstaande en dat werkt. Je moet echter wel nog zelf even kijken welke gegevens van de Tellijst Totaal je nog meer wilt door kopiëren, maar dat is "meer van hetzelfde".

Kijk ook eens naar de wijze om Rng te omschrijven.

Succes ermee.

Groet,
Ronald


StartRij = 2
MaxRij = DataBlad.Range("f65536").End(xlUp).Row
Set Rng = DataBlad.Range("f" & StartRij, "f" & MaxRij)

For Each p In Rng
If p.Value Like " A*" Then
p.Copy Destination:=WerkBlad.Range("A65000").End(xlUp).Offset(1, 0)
p.Offset(0, 1).Copy Destination:=WerkBlad.Range("A65000").End(xlUp).Offset(0, 1)
End If
Next
 
Ronald, bedankt voor je input!

Bij mij werkt het ook goed. Alleen met dit script wordt er alleen gezocht naar locaties die met een 'A' beginnen. Echter, er zullen ook locaties ingevoerd worden die met een andere letter beginnen. Verder neemt de code bij mij alleen de waarden over en niet de opmaak, dat staat iets mooier. In principe doet mijn code alles wat ie moet doen, alleen hij zou uitsluitend de waarden uit de range moeten overnemen waarvan de 1 letter overeenkomt met de opgegeven letter.

Gr. Arjen
 
Beste Arjen,

Ben nog wat aan het knutselen geweest. Als je de vba-code in bijlage 4.1 bekijkt kan je zelf beslissen of en wat je overneemt. Ik heb 2 varianten erbij gemaakt (één met inputbox en één waarbij in cel b1 wordt gekeken). Daarbij wordt gekeken naar de eerste letter van het artikelnummer. Ook het artikel "Actiecode" wordt meegenomen.

Wat er in jouw code niet goed gaat is dat het zoekargument met ".Find" in de gehele string kijkt of de letter er in voorkomt. Vandaar dat ook het artikelnummer dat begint met "AB" wordt opgenomen. Dat heb ik in mijn code afgevangen. Ik zou ook zo 1-2-3 weten hoe je dat in jouw code zou kunnen ondervangen.

Succes!

Groet,

Ronald
 

Bijlagen

Hoi Ronald,

Hartelijk dank voor het meedenken! Dit is inderdaad wat ik bedoelde! Ik was zelf ook al wat aan het stoeien geweest met 'If LTrim(Left(p, 2)) = Woord', maar ik kwam er toch niet uit. Ik krijg alleen nog wel een foutmelding wanneer ik een andere letter dan de 'a' in de inputbox typ, namelijk:

Eigenschap linestyle van klasse border kan niet worden ingesteld

Heb je toevallig enig idee waar dat aan kan liggen?

Gr. Arjen
 
Arjen,

Dat komt doordat MaxRij dan 5 is en de range waarvoor de opmaak moet worden ingesteld vanaf rij 6 telt. Omdat je een argument ingeeft dat geen resultaten oplevert is het sheet vanaf rij 6 leeg. VBA weet dus even neit wat er moet gebeuren. Ik heb de code aangepast, zie in de bijlage sub TestOpzoeken2.

Groet,

Ronald
 

Bijlagen

He, ja, ik zie het! Nou, ik heb er in ieder geval weer van geleerd!

Nogmaals bedankt voor je hulp!

Gr. Arjen
 
Is dit niet simpeler ?

Code:
Sub Opzoeken()
  With Sheets("Tellijst totaal").UsedRange.Columns(6)
    .AutoFilter 1, "?" & Sheets("Tellijst per locatie").[B1].Value & "**"
    .Offset(1).Resize(, 3).SpecialCells(xlCellTypeVisible).Copy Sheets("Tellijst per locatie").Range("A6")
    .AutoFilter
  End With
End Sub
 
Nee, deze code werkt helaas niet goed. Wanneer er een 'a' wordt ingevoerd, moeten alleen de locaties opgehaald worden die ook met een 'a' beginnen....
 
Daar hebben we het volgende op bedacht:

Code:
Sub Opzoeken()
  Sheets("Tellijst per locatie").Range("A6:K20").clearcontents
  With Sheets("Tellijst totaal").UsedRange.Columns(6)
    .AutoFilter 1, Replace(Sheets("Tellijst per locatie").[B1].Text & "*", " ", "?")
    .Offset(1).Resize(, 3).SpecialCells(xlCellTypeVisible).Copy Sheets("Tellijst per locatie").Range("A6")
    .AutoFilter
  End With
End Sub

Hang aan B1 een validatielijst met alle mogelijke lokaties.
 
Laatst bewerkt:
Arjen,

Met dank aan de code van snb (heb ik ook van geleerd :thumb:), heb ik die code nog wat verder gebruikt en tot het volgende resultaat. Volgens mij heb je nu wat je zoekt en het werkt (bij mij) ook met bijvoorbeeld "ab".

Groet,

Ronald
 

Bijlagen

Dat is overbodig als je in plaats van
Code:
Sheets("Tellijst per locatie").Range("A6:A20000").EntireRow.Delete

Code:
Sheets("Tellijst per locatie").Range("A6:K20").clearcontents

of 

Sheets("Tellijst per locatie").usedRange.offset(5).clearcontents
gebruikt.

En het kan simpeler:

Code:
    With Sheets("Tellijst per locatie").UsedRange.Offset(5)
      .Borders.LineStyle = xlContinuous
      .Borders.Weight = xlThin
      .Font.Name = "Arial"
      .Font.Size = 10
   End With
 
Laatst bewerkt:
snb,

Nog even een korte reactie/vraag.

De reden dat ik kies voor het verwijderen van de rijen is dat de opmaak er ook mee verdwijnt en je hoeft het bereik niet steeds aan te passen. Anders zou je ook een regel moeten opnemen met "usedRange.clearformats".

Jouw code is inderdaad korter. Wat ik echter niet goed kan doorgronden is waarom de opmaak er met jouw code niet zo uit komt te zien als ik het heb opgegeven. Bij mij gaat de opmaak dan verder dan de laatste gebruikte regel. Ook is de opmaak van de laatste regel dan niet zoals ik het zou willen. Ik kan niet zo snel iets bedenken dat dat voorkomt. Als jij wel een aanpassing weet hoor ik het graag.

Groet,

Ronald

ps @Arjen: hoewel dit jouw post is probeer ik zoveel mogelijk van de opmerkingen van snb te leren zodat ik dat voortaan kan gebruiken.
 
Beste snb,

De code werkt perfect! Bedankt! Ik ben nu bezig met het verfijnen van de code in tabblad 'Scanlijst' Deze werkt namelijk ook nog niet zoals het hoort...

En Ronald, natuurlijk is het geen probleem dat je gebruik maakt van mijn post. Zo kan ik er ook nog wat van leren!
 
Ik heb toch nog 1 vraag. In het tabblad 'Scanlijst' zullen de EAN-codes verschijnen die door de medewerkers gescand worden. Vervolgens wordt er met een code verticaal gezocht in het tabblad 'Data' en worden de gegevens opgehaald. Echter, de EAN-codes worden weergegeven als exponentieel, bv. 8,71199E+12. Hierdoor werkt de code niet meer. Is er een mogelijkheid dat de vba code toch werkt zonder dat de getallen worden geconverteerd naar tekst?

Alvast bedankt voor de moeite!
 

Bijlagen

Dit is eenvoudig op te lossen door de celopmaak te wijzigen in "Getal" zonder decimalen. Zo zal 8,71199E+12 dan als 8711990000000 verschijnen. Dat kan met de volgende code:

Sheets("Scanlijst").Range("B9:B42").NumberFormat = "0"

Groet,

Ronald
 
Bedankt Ronald!

Ik heb er even usedrange van gemaakt en nu draait ie perfect!
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan