Combinaties van 2 kolommen invullen in 2 velden

Status
Niet open voor verdere reacties.

giten

Gebruiker
Lid geworden
2 feb 2009
Berichten
80
Ik heb een excel-bestand met 2 invul-velden (A2 en B2 in tabblad 'Berekening' in het voorbeeld) en een aantal resultaatvelden (D2 en E2). Hoe zorg ik dat VBA de waarden uit 2 kolommen (kolom A en B uit tabblad 'Codes') invult in die invul-velden?

Het resultaat (zie tabblad 'Resultaat') moet zijn dat ik een x aantal rijen krijg met de waarden uit die resultaatvelden. x staat hier voor het aantal mogelijkheden van beide kolommen. Als de eerste kolom dus 5 waarden bevat en de 2e bevat 4 waarden krijg ik 4x5=20 rijen met resultaten.

Wie weet hoe ik dit moet oplossen?

Ik heb veel ervaring met excel, maar weinig met VBA.

Ik gebruik office xp.

Bedankt alvast!
 

Bijlagen

Laatst bewerkt:
Zoiets giten?

Misschien niet de meest simpele code voor iemand met weinig ervaring in VBA, maar goed de macro doet wat je wil. Druk maar op de knop.
 

Bijlagen

Hartstikke mooi, het werkt. Bedankt! Ik heb nog 2 vragen.

1. Nu zit de berekening van de velden in de code. Ik wil echter graag dat excel de waarden uit het tabblad 'Codes' invult in invulveld 1 en 2 (A2 en B2 in tabblad 'Berekening') en vervolgens de resultaten (D2 en E2 in tabblad 'Berekening') plakt in tabblad 'Resultaten'. Kan dat?

2. Is het mogelijk dat de waarden in tabblad 'Resultaten' worden gewist voordat de macro uitgevoerd wordt?

Alvast bedankt.

Giten
 
Laatst bewerkt:
of
Code:
Sub Execute()

  With ThisWorkbook.Sheets("Codes")
     sn1 = .Columns(1).SpecialCells(2)
     sn2 = .Columns(2).SpecialCells(2)
  End With
  ReDim sq(UBound(sn1) * UBound(sn2), 4)

  For j = 2 To UBound(sn1)
    For jj = 2 To UBound(sn2)
      x = (j - 2) * UBound(sn2) + jj - 2
      sq(x, 0) = sn1(j, 1)
      sq(x, 1) = sn2(jj, 1)
      sq(x, 3) = sq(x, 0) * sq(x, 1)
      sq(x, 4) = sq(x, 0) + sq(x, 1)
    Next
  Next

  ThisWorkbook.Sheets("Resultaat").Cells(3, 1).Resize(UBound(sq) + 1, UBound(sq, 2) + 1) = sq
End Sub
 
Bedankt! Hij werkt alleen niet bij mij. Hij herkent 'sn' niet. Is de code opzichzelf staand?
Overigens zit hier nog steeds de berekening in de code. Ik wil dus graag dat excel de velden in de invoervelden en het resultaat plakt in het tabblad 'Resultaat'.

Bedankt!
 
Laatst bewerkt:
Er staat nergens sn, wel sn1 en sn2 . Verwijder Option Explicit.
Rekenen in VBA gaat vele malen sneller dan in een werkblad.
 
>Er staat nergens sn, wel sn1 en sn2 .

Die bedoel ik.

>Verwijder Option Explicit.

Deze begrijp ik niet, ik zie het niet staan.

>Rekenen in VBA gaat vele malen sneller dan in een werkblad.

Helaas is dat niet mogelijk. De berekening in het bestand is een voorbeeld. Mijn 'echte' bestand is zo groot en ingewikkeld dat rekenen in VBA niet mogelijk is.
 
Hoe summierder je feedback, hoe summierder de suggesties.
'Werkt niet' en 'herkent niet' is niet bijster informatief.
Loop de code stapsgewijs door (F8 ) en rapporteer je bevindingen.
Plaats zonodig een schermafdruk en geef aan of je de code exact in hetzelfde bestand hebt gebruikt, of dat je wijzigingen hebt aangebracht.
 
dat rekenen in VBA niet mogelijk is.

Dat is opmerkelijk te noemen, daar VBA in veel meer instaat is dan de standaard excel interface mogelijkheden. Ik kan mij niet voorstellen dat het bestand zo groot is dat e.a. niet meer mogelijk is.

Ik werk veel met ADO (Excel<===> Access) connecties en ik kan bijna niet geloven dat uw bestanden groter zijn dan de waardes die ik ophaal met mijn queries....

Als antwoord op de vragen die je stelt, dit is allemaal mogelijk...

