Käytössä Excel 2003 SP3, ja sillä kirjoitettu VBA-koodia. Analysis toolpak VBA (ATPVBAEN) on asianmukaisesti kytketty päälle.
Soluun A1 on kirjoitettu päivämäärä 6.8.2009. Funktio =EOMONTH(A1; -1) palauttaa Excelin puolelta asianmukaisesti 31.7.2009.
Ajetaan seuraavaa koodia:
Option Explicit
Sub testi()
Dim MaksimiPvm As Date
MaksimiPvm = Fix(Application.WorksheetFunction.Max(Range(Cells(1, 1), Cells(2, 1)))) 1
MsgBox "Päiväys on " & Format(eomonth(MaksimiPvm, -1), "dd.mm.yyyy")
End Sub
Sub AddMenu()
Dim cMenu1 As CommandBarControl
Dim cbMainMenuBar As CommandBar
Dim iHelpMenu As Integer
Dim cbcCutomMenu As CommandBarControl
On Error Resume Next
Application.CommandBars("Worksheet Menu Bar").Controls("Testi").Delete
On Error GoTo 0
Set cbMainMenuBar = Application.CommandBars("Worksheet Menu Bar")
iHelpMenu = cbMainMenuBar.Controls("Help").Index
Set cbcCutomMenu = cbMainMenuBar.Controls.Add(Type:=msoControlPopup, Before:=iHelpMenu)
cbcCutomMenu.Caption = "Testi"
With cbcCutomMenu.Controls.Add(Type:=msoControlButton)
.Caption = "Aja testi"
.OnAction = "testi"
End With
End Sub
Sub DeleteMenu()
On Error Resume Next
Application.CommandBars("Worksheet Menu Bar").Controls("Testi").Delete
On Error GoTo 0
End Sub
Lisäksi ThisWorkbookin alle on kirjoitettu seuraavaa:
Private Sub Workbook_Activate()
Run "AddMenu"
End Sub
Private Sub Workbook_beforeclose(Cancel As Boolean)
Run "DeleteMenu"
End Sub
ONGELMA:
Kun koodi ajetaan Tools->Macro->Macros-valikon kautta, Msgbox tulostaa "Päiväys on 31.07.2009" kuten pitääkin. Mutta kun koodi ajetaan Exceliin ilmaantuneen Testi-valikon kautta, sama Msgbox tulostaakin "Päiväys on 30.06.2009". Jos päivämääräksi vaihdetaan solussa A1 5.8.2009, niin Macros-valikon kautta ajettuna koodi toimii edelleenkin kuten pitää, mutta Testi-valikon kautta ajettuna ilmoitus on nyt "Päiväys on 31.05.2009".
Ilmeisesti Excel menee jotenkin solmuun päivämääräasetusten kanssa (eli tulkitsee päivämäärän olevan amerikkalaisessa mm-dd-yyyy-formaatissa vaikkei se sitä olekaan). Milläköhän ilveellä tämänkin "ominaisuuden" saisi nyt estettyä, jottei makrokoodin käyttäjien tarvitsisi käynnistää koodia kömpelösti Macros-valikosta?
VBA: max ja eomonth, mutta kaksi eri tulosta
3
310
Vastaukset
virhettä pukkaa tolla rivillä
MsgBox "Päiväys on " & Format(eomonth(MaksimiPvm, -1), "dd.mm.yyyy")
muutin koodia ja nyt ainakin mun koneella toimii niinkuin pitääkin...
Sub testi()
Dim MaksimiPvm As Date
MaksimiPvm = Fix(Application.WorksheetFunction.Max(Range(Cells(1, 1), Cells(2, 1)))) 1
MsgBox "Päiväys on " & Format(Evaluate("=EOMONTH((A1), -1)"), "dd.mm.yyyy")
End Sub
Keep Excelling
@Kunde- Susivitonen
Ei tuosta koodista mitään käännösvirheitä tule, kunhan tarvittavat palikat (eli lähinnä tuo atpvbaen.xls:n referenssi) ovat paikallaan. Ongelma on se, että koodi ei siis toimi samalla tavalla riippuen siitä, millä tavalla rutiiniin "testi" on päädytty, ja ainakaan omasta mielestäni kirjastofunktioiden toiminta ei pitäisi riippua siitä, onko ohjelma käynnistetty Macros-valikosta vai käynnistämistä varten rakennetusta erillisestä valikosta.
Näyttäisi vahvasti siltä, että kyse on päivämääräformaattitietojen unohtuminen jossain vaiheessa käytettäessä Date-tyyppistä muuttujaa sekä application.worksheetfunction.max- ja eomonth-funktioiden yhdistelmää.
Korjaus
MsgBox "Päiväys on " & format(evaluate("=EOMONTH((A1), -1)", "dd.mm.yyyy")
antaisi tietysti oikean lopputuloksen tässä nimenomaisessa tilanteessa, mutta siitä jää pois tuo max-funktio (oikeaa dataa prosessoitaessa tarkoituksena on seuloa muutaman tuhannen rivin joukosta suurin päivämäärä, laskea edellisen kuukauden päättymispäivä sen perusteella ja verrata tätä arvoa loopissa kaikkien yksittäisten rivien eomonth-funktiolla muutettuun arvoon). Toimiakseen oikein tuo korjaus pitäisi kaiketi kirjoittaa muotoon
MsgBox Format(Evaluate("=EOMONTH(max(A1:A2), -1)"), "dd.mm.yyyy")
mutta jossa olisi kuitenkin se huono puoli, että, tuota evaluate-lausetta sen oikean koodin rakenteen vuoksi pitäisi toistaa muutama tuhat kertaa.
Jos taas kirjoitan rivit muotoon
Dim MaxDate As Date
MaxDate = Evaluate("=MAX(A1:A2)")
MsgBox "Date is " & Format(eomonth(MaxDate, -1), "dd.mm.yyyy")
eli tallennan tuon suurimman päiväyksen arvon muuttujaan, ja sovellan sille eomonth-funktiota erikseen, niin homma ei yllättävää kyllä toimi edelleenkään oikein silloin, kun koodi käynnistetään sieltä Exceliin rakennetusta test-menusta. Macros-menusta käynnistettynä ongelmia ei esiinny.
Kirjoitettuna muotoon
Dim MaxDate As Double
MaxDate = Fix(Application.WorksheetFunction.Max(Range(Cells(1, 1), Cells(2, 1)))) 1
MsgBox "Date is " & Format(eomonth(MaxDate, -1), "dd.mm.yyyy")
koodi taas yllättäen toimii oikein kummallakin käynnistystavalla, ts. kun max-funktiolla etsitty suurin päivämäärä tallennetaankin vääräntyyppiseen muuttujaan (double), kuukauden ja päivän sekoittumista keskenään ei esiinnykään.
Olen vahvasti sitä mieltä, että havaitsemassani tilanteessa kysymys on Excelin bugista. Susivitonen kirjoitti:
Ei tuosta koodista mitään käännösvirheitä tule, kunhan tarvittavat palikat (eli lähinnä tuo atpvbaen.xls:n referenssi) ovat paikallaan. Ongelma on se, että koodi ei siis toimi samalla tavalla riippuen siitä, millä tavalla rutiiniin "testi" on päädytty, ja ainakaan omasta mielestäni kirjastofunktioiden toiminta ei pitäisi riippua siitä, onko ohjelma käynnistetty Macros-valikosta vai käynnistämistä varten rakennetusta erillisestä valikosta.
Näyttäisi vahvasti siltä, että kyse on päivämääräformaattitietojen unohtuminen jossain vaiheessa käytettäessä Date-tyyppistä muuttujaa sekä application.worksheetfunction.max- ja eomonth-funktioiden yhdistelmää.
Korjaus
MsgBox "Päiväys on " & format(evaluate("=EOMONTH((A1), -1)", "dd.mm.yyyy")
antaisi tietysti oikean lopputuloksen tässä nimenomaisessa tilanteessa, mutta siitä jää pois tuo max-funktio (oikeaa dataa prosessoitaessa tarkoituksena on seuloa muutaman tuhannen rivin joukosta suurin päivämäärä, laskea edellisen kuukauden päättymispäivä sen perusteella ja verrata tätä arvoa loopissa kaikkien yksittäisten rivien eomonth-funktiolla muutettuun arvoon). Toimiakseen oikein tuo korjaus pitäisi kaiketi kirjoittaa muotoon
MsgBox Format(Evaluate("=EOMONTH(max(A1:A2), -1)"), "dd.mm.yyyy")
mutta jossa olisi kuitenkin se huono puoli, että, tuota evaluate-lausetta sen oikean koodin rakenteen vuoksi pitäisi toistaa muutama tuhat kertaa.
Jos taas kirjoitan rivit muotoon
Dim MaxDate As Date
MaxDate = Evaluate("=MAX(A1:A2)")
MsgBox "Date is " & Format(eomonth(MaxDate, -1), "dd.mm.yyyy")
eli tallennan tuon suurimman päiväyksen arvon muuttujaan, ja sovellan sille eomonth-funktiota erikseen, niin homma ei yllättävää kyllä toimi edelleenkään oikein silloin, kun koodi käynnistetään sieltä Exceliin rakennetusta test-menusta. Macros-menusta käynnistettynä ongelmia ei esiinny.
Kirjoitettuna muotoon
Dim MaxDate As Double
MaxDate = Fix(Application.WorksheetFunction.Max(Range(Cells(1, 1), Cells(2, 1)))) 1
MsgBox "Date is " & Format(eomonth(MaxDate, -1), "dd.mm.yyyy")
koodi taas yllättäen toimii oikein kummallakin käynnistystavalla, ts. kun max-funktiolla etsitty suurin päivämäärä tallennetaankin vääräntyyppiseen muuttujaan (double), kuukauden ja päivän sekoittumista keskenään ei esiinnykään.
Olen vahvasti sitä mieltä, että havaitsemassani tilanteessa kysymys on Excelin bugista.vaan ominaisuus. Kuten eilen vastasin samantapaiseen aikaongelmaan. Jos haluat, että koodisi toimii oiken käytä jenkkityylin päiväyksiä ja toimii. Mutta koska Excel tallentaa päiväykset numeroina, niin silloin helpompi tapa toimia "kansainvälisesti" on muuttaa päiväykset luvuiksi ja no problem.
Kuten itsekin totesit niin toimii lukuna...
Keep Excelling
@Kunde
Ketjusta on poistettu 0 sääntöjenvastaista viestiä.
Luetuimmat keskustelut
Yritän tänään laittaa taajuudet kohdilleen
Jotta törmätään kirjaimellisesti. Ei tätä kestä enää perttikään. Olet rakas ❤️662438Vanhuksen varpaankynsien leikkaus 89 euroa...
Huh huh.......Parturikäynti olisi varmasti ollut 250 euroa? Kallis on suomi nykyään.1842122Onko kaivattusi
kyltymätön nainen, pystyisitkö olemaan hänelle loputon mies, vai meneekö toisinpäin.462062Anne Kukkohovi. Myy likaisia alushousujaan.
Kuka ihme ostaa jonkun naisen likaisia alushousuja, menee lujaa kyllä tälläkin housujen myyjällä.1191878Viulu vaiennut
Eikö pisnikset suju ? Vai miksi pahin yrittäjä vouhka on "kadonnu" maan alle. 🤣311791Kauanko skuutteja on siedettävä? Ei tietoa liikennesäännöistä, ajellaan miten sattuu ja missä vain.
Kauanko on kestettävä sähköpotkulautojen terrorismismia? Niillä ajelevat eivät tiedä, tai jos tietävätkin, niin eivät vä1901516Nainen, sellaista tässä ajattelin
Minulla on olo, että täällä on edelleen joku, jolla on jotain käsiteltävää. Hän ei ole päässyt lähtemään vielä vaan jost2151425Kyllä tekee kipeää
Luopua kaikesta mitä on elämässä saavuttanut😞 ei vaan ole enää yhtäkään hiljaista vuorokautta🤬261235Tänään pyörit ajatuksissa enemmän, kun erehdyin lukemaan palstaa
En saisi, silti toivon että sinä vielä palaat ja otetaan oikeasti selvää, hioituuko särmät ja sulaudummeko yhteen. Vuod171051En mä tiedä mitä tapahtuu
siis tykkäisitköhän musta oikeasti. Ehkä oot pelannu liikaa rahapelejä, ehkä rakastat tyhjiä arpoja.91012