Jah, nyt olisi taas kysymys vba user defined funktioista:
Pitääkö kaikki argumentit antaa funktiota kutsuttaessa, vai voiko funktio hakea lisää argumentteja excel taulukosta funktiota kutsuttaessa annettujen argumenttien perusteella?
Esim.
Passaan funktiolle arvot a, b ja c.
minulla on 20 taulukkoa, jossa on 10 riviä ja 8 saraketta. Sarakkeissa on arvot P,L,M,N,R,X,Y ja Z, jotka muuttuvat rivin mukaan. Nämä taulukot voisivat kai olla funktion sisältävän moduulin yhteydessä olevalla sivulla?
a määrittelee mistä taulukosta haetaan arvot, b määrittelee miltä riviltä arvot haetaan.
Funktion pitäisi antaa arvo joka on laskettu arvojen b, c, P, L, M, N, R, X, Y ja Z perusteella.
Onko tämä mahdollista ja miten?
Odottelen vastauksia taulukkolaskennan ihmeellisen maailman mykistämänä..
vba Funktiot
13
1157
Vastaukset
- nimimerkki
> vba user defined funktioista:
>Pitääkö kaikki argumentit antaa funktiota kutsuttaessa,
>vai voiko funktio hakea lisää argumentteja excel taulukosta
Viitaamalla taulukon soluun voi hakea taulukosta lisää arvoja argumenttien lisäksi,
muuttujaX = Sheets("Sheet1").Range("B5").Value
> annettujen argumenttien perusteella
käytä muuttujia noiden sanojen "Sheet1" ja "B5" tilalla,
muuttujaX = Sheets(argumenttiTaulukonNimi).Range(argumenttiSarake & argumenttiRivi).Value
> Funktion pitäisi antaa arvo joka on laskettu arvojen
> b, c, P, L, M, N, R, X, Y ja Z perusteella.
Jos arvot ovat laskettu valmiiksi sarakkeille P,L,M....
Public Function haeArvo(taulukosta As String, rivi As Integer, sarake As String)
haeArvo = Sheets(taulukosta).Range(sarake & rivi).Value
End Function
Ja kutsut tuota funktiota työkirjasta : =haeArvo("Sheet1";5;"P")
Jos taas haluat funktion sisällä tehdä laskutoimituksia, hae arvot ensin taulukosta ja tehe tarpeeliset laskutoimitukset ja lopuksi palauta haluamasi arvo.
Public Function haeArvo(taulukosta As String, rivi As Integer)
muuttujaP = Sheets(taulukosta).Range("P" & rivi).Value
muuttujaQ = Sheets(taulukosta).Range("Q" & rivi).Value
...( hae loput tarvitsemasi arvot )
...( tehe tarpeeliset laskutoimitukset )
...( palauta haluttu arvo )
End Function- FunkyFunction
En saa jostain syystä toimimaan, antaa virheilmoituksen: "Sub or Function not defined"
Vaikka kirjoittaisin suoraan halutun solun sinne funktioon tekee saman, kokeilin siis saada toimimaan Vlookup funktiolla tuolta oman funktion sisältä.
Kiitoksia kuitenkin yrityksestä, vika taitaa olla tässä päässä.. - Nimimerkki
FunkyFunction kirjoitti:
En saa jostain syystä toimimaan, antaa virheilmoituksen: "Sub or Function not defined"
Vaikka kirjoittaisin suoraan halutun solun sinne funktioon tekee saman, kokeilin siis saada toimimaan Vlookup funktiolla tuolta oman funktion sisältä.
Kiitoksia kuitenkin yrityksestä, vika taitaa olla tässä päässä..Ekas kokeillaan mitä saat toimimaan:
1. ihan perus juttu, laita moduliin:
Function annaVastaus()
annaVastaus = "Funktio toimii oikein"
End Function
Ja soluun B2:
=annaVastaus()
soluun B2 pitäisi tulla nyt: Funktio toimii oikein
2. ja argumenttien kanssa (alkuperäinen kysymys), moduliin
Function haeArvo(taulukosta As String, rivi As Integer, sarake As String)
haeArvo = Sheets(taulukosta).Range(sarake & rivi).Value
End Function
Taulukkoon Sheet1, soluun C5 vaikka: Täällä ollaan
ja B3 soluun:
=haeArvo("Sheet1";5;"C")
soluun B3 pitäisi tulla nyt: Täällä ollaan
Oliko ongelmia ?
Jos kumpikin meni läpi niin ongelma esiintyy muualla kun alkuperäisessä kysymyksessä, ilmeisesti sinun omassa koodissa on jotain hämminkiä, laita koodi tänne ja yritä selvittää mitä haluat tuolla koodilla tehdä ? - FunkyFunktio
Nimimerkki kirjoitti:
Ekas kokeillaan mitä saat toimimaan:
1. ihan perus juttu, laita moduliin:
Function annaVastaus()
annaVastaus = "Funktio toimii oikein"
End Function
Ja soluun B2:
=annaVastaus()
soluun B2 pitäisi tulla nyt: Funktio toimii oikein
2. ja argumenttien kanssa (alkuperäinen kysymys), moduliin
Function haeArvo(taulukosta As String, rivi As Integer, sarake As String)
haeArvo = Sheets(taulukosta).Range(sarake & rivi).Value
End Function
Taulukkoon Sheet1, soluun C5 vaikka: Täällä ollaan
ja B3 soluun:
=haeArvo("Sheet1";5;"C")
soluun B3 pitäisi tulla nyt: Täällä ollaan
Oliko ongelmia ?
Jos kumpikin meni läpi niin ongelma esiintyy muualla kun alkuperäisessä kysymyksessä, ilmeisesti sinun omassa koodissa on jotain hämminkiä, laita koodi tänne ja yritä selvittää mitä haluat tuolla koodilla tehdä ?Function testi(taulukko As String, mm As Integer)
Dim P, L as double
P = Workbooks("TestiWb").Sheets(taulukko).Range(Application.WorksheetFunction.VLookup(mm, "b2:j11", 2)).Value
L = Workbooks("TestiWb").Sheets(taulukko).Range(Application.WorksheetFunction.VLookup(mm, "b2:j11", 3)).Value
Testi = P L * mm
End Function
Eli miten saan tuon VLookup funktion toimimaan oman funktioni sisältä?
Eli Tarkoitus olisi hakea samanlaisista taulukoista (joita on kymmeniä tallennettuna erilliseen työkirjaan "TestiWb", kukin omalle sivulleen) taulukon nimen perusteella valitulta sivulta (tämä siis onnistuu jo) argumentin mm perusteella valitulta riviltä kahdeksan sarakkeen sisältämät arvot, joita käytetään laskutoimituksessa argumentin mm lisäksi.
Onko tuossa koodissa joku nyt ihan vinksallaan, kyllä Vb ohjeesta tavasin että näin pitäisi toimia.. Viitaus toiseen työkirjaan toimi, kunnes lisäsin tuon VLookup funktion niiden rivi ja sarake argumenttien sijasta.
Lisäksi olisi suotavaa, että saan tämän koodin tallennettua AddIn:ksi koneelle, eikä välttämättä jokaiseen työkirjaan.
Jatkan harjoituksia maanisen taulukkolaskennan merkeissä odotellessani vastausta. - Nimimerkki
FunkyFunktio kirjoitti:
Function testi(taulukko As String, mm As Integer)
Dim P, L as double
P = Workbooks("TestiWb").Sheets(taulukko).Range(Application.WorksheetFunction.VLookup(mm, "b2:j11", 2)).Value
L = Workbooks("TestiWb").Sheets(taulukko).Range(Application.WorksheetFunction.VLookup(mm, "b2:j11", 3)).Value
Testi = P L * mm
End Function
Eli miten saan tuon VLookup funktion toimimaan oman funktioni sisältä?
Eli Tarkoitus olisi hakea samanlaisista taulukoista (joita on kymmeniä tallennettuna erilliseen työkirjaan "TestiWb", kukin omalle sivulleen) taulukon nimen perusteella valitulta sivulta (tämä siis onnistuu jo) argumentin mm perusteella valitulta riviltä kahdeksan sarakkeen sisältämät arvot, joita käytetään laskutoimituksessa argumentin mm lisäksi.
Onko tuossa koodissa joku nyt ihan vinksallaan, kyllä Vb ohjeesta tavasin että näin pitäisi toimia.. Viitaus toiseen työkirjaan toimi, kunnes lisäsin tuon VLookup funktion niiden rivi ja sarake argumenttien sijasta.
Lisäksi olisi suotavaa, että saan tämän koodin tallennettua AddIn:ksi koneelle, eikä välttämättä jokaiseen työkirjaan.
Jatkan harjoituksia maanisen taulukkolaskennan merkeissä odotellessani vastausta.Kaikkia asioita minä en tiedä, mutta minun silmissä tuo näyttää epäilyttävältä, haetaan ensisijaisesti "rangea" viittaamalla johonkin arvoon, perustelut:
Workbooks("TestiWb").Sheets(taulukko).Range(...).Value
Tuossa kolmen pisteen paikalla pitäisi olla viittaus soluun, tai joku muuttuja tai funktio joka palauttaa sellaisen merkki jonon joka vastaa solun viittausta kuten merkkijonot A1 tai B5 jne.
Nyt kuitenkin tuossa kolmen pisteen paikalla on
Application.WorksheetFunction.VLookup(mm, "b2:j11", 3)
joka palautta vain jonkun numeron, eikä numero riitä tulkittavaksi solun viittaukseksi, voisi onnistua jos tuo VLookup palauttaisi esimerkiksi "B2" merkkijonon.
Loogisesti tuon voisi kääntää toisinpäin, haetaan nimen omaan arvoa ensisijaisesti, ei rangea. En tiedä toimiiko, mutta yritä kumminkin ensin:
P = Application.WorksheetFunction.VLookup(mm, "[TestiWb.xls]" & taulukko & "!" & "b2:j11", 2)
L = Application.WorksheetFunction.VLookup(mm, "[TestiWb.xls]" & taulukko & "!" & "b2:j11", 3)
-----------
Jos edellinen ei toiminut niin.
Jos oikein tulkitsin tuota ( VLookup ) niin tiedät mistä sarakkeesta ( 2 = C sarake, 3 = D sarake) haluat hakea tuon arvon, mutta rivi on se joka aiheuttaa ongelmia. Tuo rivi kannattaa selvittää funktiossa ensin erikseen ja laittaa se muuttujaan, jonka jälkeen voidaan viitata haluttuihin arvoihin ja palauttaa funktion arvo seuraavasti:
haluttuRivi =
P = Workbooks("TestiWb").Sheets(taulukko).Range("C" & haluttuRivi).Value
L = Workbooks("TestiWb").Sheets(taulukko).Range("D" & haluttuRivi).Value
Testi = P L * mm
Miten tuo rivi sitten saadaan selville. Kaikista helpointa olisi jos tuon rivin voisi loogisesti päätellä tuosta muuttujasta mm, esim. mm olisi millimetriä ja rivit millimetrien välein alkaen riviltä kaksi, jolloin haluttuRivi = mm 1. Voisi olla myös 10 millimetrin välein (10,20,30,...) jolloin haluttuRivi = ( mm/10 ) 1
Jos tuota ei saa loogisesti selville niin sitten vaikka Find komennolla selvitetään missä solussa ( huomaa sinun pitää selvittää solu, ei yksittäistä arvoa solussa kuten VLookup tekee) ja tuon solun rivin numero, ja tuo rivin numero laitetaan sitten muuttujaan haluttuRivi:
haluttuRivi = Workbooks("TestiWb").Sheets(taulukko).Range("B1:B11").Find( _
What:=mm _
After:= Workbooks("TestiWb").Sheets(taulukko).Range("B1"), _
LookIn:=xlValues, _
LookAt:=xlWhole, _
SearchOrder:=xlByRows, _
SearchDirection:=xlNext, _
MatchCase:=False).Row
Ja tuosta kokonaisuus olisi;
Function testi(taulukko As String, mm As Integer)
Dim haluttuRivi as integer
Dim P as double
Dim L as double
haluttuRivi = Workbooks("TestiWb").Sheets(taulukko).Range("B1:B11").Find( _
What:=mm _
After:= Workbooks("TestiWb").Sheets(taulukko).Range("B1"), _
LookIn:=xlValues, _
LookAt:=xlWhole, _
SearchOrder:=xlByRows, _
SearchDirection:=xlNext, _
MatchCase:=False).Row
P = Workbooks("TestiWb").Sheets(taulukko).Range("C" & haluttuRivi).Value
L = Workbooks("TestiWb").Sheets(taulukko).Range("D" & haluttuRivi).Value
Testi = P L * mm
End Function
En testannut tuota, jos tulee virheilmoituksia, tarkista ensin helpistä Find metodi, ja kysy sitten lisää jos et saa toimimaan.
Huomaa myös P ei ole double jos et niin erikseen määritä, helpistä:
You can declare several variables in one statement. To specify a data type, you must include the data type for each variable. In the following statement, the variables intX, intY, and intZ are declared as type Integer.
Dim intX As Integer, intY As Integer, intZ As Integer
In the following statement, intX and intY are declared as type Variant; only intZ is declared as type Integer.
Dim intX, intY, intZ As Integer - Nimimerkki
Nimimerkki kirjoitti:
Kaikkia asioita minä en tiedä, mutta minun silmissä tuo näyttää epäilyttävältä, haetaan ensisijaisesti "rangea" viittaamalla johonkin arvoon, perustelut:
Workbooks("TestiWb").Sheets(taulukko).Range(...).Value
Tuossa kolmen pisteen paikalla pitäisi olla viittaus soluun, tai joku muuttuja tai funktio joka palauttaa sellaisen merkki jonon joka vastaa solun viittausta kuten merkkijonot A1 tai B5 jne.
Nyt kuitenkin tuossa kolmen pisteen paikalla on
Application.WorksheetFunction.VLookup(mm, "b2:j11", 3)
joka palautta vain jonkun numeron, eikä numero riitä tulkittavaksi solun viittaukseksi, voisi onnistua jos tuo VLookup palauttaisi esimerkiksi "B2" merkkijonon.
Loogisesti tuon voisi kääntää toisinpäin, haetaan nimen omaan arvoa ensisijaisesti, ei rangea. En tiedä toimiiko, mutta yritä kumminkin ensin:
P = Application.WorksheetFunction.VLookup(mm, "[TestiWb.xls]" & taulukko & "!" & "b2:j11", 2)
L = Application.WorksheetFunction.VLookup(mm, "[TestiWb.xls]" & taulukko & "!" & "b2:j11", 3)
-----------
Jos edellinen ei toiminut niin.
Jos oikein tulkitsin tuota ( VLookup ) niin tiedät mistä sarakkeesta ( 2 = C sarake, 3 = D sarake) haluat hakea tuon arvon, mutta rivi on se joka aiheuttaa ongelmia. Tuo rivi kannattaa selvittää funktiossa ensin erikseen ja laittaa se muuttujaan, jonka jälkeen voidaan viitata haluttuihin arvoihin ja palauttaa funktion arvo seuraavasti:
haluttuRivi =
P = Workbooks("TestiWb").Sheets(taulukko).Range("C" & haluttuRivi).Value
L = Workbooks("TestiWb").Sheets(taulukko).Range("D" & haluttuRivi).Value
Testi = P L * mm
Miten tuo rivi sitten saadaan selville. Kaikista helpointa olisi jos tuon rivin voisi loogisesti päätellä tuosta muuttujasta mm, esim. mm olisi millimetriä ja rivit millimetrien välein alkaen riviltä kaksi, jolloin haluttuRivi = mm 1. Voisi olla myös 10 millimetrin välein (10,20,30,...) jolloin haluttuRivi = ( mm/10 ) 1
Jos tuota ei saa loogisesti selville niin sitten vaikka Find komennolla selvitetään missä solussa ( huomaa sinun pitää selvittää solu, ei yksittäistä arvoa solussa kuten VLookup tekee) ja tuon solun rivin numero, ja tuo rivin numero laitetaan sitten muuttujaan haluttuRivi:
haluttuRivi = Workbooks("TestiWb").Sheets(taulukko).Range("B1:B11").Find( _
What:=mm _
After:= Workbooks("TestiWb").Sheets(taulukko).Range("B1"), _
LookIn:=xlValues, _
LookAt:=xlWhole, _
SearchOrder:=xlByRows, _
SearchDirection:=xlNext, _
MatchCase:=False).Row
Ja tuosta kokonaisuus olisi;
Function testi(taulukko As String, mm As Integer)
Dim haluttuRivi as integer
Dim P as double
Dim L as double
haluttuRivi = Workbooks("TestiWb").Sheets(taulukko).Range("B1:B11").Find( _
What:=mm _
After:= Workbooks("TestiWb").Sheets(taulukko).Range("B1"), _
LookIn:=xlValues, _
LookAt:=xlWhole, _
SearchOrder:=xlByRows, _
SearchDirection:=xlNext, _
MatchCase:=False).Row
P = Workbooks("TestiWb").Sheets(taulukko).Range("C" & haluttuRivi).Value
L = Workbooks("TestiWb").Sheets(taulukko).Range("D" & haluttuRivi).Value
Testi = P L * mm
End Function
En testannut tuota, jos tulee virheilmoituksia, tarkista ensin helpistä Find metodi, ja kysy sitten lisää jos et saa toimimaan.
Huomaa myös P ei ole double jos et niin erikseen määritä, helpistä:
You can declare several variables in one statement. To specify a data type, you must include the data type for each variable. In the following statement, the variables intX, intY, and intZ are declared as type Integer.
Dim intX As Integer, intY As Integer, intZ As Integer
In the following statement, intX and intY are declared as type Variant; only intZ is declared as type Integer.
Dim intX, intY, intZ As IntegerNo niin, testasin tuon ekan ehdotuksen:
P = Application.WorksheetFunction.VLookup(mm, "[TestiWb.xls]" & taulukko & "!" & "b2:j11", 2)
L = Application.WorksheetFunction.VLookup(mm, "[TestiWb.xls]" & taulukko & "!" & "b2:j11", 3)
Tuo ei onnistunut ihan noin kirjoittamalla, mutta ohjeista sain vinkin:
---
WorksheetFunction Property Example
This example displays the result of applying the Min worksheet function to the range A1:A10.
Set myRange = Worksheets("Sheet1").Range("A1:C10")
answer = Application.WorksheetFunction.Min(myRange)
---
tuossa käytetään ns. "apu" Range oliota, samma tekniikkaa käyttäen sain toimiin näin ( oma testi ):
Sub testiKlik()
Dim taulukko As String
Dim haettava As Double
taulukko = "Sheet1"
haettava = 22
Set apuRange = Workbooks("Workbook1.xls").Sheets(taulukko).Range("B1:D15")
Luku = Application.WorksheetFunction.VLookup(haettava, apuRange, 2)
Sheet1.Range("E26").Value = Luku
End Sub
Joten jos sinä laitat alla olevan koodin itsellesi, niin pitäisi toimia:
Function testi(taulukko As String, mm As Double)
Dim apuRange as Range
Dim P as Double
Dim L as Double
apuRange = Workbooks("TestiWb.xls").Sheets(taulukko).Range("B2:J11")
P = Application.WorksheetFunction.VLookup(mm, apuRange, 2)
L = Application.WorksheetFunction.VLookup(mm, apuRange, 3)
Testi = P L * mm
End Function
Jos tuo ei onnistu niin sitten tarvitaan jonkun muun apua. - Nimimerkki
Nimimerkki kirjoitti:
No niin, testasin tuon ekan ehdotuksen:
P = Application.WorksheetFunction.VLookup(mm, "[TestiWb.xls]" & taulukko & "!" & "b2:j11", 2)
L = Application.WorksheetFunction.VLookup(mm, "[TestiWb.xls]" & taulukko & "!" & "b2:j11", 3)
Tuo ei onnistunut ihan noin kirjoittamalla, mutta ohjeista sain vinkin:
---
WorksheetFunction Property Example
This example displays the result of applying the Min worksheet function to the range A1:A10.
Set myRange = Worksheets("Sheet1").Range("A1:C10")
answer = Application.WorksheetFunction.Min(myRange)
---
tuossa käytetään ns. "apu" Range oliota, samma tekniikkaa käyttäen sain toimiin näin ( oma testi ):
Sub testiKlik()
Dim taulukko As String
Dim haettava As Double
taulukko = "Sheet1"
haettava = 22
Set apuRange = Workbooks("Workbook1.xls").Sheets(taulukko).Range("B1:D15")
Luku = Application.WorksheetFunction.VLookup(haettava, apuRange, 2)
Sheet1.Range("E26").Value = Luku
End Sub
Joten jos sinä laitat alla olevan koodin itsellesi, niin pitäisi toimia:
Function testi(taulukko As String, mm As Double)
Dim apuRange as Range
Dim P as Double
Dim L as Double
apuRange = Workbooks("TestiWb.xls").Sheets(taulukko).Range("B2:J11")
P = Application.WorksheetFunction.VLookup(mm, apuRange, 2)
L = Application.WorksheetFunction.VLookup(mm, apuRange, 3)
Testi = P L * mm
End Function
Jos tuo ei onnistu niin sitten tarvitaan jonkun muun apua."Set" sana jäi pois edellisessä viestissä, toivottavasti ei ole muita kirjoitusvirheitä, mutta näin:
Function testi(taulukko As String, mm As Double)
Dim apuRange as Range
Dim P as Double
Dim L as Double
Set apuRange = Workbooks("TestiWb.xls").Sheets(taulukko).Range("B2:J11")
P = Application.WorksheetFunction.VLookup(mm, apuRange, 2)
L = Application.WorksheetFunction.VLookup(mm, apuRange, 3)
Testi = P L * mm
End Function - FunkyFunktio
Nimimerkki kirjoitti:
Kaikkia asioita minä en tiedä, mutta minun silmissä tuo näyttää epäilyttävältä, haetaan ensisijaisesti "rangea" viittaamalla johonkin arvoon, perustelut:
Workbooks("TestiWb").Sheets(taulukko).Range(...).Value
Tuossa kolmen pisteen paikalla pitäisi olla viittaus soluun, tai joku muuttuja tai funktio joka palauttaa sellaisen merkki jonon joka vastaa solun viittausta kuten merkkijonot A1 tai B5 jne.
Nyt kuitenkin tuossa kolmen pisteen paikalla on
Application.WorksheetFunction.VLookup(mm, "b2:j11", 3)
joka palautta vain jonkun numeron, eikä numero riitä tulkittavaksi solun viittaukseksi, voisi onnistua jos tuo VLookup palauttaisi esimerkiksi "B2" merkkijonon.
Loogisesti tuon voisi kääntää toisinpäin, haetaan nimen omaan arvoa ensisijaisesti, ei rangea. En tiedä toimiiko, mutta yritä kumminkin ensin:
P = Application.WorksheetFunction.VLookup(mm, "[TestiWb.xls]" & taulukko & "!" & "b2:j11", 2)
L = Application.WorksheetFunction.VLookup(mm, "[TestiWb.xls]" & taulukko & "!" & "b2:j11", 3)
-----------
Jos edellinen ei toiminut niin.
Jos oikein tulkitsin tuota ( VLookup ) niin tiedät mistä sarakkeesta ( 2 = C sarake, 3 = D sarake) haluat hakea tuon arvon, mutta rivi on se joka aiheuttaa ongelmia. Tuo rivi kannattaa selvittää funktiossa ensin erikseen ja laittaa se muuttujaan, jonka jälkeen voidaan viitata haluttuihin arvoihin ja palauttaa funktion arvo seuraavasti:
haluttuRivi =
P = Workbooks("TestiWb").Sheets(taulukko).Range("C" & haluttuRivi).Value
L = Workbooks("TestiWb").Sheets(taulukko).Range("D" & haluttuRivi).Value
Testi = P L * mm
Miten tuo rivi sitten saadaan selville. Kaikista helpointa olisi jos tuon rivin voisi loogisesti päätellä tuosta muuttujasta mm, esim. mm olisi millimetriä ja rivit millimetrien välein alkaen riviltä kaksi, jolloin haluttuRivi = mm 1. Voisi olla myös 10 millimetrin välein (10,20,30,...) jolloin haluttuRivi = ( mm/10 ) 1
Jos tuota ei saa loogisesti selville niin sitten vaikka Find komennolla selvitetään missä solussa ( huomaa sinun pitää selvittää solu, ei yksittäistä arvoa solussa kuten VLookup tekee) ja tuon solun rivin numero, ja tuo rivin numero laitetaan sitten muuttujaan haluttuRivi:
haluttuRivi = Workbooks("TestiWb").Sheets(taulukko).Range("B1:B11").Find( _
What:=mm _
After:= Workbooks("TestiWb").Sheets(taulukko).Range("B1"), _
LookIn:=xlValues, _
LookAt:=xlWhole, _
SearchOrder:=xlByRows, _
SearchDirection:=xlNext, _
MatchCase:=False).Row
Ja tuosta kokonaisuus olisi;
Function testi(taulukko As String, mm As Integer)
Dim haluttuRivi as integer
Dim P as double
Dim L as double
haluttuRivi = Workbooks("TestiWb").Sheets(taulukko).Range("B1:B11").Find( _
What:=mm _
After:= Workbooks("TestiWb").Sheets(taulukko).Range("B1"), _
LookIn:=xlValues, _
LookAt:=xlWhole, _
SearchOrder:=xlByRows, _
SearchDirection:=xlNext, _
MatchCase:=False).Row
P = Workbooks("TestiWb").Sheets(taulukko).Range("C" & haluttuRivi).Value
L = Workbooks("TestiWb").Sheets(taulukko).Range("D" & haluttuRivi).Value
Testi = P L * mm
End Function
En testannut tuota, jos tulee virheilmoituksia, tarkista ensin helpistä Find metodi, ja kysy sitten lisää jos et saa toimimaan.
Huomaa myös P ei ole double jos et niin erikseen määritä, helpistä:
You can declare several variables in one statement. To specify a data type, you must include the data type for each variable. In the following statement, the variables intX, intY, and intZ are declared as type Integer.
Dim intX As Integer, intY As Integer, intZ As Integer
In the following statement, intX and intY are declared as type Variant; only intZ is declared as type Integer.
Dim intX, intY, intZ As IntegerFunction testi(taulukko As String, mm As Integer)
Dim P As Double, L As Double
P = Application.WorksheetFunction.VLookup(mm, Workbooks("TestiWb").Sheets(taulukko).Range("b2:j11"), 2)
L = Application.WorksheetFunction.VLookup(mm, Workbooks("TestiWb").Sheets(taulukko).Range("b2:j11"), 3)
testi = P L * mm
End Function
Tuolla sain sen VLookup funktion toimimaan, se aikaisempi yrityksenihän erehtyi kysymyksessä : kumpi oli ensin kana vai muna! :)
Ei kai viittausta voi tuolleen pätkiä pitkin lauseketta..
Kiitos avusta, nyt ei muuta kuin sijoittelemaan arvoja laskutoimitukseen!
En lakkaa hämmästelemästä taulukkolaskennan mahdollisuuksia koskaan! - Nimimerkki
FunkyFunktio kirjoitti:
Function testi(taulukko As String, mm As Integer)
Dim P As Double, L As Double
P = Application.WorksheetFunction.VLookup(mm, Workbooks("TestiWb").Sheets(taulukko).Range("b2:j11"), 2)
L = Application.WorksheetFunction.VLookup(mm, Workbooks("TestiWb").Sheets(taulukko).Range("b2:j11"), 3)
testi = P L * mm
End Function
Tuolla sain sen VLookup funktion toimimaan, se aikaisempi yrityksenihän erehtyi kysymyksessä : kumpi oli ensin kana vai muna! :)
Ei kai viittausta voi tuolleen pätkiä pitkin lauseketta..
Kiitos avusta, nyt ei muuta kuin sijoittelemaan arvoja laskutoimitukseen!
En lakkaa hämmästelemästä taulukkolaskennan mahdollisuuksia koskaan!Tuo näyttää hyvältä, paljon paremmalt kun noi minun viritelmät, joista osa ei edes toiminut.
Hienioa että sait toimimaa. Ja kiitos aiheen kuittaamisesta, se on kiva tapa, näin ei jää epätietoiseksi tarvitaanko lisä apua vai ei. FunkyFunktio kirjoitti:
Function testi(taulukko As String, mm As Integer)
Dim P As Double, L As Double
P = Application.WorksheetFunction.VLookup(mm, Workbooks("TestiWb").Sheets(taulukko).Range("b2:j11"), 2)
L = Application.WorksheetFunction.VLookup(mm, Workbooks("TestiWb").Sheets(taulukko).Range("b2:j11"), 3)
testi = P L * mm
End Function
Tuolla sain sen VLookup funktion toimimaan, se aikaisempi yrityksenihän erehtyi kysymyksessä : kumpi oli ensin kana vai muna! :)
Ei kai viittausta voi tuolleen pätkiä pitkin lauseketta..
Kiitos avusta, nyt ei muuta kuin sijoittelemaan arvoja laskutoimitukseen!
En lakkaa hämmästelemästä taulukkolaskennan mahdollisuuksia koskaan!funktiohan palauttaa arvon, jota voi käyttää vertailuissa yms.
lisäämällä funktioon palautustyypin se on käytännöllinen esim. tyyliin
Public Function testi(taulukko As String, mm As Integer) As Double
Dim P As Double, L As Double
P = Application.WorksheetFunction.VLookup(mm, Workbooks("TestiWb").Sheets(taulukko).Range("b2:j11"), 2)
L = Application.WorksheetFunction.VLookup(mm, Workbooks("TestiWb").Sheets(taulukko).Range("b2:j11"), 3)
testi = P L * mm
End Function- FunkyFunktio
kunde kirjoitti:
funktiohan palauttaa arvon, jota voi käyttää vertailuissa yms.
lisäämällä funktioon palautustyypin se on käytännöllinen esim. tyyliin
Public Function testi(taulukko As String, mm As Integer) As Double
Dim P As Double, L As Double
P = Application.WorksheetFunction.VLookup(mm, Workbooks("TestiWb").Sheets(taulukko).Range("b2:j11"), 2)
L = Application.WorksheetFunction.VLookup(mm, Workbooks("TestiWb").Sheets(taulukko).Range("b2:j11"), 3)
testi = P L * mm
End FunctionNo niin, kittos nimimerkin ja kunden avun, olen nyt päässyt alkuun ja saanut funktion toimimaan ja laskemaan.
Mutta..
Olen nyt tallentanut funktion sisältämän moduulin työkirjaan "Taulukot.Xla" AddIns kansiossa, josta se toimii moitteettomasti kaikissa työkirjoissa joista kyseistä funktiota kutsutaan. Siis niin kauan kun se työkirja, jossa funktion tarvitsemat taulukot ovat on avattuna. Jos yritän muuttaa Taulukot.Xls:n Taulukot.Xla:ksi, funktio palauttaa arvon #VALUE, joka ei ole aivan täsmälleen sitä mitä haen..
Onko mahdollista viitata .xla muodossa tallennetun työkirjan sisältämiin sivuihin? tällöin voisin tallentaa ne samaan työkirjaan missä funktion sisältävä moduulikin on.
-Vinkki-
Jos harkitset tupakoinnin lopettamista, käytä taulukkolaskentaa vieroitukseen, se auttaa varmasti! FunkyFunktio kirjoitti:
No niin, kittos nimimerkin ja kunden avun, olen nyt päässyt alkuun ja saanut funktion toimimaan ja laskemaan.
Mutta..
Olen nyt tallentanut funktion sisältämän moduulin työkirjaan "Taulukot.Xla" AddIns kansiossa, josta se toimii moitteettomasti kaikissa työkirjoissa joista kyseistä funktiota kutsutaan. Siis niin kauan kun se työkirja, jossa funktion tarvitsemat taulukot ovat on avattuna. Jos yritän muuttaa Taulukot.Xls:n Taulukot.Xla:ksi, funktio palauttaa arvon #VALUE, joka ei ole aivan täsmälleen sitä mitä haen..
Onko mahdollista viitata .xla muodossa tallennetun työkirjan sisältämiin sivuihin? tällöin voisin tallentaa ne samaan työkirjaan missä funktion sisältävä moduulikin on.
-Vinkki-
Jos harkitset tupakoinnin lopettamista, käytä taulukkolaskentaa vieroitukseen, se auttaa varmasti!eikös se tuolta käsin toimi kaikissa työkirjoissa. Eli tallenna Taulukot.xls sinne
- FunkyFunktio
kunde kirjoitti:
eikös se tuolta käsin toimi kaikissa työkirjoissa. Eli tallenna Taulukot.xls sinne
Kysymys siis kuului:
Onko mahdollista viitata .xla muodossa tallennetun työkirjan sisältämiin sivuihin?
Eli kun tallennan työkirjan, jossa on moduuli funktioineen, voinko jotenkin viitata tämän työkirjan sivuihin kun se on tallennettu Add-in:ksi?
Ketjusta on poistettu 0 sääntöjenvastaista viestiä.
Luetuimmat keskustelut
Hetken jo luulin, että en ikävöi sinua koko aikaa
Mutta nyt on sitten taas ihan hirveä ikävä jotenkin. Tiedätköhän sinä edes, kuinka peruuttamattomasti minä olen sinuun r345308Outoa että Trump ekana sanoutui irti ilmastosopimuksesta
kun Kaliforniaa riepottelee siitä johtuvat tuhoisat maastopalot. Hirmumyrskytkin ovat USA:ssa olleet tuhoisia.4842474Eli jos toisen hiki haisee ns. omaan nenään siedettävältä
Se kertoo hyvästä yhteensopivuudesta. Selvä! Olet mies minun. 🫵🥳271219JOKO OLETTE KUULLET, MITÄ KIURUVEDELLÄ ON SATTUNUT!
Oletteko jo kuulleet, mitä Kiuruvedellä on sattunut, voi hyvänen aika? Aivan viime tuntien aikana olisi sattunut, jos t5992En tiedä miksi kerroin sinusta täällä
Siksi kai, kun meidän juttu on niin alkuvaiheessa, etten voi vielä puhua siitä kenellekään.16947Oho! Queen of Fucking Everything villitsee - Ikean sininen luottotuote nappasi hervottoman idean!
Ikea on ajan hermoilla! Aika hauska idea ja Queen of Fucking Everything -ajatus toimii hyvin tässäkin. Lue lisää: http7924Nainen, tunnetko saman kuin minä
Syvän yhteyden välillämme, silloin kun se tunne tulee. Niinä hetkinä minulla on niin järjettömän suuri ikävä sinua. Ikäv41802HS - Yllätyskäänne Eagle S -tutkinnassa, Supo pitää onnettomuutena
HS:n mukaan esitutkinta joudutaan todennäköisesti keskeyttämään syyttäjän päätöksellä mikäli näyttöä tahallisuudesta ei193774Ei ois kyllä kivaa
Jos miestä ei kiinnostais ollenkaan minun seura. Aina huitelis ties missä tai olis omassa seurassaan. Kaikki muu ois kiv3764Siellä taas pyörin
Nimittäin sinun paikkakunnalla mies. Mutta en vieläkään nähnyt sinua. Miksi sinä olet minulta aina piilossa?8713