Wat ik ook erg merk is dat u denkt in Excel, en dat is het grootste probleem met mensen waarvoor ik weleens macro's moet maken. Ik krijg bestanden te zien die alles behalve logisch zijn. Deze personen verwachten dan wel dat ik iets oplever wat mee gaat in hun complexe bestand. Ik doe meestal een voorstel om alles om een hele andere boeg te gooien en opnieuw van de basis op te bouwen zodat e.a. logisch en overzichtelijk wordt.

Probeer niet in Excel te denken maar probeer(voor zover mogelijk) te denken in VBA.
 
Dat is opmerkelijk te noemen, daar VBA in veel meer instaat is dan de standaard excel interface mogelijkheden. Ik kan mij niet voorstellen dat het bestand zo groot is dat e.a. niet meer mogelijk is.

Ik werk veel met ADO (Excel<===> Access) connecties en ik kan bijna niet geloven dat uw bestanden groter zijn dan de waardes die ik ophaal met mijn queries....

'Niet mogelijk' is inderdaad waarschijnlijk een beetje kort door de bocht, maar het betreffende bestand bevat grote tabellen uit meerdere tabbladen waarop berekeningen uitgevoerd worden (o.a. met vertikaal zoeken). Mijn kennis van VBA is te klein om dat allemaal in VBA om te zetten. Bovendien heb ik het bestand niet zelf gemaakt en gaat het door anderen gebruikt worden en die willen e.e.a. kunnen invullen in excel.

Als antwoord op de vragen die je stelt, dit is allemaal mogelijk...

Dat klinkt veelbelovend!

Wat ik ook erg merk is dat u denkt in Excel, en dat is het grootste probleem met mensen waarvoor ik weleens macro's moet maken. Ik krijg bestanden te zien die alles behalve logisch zijn. Deze personen verwachten dan wel dat ik iets oplever wat mee gaat in hun complexe bestand. Ik doe meestal een voorstel om alles om een hele andere boeg te gooien en opnieuw van de basis op te bouwen zodat e.a. logisch en overzichtelijk wordt.

Probeer niet in Excel te denken maar probeer(voor zover mogelijk) te denken in VBA.

Dat begrijp ik, maar ik begin net met VBA, dus voorlopig denk ik nog erg in Excel.

Voor mij is het voldoende als VBA alleen maar kopiëert en plakt. Dus precies wat de code doet die je al stuurde, maar dan met het berekenen in excel in tabblad 'Berekening'.



@snb: ik zal er thuis eens met F8 doorheen gaan en inderdaad eventueel schermafdrukken maken.
 
Laatst bewerkt:
Verwijder Option Explicit.
Rekenen in VBA gaat vele malen sneller dan in een werkblad.

Ik weet niet zeker of ik het goed doe, maar ik ging naar Extra -> Opties -> tabblad Editor en heb daar 'variabelen declareren vereist' aan- en uitgevinkt. In beide gevallen krijg ik de melding 'Compileerfout: een variabele is niet gedefinieerd' bij sn1.
 
Die had je nu juist niet aan moeten vinken. Verwijder in de gehele module de tekst option explicit. Dan krijg je die melding niet meer.

Desnoods zet je als 1e regel in mijn code :

Dim sn1, sn2, sq
 
Laatst bewerkt:
Die had je nu juist niet aan oeten vinden.

Ik heb het beide geprobeerd. Aan- en uitgevinkt.

Verwijder in de gehele moduel de tekst option explicit. Dan krijg je die melding niet meer.

Desnoods zet je als 1e regel in mijn code :

Dim sn1, sn2, sq

Ik zal het vanavond thuis proberen. Bedankt!

De berekening zit echter nog in de code. Zou je hem zo kunnen aanpassen dat VBA alleen maar kopieert en plakt en dat excel dus de berekening doet?
 
Dat lijkt me een mooi klusje voor jou; gebruik geen code die je niet begrijpt. Als je hem begrijpt kun je hem ook aanpassen.(en andersom natuurlijk).
 
Ha, onderwijzer van beroep?

Je hebt gelijk: van zelf doen leer je natuurlijk het meest. Ik vrees alleen dat daar veel tijd in gaat zitten.

Ik zal thuis eens kijken of ik de code uit kan pluizen. Ik hoop dat ik eruit kom.

Een tipje van de sluier misschien? Is het lastig 'ombouwen'?
 
Nee, maar let nog eens op de naam van dit forum.

Hulpmiddelen: met de funktietoets F8 kun je de macro regel voor regel afspelen.
Als je met de cursor dan boven een variabele in de code gaat hangen is in een hulpschermje de waarde van de variabele zichtbaar.
 
Ga ik doen, bedankt! Mocht ik er niet uitkomen, dan kom ik hier wel terug.
 
