vba Funktiot

FunkyFunktio

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ä..

13

1139

    Vastaukset

    Anonyymi (Kirjaudu / Rekisteröidy)
    5000
    • 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 Integer

        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.


      • 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 Integer

        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!


      • 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 Function

        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!


      • 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

    1. Kuvat! Dannyyn liitetty Helmi Loukasmäki, 22, on puhjennut naisena kukkaan - Some sekoaa: "Sä..."

      Ooo, kaunis aikuinen nainen Helmistä on kasvanut siinä yli 80-vuotiaan Dannyn rinnalla! Katso uudet kuvat: https://ww
      Suomalaiset julkkikset
      57
      4270
    2. Henkirikos Alakylässä

      Nainen löydetty elottomana, mies otettu kiinni. Mitä on tapahtunut?
      Seinäjoki
      47
      2911
    3. Suodatinpussin kastelemalla saa parempaa kahvia

      Kokeilin niksiä ja kyllä tämä kahvi on parempaa nyt. Ei lainkaan maistu paperiselta. Huljuttelee hanan alla suppiloa pap
      Maailman menoa
      132
      2185
    4. Tidätkö nainen

      että suoraan sanottuna v.tut.aa että pääsit näin lähelle minua. Ei olisi oikeasti aikaa tähän mutta silti aina välillä o
      Ikävä
      105
      1896
    5. Mikä on kaivattusi etunimi?

      Otsikossa siis on kysymys eriteltynä. Vain oikeat vastaukset hyväksytään.
      Ikävä
      68
      1410
    6. Onkohan sinulla kaikki hyvin?

      Nyt vähän sellainen outo tunne tuli. Sinun asiasi niin ei minulle toki tarvitse kertoa. Kunhan mietin...
      Ikävä
      38
      1177
    7. Viimeinen reissu tälle kesälle

      Pian se syksy on. Hyvää huomenta ja aurinkoista päivää. ☕🌞🍁🌻🐺❤️
      Ikävä
      173
      1066
    8. Huikeeta, mahtavaa, ihan mielettömän upeeta

      Me ostettiin talo Espanjasta. Tosin saadaan käyttää sitä vain muutama viikko vuodessa kun on monta muutakin ostajaa! M
      Kotimaiset julkkisjuorut
      188
      1062
    9. En kestä katsoa

      Sitä miten sinusta on muut kiinnostuneita. Olen kateellinen. Siksi pitäisi lähteä pois
      Ikävä
      87
      1048
    10. Oho! Arja Koriseva paljastaa TTK:n ekasta suorasta lähetyksestä: "On vähän ärsyttävä yhtälö!"

      Upea Arja Koriseva! Tsemppiä haasteelliseen tilanteeseen! Lue lisää: https://www.suomi24.fi/viihde/oho-arja-koriseva-
      Suomalaiset julkkikset
      16
      1022
    Aihe