[vba] zoeken naar dezelfde waarden.

Pagina: 1
Acties:
  • 663 views sinds 30-01-2008
  • Reageer

  • Sanity11
  • Registratie: Januari 2004
  • Niet online
Ik ben bezig met een grote exelsheet waarin vaak dezelfde waarden voorkomen, deze waarden zijn letters, bijvoorbeeld: Boutje. 2 kolommen verderop in dezelfde rij staat bijvoorbeeld 6, dat is het aantal. het aantal kan bij ieder boutje anders zijn.

Nou probeer ik een macro te maken die de waarde boutje opzoekt en dan waarde 6 onthoudt.
Dan verder zoekt naar het volgende boutje en dan de cijferwaarde optelt bij 6.
Dit dan doet tot hij alle boutjes heeft gehad en dan verder gaat met schroefje en daarbij hetzelfde doet totdat er niks meer over is om op te tellen.

Om dit te testen heb ik een excel bestand gemaakt als volgt:

A B C
1 Dinges 3
2 Dinges 6
3 Dinges 5
4 Geval 6
5 Geval 7
6 Geval 7
7 Dinges 9
8 Dinges 10
9 Dinges 2
10 Geval 5
11 Geval 8

Om het omschreven resultaat te bereiken heb ik het volgende tot nu toe gemaakt:
Visual Basic .NET:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
Private Sub CommandButton1_Click()
    Dim strZoekwaarde As String
    Dim i As Integer
    Dim intTotaal As Integer
    Dim strEerste As String
    
    Do While strZoekwaarde = ""
    i = i + 1
    strZoekwaarde = Range("a" & i).Value
        If strZoekwaarde = "" Then
        Else
        strZoekwaarde = strZoekwaarde
        End If
    Loop
    
    intTotaal = Range("a" & i).Offset(0, 2).Value
    
    strEerste = strZoekwaarde
    
    Do While strEerste = strZoekwaarde
    i = i + 1
    strZoekwaarde = Range("a" & i).Value
        If strEerste = strZoekwaarde Then
        intTotaal = intTotaal + Range("a" & i).Offset(0, 2).Value
        Else
        MsgBox (intTotaal)
        End If
    Loop


Maar dan stopt hij gewoon bij de eerst 3 Dinges en geeft hij als waarde resultaat in de messagebox: 14.
Ook gebruik ik hier alleen maar 'dinges' en 'geval', terwijl er in de sheet een onbekend aantal verschillende artikelen voor kunnen komen.

Kan iemand me een goede tip in de juiste denkrichting geven?

Alvast bedankt voor de reacties. :)

www.diovisuals.co,


  • F_J_K
  • Registratie: Juni 2001
  • Niet online

F_J_K

Moderator CSA/PB/AI

Front verplichte underscores

code:
1
Do While strEerste = strZoekwaarde

Daar gaat het fout. "If strEerste = strZoekwaarde" is nu wat onzinnig omdat dat altijd het geval is. Je stopt bij de eerste keer dat er geen waarde wordt gevonden die gelijk is aan de eerste. Je wilt pas stoppen als er helemaal geen waarde wordt gevonden.

'Multiple exclamation marks,' he went on, shaking his head, 'are a sure sign of a diseased mind' (Terry Pratchett, Eric)


  • Sanity11
  • Registratie: Januari 2004
  • Niet online
F_J_K schreef op dinsdag 30 januari 2007 @ 10:29:
code:
1
Do While strEerste = strZoekwaarde

Daar gaat het fout. "If strEerste = strZoekwaarde" is nu wat onzinnig omdat dat altijd het geval is. Je stopt bij de eerste keer dat er geen waarde wordt gevonden die gelijk is aan de eerste. Je wilt pas stoppen als er helemaal geen waarde wordt gevonden.
Hmm, ja inderdaad, ik zal dat vanavond eens veranderen, Thnx.
Misschien weet iemand of het zoiezo beter is om dit via .find te doen ipv dit soort loops?
Ik heb zelf het idee dat ik wat te moeilijk zit te denken maar ik weet niet hoe het anders zou kunnen.

www.diovisuals.co,


Verwijderd

Kan je dit niet makkelijker via de formule som.als doen?
Voorbeeld:
Zet in een cel A13:
code:
1
=SOM.ALS(B1:B11;"="&A12;C1:C11)


Als je nu in cel A12 Boutje intikt komt de waard er te staan

[ Voor 54% gewijzigd door Verwijderd op 30-01-2007 11:34 ]


  • Sanity11
  • Registratie: Januari 2004
  • Niet online
Verwijderd schreef op dinsdag 30 januari 2007 @ 11:26:
Kan je dit niet makkelijker via de formule som.als doen?
Voorbeeld:
Zet in een cel A13:
code:
1
=SOM.ALS(B1:B11;"="&A12;C1:C11)


Als je nu in cel A12 Boutje intikt komt de waard er te staan
Ja maar ik weet niet van tevoren of het een boutje, schroefje enz enz enz is. (het kunnen momenteel +- 2000 verschillende onderdelen zijn.)
En ze staan ook nog eens versprijd over verschillende werkbladen.