Helaas begrijp ik de code van snb niet zo goed, maar die van Interface ging iets beter. Het lijkt nu gelukt te zijn, al snap ik (tegen het advies van snb in) niet alle code.

Dit heb ik ervan gemaakt:

Sub Execute()

Dim arrCodeOne, arrCodeTwo, intCounter, intCounter2, intCounter3 As Integer

arrCodeOne = Sheets("Codes").Range("a2", Sheets("Codes").Range("a2").End(xlDown))
arrCodeTwo = Sheets("Codes").Range("b2", Sheets("Codes").Range("b2").End(xlDown))

intCounter = 1
intCounter3 = 1

For intCounter2 = 1 To UBound(arrCodeOne) * UBound(arrCodeTwo)
If intCounter = UBound(arrCodeOne) + 1 Then
intCounter = 1
intCounter3 = intCounter3 + 1
End If

Sheets("Berekening").Select
Range("a2") = arrCodeOne(intCounter, 1)
Range("b2") = arrCodeTwo(intCounter3, 1)
Range("a2:e2").Select
Selection.Copy
Sheets("Resultaat").Select
Range("a" & intCounter2 + 1).Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False



intCounter = intCounter + 1
Next
 
Giten

Code aangepast en het knipperen van het beeld/weergave uitgezet(de macro zal veel sneller gaan als je dit doet;moet altijd!)

Daarbij de macro beschreven in stappen door middel van commentaar.

Verwijder heel de module en plak deze er in:

Code:
[FONT="Courier New"]

'////////////////////////////////////////////////////
'/////                                          /////
'/////          Interface \ Helpmij             /////
'/////                                          /////
'////////////////////////////////////////////////////

Option Explicit

Sub Execute()

'////////////////////////////////////
'Declareer de variabelen            /
'////////////////////////////////////

Dim arrCodeOne, arrCodeTwo, intCounter, intCounter2, intCounter3 As Integer

'////////////////////////////////////
'Weergave uitzeten                  /
'////////////////////////////////////

Application.ScreenUpdating = False

'////////////////////////////////////
'defineer twee arrays               /
'////////////////////////////////////

arrCodeOne = Sheets("Codes").Range("a2", Sheets("Codes").Range("a2").End(xlDown))
arrCodeTwo = Sheets("Codes").Range("b2", Sheets("Codes").Range("b2").End(xlDown))

'////////////////////////////////////
'de begin waarde van de tellers     /
'////////////////////////////////////

intCounter = 1
intCounter3 = 1

'////////////////////////////////////////////////////////////////////////////////
'Begin een lus/loop/herhalingstruktuur, en voer deze uit totdat de teller       /
'van de lus gelijk is aan het aantal van de waardes in array1 vermenigvuldigd   /
'met het aantal waardes in array2( een array is een gereserveerd                /
'stukje werkgeheugen waarin een matrix/reeks/rits met waardes staat.            /
'////////////////////////////////////////////////////////////////////////////////

For intCounter2 = 1 To UBound(arrCodeOne) * UBound(arrCodeTwo)
   
    '////////////////////////////////////
    'Logische tests voor alle tellers.  /
    '////////////////////////////////////
    
    
    If intCounter = UBound(arrCodeOne) + 1 Then
        intCounter = 1
        intCounter3 = intCounter3 + 1
    End If
    
    '//////////////////////////////////////////////////////////////////////////////
    'Plaats waardes in aangegeven cellen(waardes worden opgehaald uit de arrays). /
    'Kopieer daarbij de actieve regel.                                            /
    '//////////////////////////////////////////////////////////////////////////////

    With Sheets("Berekening")
        .Range("a2") = arrCodeOne(intCounter, 1)
        .Range("b2") = arrCodeTwo(intCounter3, 1)
        .Range("a2:e2").Copy
    End With
    
    '////////////////////////////////////
    'Plak de cellen die gekopieerd zijn./
    '////////////////////////////////////

    With Sheets("Resultaat")
        Range("a" & intCounter2 + 1).PasteSpecial
    End With

    intCounter = intCounter + 1
    
    '////////////////////////////////////
    'Doe de volgende stap in de lus.    /
    '////////////////////////////////////
    
Next

'////////////////////////////////////
'Weergave aanzeten               /
'Klembord legen                     /
'////////////////////////////////////

With Application
    .CutCopyMode = False
    .ScreenUpdating = True
End With

'////////////////////////////////////
'Klaar is de procedure              /
'////////////////////////////////////

End Sub

[/FONT]
 
Hartstikke mooi, bedankt!

Ik ga hem thuis bekijken. Ik had nog een paar puntjes die nog niet helemaal liepen in mijn code. Kijken hoe het nu werkt.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan