• Privacywetgeving
    Het is bij Helpmij.nl niet toegestaan om persoonsgegevens in een voorbeeld te plaatsen. Alle voorbeelden die persoonsgegevens bevatten zullen zonder opgaaf van reden verwijderd worden. In de vraag zal specifiek vermeld moeten worden dat het om fictieve namen gaat.

vermenigvuldigingsprodukt

Status
Niet open voor verdere reacties.

snb

Verenigingslid
Lid geworden
12 jun 2008
Berichten
19.652
Dag allen,

Het gaat over het vermenigvuldigen van waarden in een Range met gebruik van VBA.

Ik krijg een array met vermenigvuldige waarden van range("A1: D10") met:

Code:
sn=Evaluate(Sheet1.Cells(1).CurrentRegion.Address & "*10")
of
Code:
sn=[A1:D10*10]
of
Code:
sn=[Sheet1!A1:D10*10]
of
Code:
Sheet1.Cells(1).CurrentRegion.name="snb"
sn=[snb*10]

Ik ben op zoek naar een werkbladfunktie waarmee ik hetzelfde resultaat krijg zonder evaluate te gebruiken.

niet werkend voorbeeld:

Code:
sn=Sheet1.Cells(1).CurrentRegion
sp=application.product(sn *10)


NB. Ik ben niet op zoek naar de 'copy/pastespecial/operation product' methode
Evenmin naar een lus om ieder element van de array te vermenigvuldigen

Bij voorbaat dank.
 
Code:
=SOMPRODUCT(A1:D10*10)

Te kort door de bocht?
 
@Cobbe

Veel te....

Ik zoek niet naar een Excelformule, maar naar een equivalent in VBA.
 
@Jack

Dank voor je reaktie, edoch

- de [ ] variant van Evaluate kan niets met variabelen
- jouw suggestie maakt gebruik van evaluate; daar was ik juist niet naar op zoek.
 
@snb,

Hoe haal je het resultaat tevoorschijn in jouw evaluatie?

Kun je hier iets mee?

De cellen A1:B5 gevuld met (1,2,3,4,5);(1,2,3,4,5)
Code:
sn = Cells(1).CurrentRegion
sp = Application.Product(10, Application.Index(sn, Application.Transpose(Array(1, 2, 3, 4, 5)), array(1,2)))
msgbox sp
 
@HSV

Bedankt, maar dat gaat hem niet worden. Product vermenigvuldigt alle getallen van de matrix met elkaar en resulteert in 1 waarde.

Het resultaat moet een matrix zijn waarvan ieder element met 10 is vermenigvuldigd.
 
Laatst bewerkt:
snb,

Als je er geen bezwaar tegen hebt om een hulp-range te gebruiken ergens in je Workbook, dan zou je iets kunnen doen met PRODUCTMAT.

Onderstaande levert in sn de gevraagde matrix, die vervolgens in A21 : D30 wordt gezet:

Code:
Sub test()
    Dim sn
    sn = Range("M1:V10")
    sn = Application.WorksheetFunction.MMult(sn, Range("A1:D10"))
    Range("A21:D30") = sn
End Sub

In M1:V10 (de hulp-range) staat een 10×10 matrix met nullen en alleen op de diagonaal 10× een 10.
Je kunt natuurlijk deze 10×10 matrix ook aanmaken binnen VBA, maar dan moet je wel gebruikmaken van de for…next lussen om deze te vullen.

Jan
 
Laatst bewerkt:
@jgkdrt

Dank voor je suggestie.

Tegen een extra array heb ik wel bezwaar :)
Het gaat mij er nl. niet om om 2 arrays met elkaar te vermenigvuldigen, maar om ieder element van een array met een vast getal te vemenigvuldigen.
Dat doet Excel automatisch braaf met de ingebouwde 'evaluate' methode; wat mij bevreemdt is, dat Excel daarvoor geen afzonderlijke formule/funktie heeft.
 
dit werkt als alleen kolomA is gevuld.
Code:
Sub test()
    sn = Sheets(1).Cells(1).CurrentRegion.Value
    ReDim m(0)
    m(0) = 10
    sn = WorksheetFunction.MMult(sn, m)