Ik zal even een screentje van 1 van de geassembleerde onderdelen laten zien:
Afbeeldingslocatie: http://www.diovisuals.com//images/ForumEnWeb/excel-voorbeeld.gif

Zo staan er honderden verschillende.

Deze moeten dus allemaal nagelopen worden en als het zelfde onderdeel voorkomt in verschillende van dit soor samenstellingen moeten ze bijelkaar opgeteld worden.

www.diovisuals.co,


Verwijderd

Ah, ik zie het ja, over stukje heengelezen.

een beetje offtopic, maar je hebt al die gegevens niet toevallig ook in een database staan?
(zou een stuk makkelijker en efficienter werken vermoed ik)

  • Sanity11
  • Registratie: Januari 2004
  • Niet online
Verwijderd schreef op dinsdag 30 januari 2007 @ 11:58:
Ah, ik zie het ja, over stukje heengelezen.

een beetje offtopic, maar je hebt al die gegevens niet toevallig ook in een database staan?
(zou een stuk makkelijker en efficienter werken vermoed ik)
Daar heb je gelijk in maar de onderdelen moeten door iedereen aan te maken zijn.
Daarnaast is de sheet gekoppeld aan een tekenprogramma.
En er was al een Excel sheet.
:)

www.diovisuals.co,


  • GloriX
  • Registratie: Januari 2006
  • Niet online
Ik zat net wat te proberen en toen bedacht ik mij opeens, kan je niet gewoon een draaitabel maken?

Draaitabel op boutje, moertje enz. dan het aantal als som erin zetten en klaar ben je. Wat je ook kan doen is een draatabel op een blad maken en als je het in een msgbox wilt hebben, die eerst laten updaten en dan vert.lookup in de draaitabel en dan ben je er ook weer.

  • Sanity11
  • Registratie: Januari 2004
  • Niet online
Frisea schreef op dinsdag 30 januari 2007 @ 12:22:
Ik zat net wat te proberen en toen bedacht ik mij opeens, kan je niet gewoon een draaitabel maken?

Draaitabel op boutje, moertje enz. dan het aantal als som erin zetten en klaar ben je. Wat je ook kan doen is een draatabel op een blad maken en als je het in een msgbox wilt hebben, die eerst laten updaten en dan vert.lookup in de draaitabel en dan ben je er ook weer.
Klinkt als een goed idee, ik ga het meteen even proberen.

www.diovisuals.co,


  • Sanity11
  • Registratie: Januari 2004
  • Niet online
Frisea schreef op dinsdag 30 januari 2007 @ 12:22:
Ik zat net wat te proberen en toen bedacht ik mij opeens, kan je niet gewoon een draaitabel maken?

Draaitabel op boutje, moertje enz. dan het aantal als som erin zetten en klaar ben je. Wat je ook kan doen is een draatabel op een blad maken en als je het in een msgbox wilt hebben, die eerst laten updaten en dan vert.lookup in de draaitabel en dan ben je er ook weer.
Dit werkt helaas ook alleen maar op 1 blad tegelijk.
De info waar ik het over heb staat versprijd over verscillende werkbladen.

www.diovisuals.co,


  • GloriX
  • Registratie: Januari 2006
  • Niet online
Sanity11 schreef op dinsdag 30 januari 2007 @ 13:52:
[...]


Dit werkt helaas ook alleen maar op 1 blad tegelijk.
De info waar ik het over heb staat versprijd over verscillende werkbladen.
AH, dat maakt het lastig inderdaad. Ik heb nog even wat geprobeerd, je kan wel meerdere draaitabellen maken, dus van elk blad 1 in een nieuw blad en daarop weer een draaitabel die het totaliseert.

Om hoeveel bladen gaat het?

  • Sanity11
  • Registratie: Januari 2004
  • Niet online
Het gaat om een blad of 12.

Ik heb het nu iets anders gemaakt.

Er is een inkoopblad welke alle onderdelen in zich heeft.
Daar heb ik voor ieder blad de formule SOM.ALS in gezet.
De uitkomst tel ik per product bijelkaar op.

Dan komt de macro, die zoekt in de totalen en wanneer het meer dan 0 is zet hij het in het andere blad.
:)

Helaas iets omslagtiger dan ik had gewild maar het werkt wel.

Dank jullie voor de tips! :*)

www.diovisuals.co,


  • onkl
  • Registratie: Oktober 2002
  • Nu online
In dat geval: let eens op de formule "INDIRECT" (Zo'n typisch pareltje van "het kan, maar wel heel omslachtig" in Excel). Daarmee kan je de bladnaam uit een andere cel halen.
Dus niet meer =SOM.ALS('Eerste Artikelblad'A1:A100=(verwijzing naar de plek waar "moertje" staat);'Eerste Artikelblad'B1:B100), maar
=SOM.ALS(INDIRECT("'"&(verwijzing naar de plek waar de artikelnaam staat)&"'A1:A100",WAAR)=(verwijzing naar de plek waar "moertje" staat);INDIRECT("'"&(verwijzing naar de plek waar de artikelnaam staat)&"'B1:B100",WAAR))

Let wel goed op aanhalingstekens en zo, maar dit kan je een bak formule-editing besparen.
Pagina: 1