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

1157

    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. 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 r
      Ikävä
      34
      5308
    2. Outoa että Trump ekana sanoutui irti ilmastosopimuksesta

      kun Kaliforniaa riepottelee siitä johtuvat tuhoisat maastopalot. Hirmumyrskytkin ovat USA:ssa olleet tuhoisia.
      Maailman menoa
      484
      2474
    3. Eli jos toisen hiki haisee ns. omaan nenään siedettävältä

      Se kertoo hyvästä yhteensopivuudesta. Selvä! Olet mies minun. 🫵🥳
      Ikävä
      27
      1219
    4. JOKO OLETTE KUULLET, MITÄ KIURUVEDELLÄ ON SATTUNUT!

      Oletteko jo kuulleet, mitä Kiuruvedellä on sattunut, voi hyvänen aika? Aivan viime tuntien aikana olisi sattunut, jos t
      Kiuruvesi
      5
      992
    5. En tiedä miksi kerroin sinusta täällä

      Siksi kai, kun meidän juttu on niin alkuvaiheessa, etten voi vielä puhua siitä kenellekään.
      Tunteet
      16
      947
    6. Oho! 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ää: http
      Mainonta ja markkinointi
      7
      924
    7. Nainen, 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äv
      Ikävä
      41
      802
    8. HS - 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 ei
      Maailman menoa
      193
      774
    9. Ei ois kyllä kivaa

      Jos miestä ei kiinnostais ollenkaan minun seura. Aina huitelis ties missä tai olis omassa seurassaan. Kaikki muu ois kiv
      Ikävä
      3
      764
    10. Siellä taas pyörin

      Nimittäin sinun paikkakunnalla mies. Mutta en vieläkään nähnyt sinua. Miksi sinä olet minulta aina piilossa?
      Tunteet
      8
      713
    Aihe