End Sub
of deze:
Code:
Sub test()
    sn = Sheets(1).Cells(1).CurrentRegion.Value
    sn = WorksheetFunction.MMult(sn, Array(10))
End Sub
 
Laatst bewerkt:
@Sylv,


Dankjewel,
Edoch, het gaat over bijv A1 : D10 (zie #1)
 
Een mogelijkheid zonder Evaluate, maar wél met een klein loopje (niet uitgebreid getest):
Code:
Sub rebmog1()
    sn1 = Sheets(1).Cells(1).CurrentRegion
    ReDim sn2(1 To UBound(sn1, 2), 1 To UBound(sn1, 2)) As Double
    For i = 1 To UBound(sn2)
        sn2(i, i) = 10
    Next
    sp = Application.MMult(sn1, sn2)
End Sub

Just for the fun, ook nog een versie met matrixconstante. Hiervoor is echter wel Evaluate nodig:
Code:
Sub rebmog2()
    sn = Sheets(1).Cells(1).CurrentRegion
    For i = 1 To UBound(sn, 2)
        sArrCnst = sArrCnst & ";" & Application.Substitute(Application.Rept(",0", UBound(sn, 2)), "0", "10", i)
    Next
    sp = Evaluate("=MMULT(" & Sheets(1).Cells(1).CurrentRegion.Address & ",{" & Mid(Replace(sArrCnst, ";,", ";"), 2) & "})")
End Sub

Voor geïnteresseerden. De matrixformule kan in bovenstaande code bijv. als volgt op de sheet geplaatst worden:
Code:
Sheets(1).Range("H1").Resize(UBound(sn), UBound(sn, 2)).FormulaArray = "=MMULT(" & Sheets(1).Cells(1).CurrentRegion.Address & ",{" & Mid(Replace(sArrCnst, ";,", ";"), 2) & "})"
 
@Rebmog

Dank ! Ik hoop niet dat het je nachtrust heeft gekost.

Ik heb nu de volgende aanpak:

Code:
Sub M_snb()
    sn = Cells(7, 8).CurrentRegion
    Cells(7, 8).CurrentRegion.Offset(20) = Application.MMult(sn, Evaluate("(row(1:" & UBound(sn) & ")=column(1:" & UBound(sn, 2) & "))*10"))
end sub

De suggestie van jgdkrt van een matrix met alleen 10 op de diagonaal liet het kwartje vallen.
 
Voortbordurend op dezelfde suggestie:

Code:
Sub x10()
    sn = Cells(1, 1).CurrentRegion   'A1:C10 in dit voorbeeld
    sp = Array(Array(10, 0, 0), Array(0, 10, 0), Array(0, 0, 10))
    Cells(1).CurrentRegion.Offset(15) = Application.MMult(sn, sp)
End Sub
 

Bijlagen

  • x10.xlsm
    14,5 KB · Weergaven: 46
@Wher

Dat klopt, maar is niet flexibel/variabel.
 
Inderdaad, niet variabel, eigenlijk "ad hoc" geschreven voor het voorbeeld.
Maar als ik je code uit post 14 test, lijkt hij enkel te werken indien de CurrentRegion een "vierkante" range betreft, dus evenveel rijen als kolommen.
Misschien is deze variatie dan flexibeler en ook toepasbaar op ranges met aantal rijen <> aantal kolommen:

Code:
Sub M_snb()
    sn = Cells(1).CurrentRegion
    Cells(1).CurrentRegion.Offset(15) = Application.MMult(sn, Evaluate("(row(1:" & UBound(sn, 2) & ")=column(1:" & UBound(sn, 2) & "))*10"))
End Sub
 
Laatst bewerkt:
Ik dacht dat je de evaluate methode niet wilde gebruiken.

Code:
Cells(1).CurrentRegion.Name = "bereik"
    Cells(1).CurrentRegion.Offset(20) = Evaluate("bereik * 10")
 
@wher

Je hebt 100% gelijk.


@HSV

Ik was op zoek naar een werkbladfunktie (zie #1).
Dat binnen die werkbladfunktie gebruik gemaakt wordt van evaluate heb ik niet uitgesloten.
 
Status
Niet open voor verdere reacties.
Steun Ons

Nieuwste berichten

Terug
Bovenaan Onderaan