Heippa!
Tein Excel 2003 versiolla ohjelman, joka mm. laskee kahden päivämäärän välisen työpäivien määrän. Nyt kun yritän suorittaa ohjelmaa Excel 2007 versiolla se ei enää toimikkaan kunnolla. Kun koodissani on networkdays(AlkuPvm, LoppuPvm, Lomalista) ja kun ajan sen, tulee herja:Sub or Function not defined. Mulla on Anylistools asennettuna ja atbvbaen.xls valittuna referensseissa. Kokeilin myös worksheetfunction.networkdays sekä application.worksheetfunction.networkdays, mutta silloin tulee herja: Luokan WorksheetFunction ominaisuuden Networkdays saanti ei onnistu.
Kun kokeilen ajaa tuota makroa, niin tuo herja siis tulee, mutta kun kuittaan herjan koodipuolella ja menen takaisin työkirjan puolelle, niin se on kuitenkin laskenut työpäivien määrän ihan oikein! Miten saan tämän toimimaan kunnolla?
Terveisin Mamma
Eli sinulla on tuo funktiomäärittely moduulilla (ei Excelin objekteille, kuten työkirja tai taulukko kirjoitettavalla koodilla) ja makrot on sallittu?
Ainakin itsellä toimii ihan ok.
http://grez.info/putka/mamma.xlsm
Heippa!
Kiitos Grez vastauksestasi. Tein tuon koodin siis VB-puolelle moduuliin. Katselin tuota sinun Grez excelia, jossa oli tuo kaava, mutta en ymmärtänyt sitä, koska networkdays-funktiossa pitä olla alkupäivämäärä, loppupäivämäärä sekä mahdollinen lomalista määriteltynä ja tuossa sinun kaavassa oli vain lukuja.
Tässä on pätkä koodiani, johon siis sen suoritus pysähtyy:
AlkuPvm = ActiveCell.Value
LoppuPvm = ActiveCell.Offset(0, 1).Value
LisattyPvm = ActiveCell.Offset(0, 3).Value
TyoPaivat = NetworkDays(LisattyPvm, LoppuPvm, Lomalista) - 1
Tämän koodin jälkeen tulee siis herja:
Sub or Function not defined
Ja sitten kun laitan siihen esim. worksheetfunction.networkdays tulee toinen herja:
Luokan WorksheetFunction ominaisuuden Networkdays saanti ei onnistu
En ymmärrä mikä tässä mättää kun kirjoitan tuota Worksheetfunction, niin se antaa vaihtoehdoksikin tuon networkdays-funktion, mutta kuitenkin se sitten herjaa vaikkakin laskee ihan oikein??
Terveisin Mamma
Jaa niin alkuperäisestä postauksesta ymmärsin että olisit tehnyt tuon Networkdays -funktion ja yrittänyt käyttää sitä työkirjalta, joten tein esimerkin jossa se onnistuu. Nyt kun tässä on englanninkielinen exceli niin huomaankin että networkdays on excelin vakiofunktio jota siis ilmeisesti haluaisit käyttää.
Itselläni toimii seuraava ihan ongelmitta sekä suomenkielisessä että englanninkielisessä excelissä:
AlkuPvm = ActiveCell.Value LoppuPvm = ActiveCell.Offset(0, 1).Value TyoPaivat = Application.WorksheetFunction.NetworkDays(AlkuPvm, LoppuPvm) - 1
Laittamassasi koodissa ei oltu määritelty tuota lomalista -muuttujaa, joten jätin sen pois.
Ehkä jos voit laittaa jonnekin ladattavaksi työkirjan jossa ongelma esiintyy, niin voisi tutkia tarkemmin.
Kiitos taas Grez! Nyt kokeilin koodiani niin, että otin sieltä sen lomalistan pois ja se toimii, mutta se antaa vääriä tuloksia, koska se ei ota huomioon niitä arkipyhiä. Minä en ymmärrä miksi se ei hyväksy sitä listaa? Minulla on lista: Lomalista = Array("1.1.2008", "21.3.2008", "24.3.2008", "1.5.2008", "25.12.2008", "26.12.2008", "1.1.2009", "6.1.2009", _
"10.4.2009", "13.4.2009", "1.5.2009", "21.5.2009", "19.6.2009", "24.12.2009", "25.12.2009", "1.1.2010", "6.1.2010", _
"2.4.2010", "5.4.2010", "13.5.2010", "6.12.2010", "1.1.2011", "6.1.2011", "22.4.2011", "24.4.2011", "25.4.2011", "1.5.2011", "2.6.2011", _
"12.6.2011", "25.6.2011", "5.11.2011", "6.12.2011", "25.12.2011", "26.12.2011")
Olen määritellyt alussa listan Dim Lomalista()
Mikä tässä nyt voi olla väärin, koska tämä toimi hyvin excel 2003 -versiossa?
Terveisin Mamma
Se ilmeisesti haluaa 3. parametriksi joko solualueen tai kokonaislukutaulukon. Seuraava toimii:
Dim Lomalista() As Long Lomatekstit = Array("1.1.2008", "21.3.2008", "24.3.2008", "1.5.2008", "25.12.2008", "26.12.2008", "1.1.2009", "6.1.2009", _ "10.4.2009", "13.4.2009", "1.5.2009", "21.5.2009", "19.6.2009", "24.12.2009", "25.12.2009", "1.1.2010", "6.1.2010", _ "2.4.2010", "5.4.2010", "13.5.2010", "6.12.2010", "1.1.2011", "6.1.2011", "22.4.2011", "24.4.2011", "25.4.2011", "1.5.2011", "2.6.2011", _ "12.6.2011", "25.6.2011", "5.11.2011", "6.12.2011", "25.12.2011", "26.12.2011") ReDim Lomalista(UBound(Lomatekstit)) For i = 0 To UBound(Lomatekstit) Lomalista(i) = CDate(Lomatekstit(i)) Next AlkuPvm = ActiveCell.Value LoppuPvm = ActiveCell.Offset(0, 1).Value TyoPaivat = Application.WorksheetFunction.NetworkDays(AlkuPvm, LoppuPvm, Lomalista) - 1
Kuten myös lyhyempi mutta epähavainnollisempi:
Lomalista = Array(39448, 39528, 39531, 39569, 39807, 39808, 39814, 39819, 39913, 39916, _ 39934, 39954, 39983, 40171, 40172, 40179, 40184, 40270, 40273, 40311, 40518, 40544, _ 40549, 40655, 40657, 40658, 40664, 40696, 40706, 40719, 40852, 40883, 40902, 40903) AlkuPvm = ActiveCell.Value LoppuPvm = ActiveCell.Offset(0, 1).Value TyoPaivat = Application.WorksheetFunction.NetworkDays(AlkuPvm, LoppuPvm, Lomalista) - 1
Kiitos tuhannesti Grez, se toimii! Pelastit päiväni!
Terveisin Mamma
Aihe on jo aika vanha, joten et voi enää vastata siihen.