VBA: max ja eomonth, mutta kaksi eri tulosta

Susivitonen

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?

3

335

    Vastaukset

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

    1. S-kauppa nosti hintoja, K-kauppa laski

      Elintarvikkeiden arvonlisävero laski vuodenvaihteessa 13,5 prosenttiin. S-kauppa siirsi alennuksen suoraan katteisiin pi
      Maailman menoa
      67
      5927
    2. Vilma Nissinen pyytää anteeksi rasistisia lausuntojaan

      Nöyrtyi kuten persut yleensäkin. On kyllä noloa tuollainen vätystely, kun ei ole miestä seisoa omien lausuntojensa takan
      Maailman menoa
      349
      5749
    3. Hiihtäjä Vilma Nissisen kommentit aiheutti paniikkia

      ja hernettä vedettiin nenään. Nissinen kertoi torstaina haastattelussa, kun häneltä kysyttiin, että tykkääkö hän hiihtä
      Maailman menoa
      93
      4731
    4. Huuto yltyy persujen piirissä Venezuelan johdosta.

      Kohta kakofonia yltyy kun persut tajuavat mitä Venezuelassa tapahtui. Von den Leydenki jo kipuilee kuten persut EU:ssa y
      Maailman menoa
      12
      2235
    5. Ikävä uutinen uudesta Unelmia Italiassa kaudesta - Iso pettymys tv-katsojille!

      Unelmia Italiassa -sarja kertoo Ellen Jokikunnaksen perheen elämästä Suomessa ja Italiassa. Nyt Ellen on kertonut tuleva
      Tv-sarjat
      18
      2048
    6. Nyt ottaa persua pattiin: sähköauto joulukuun myydyin

      🤣 prööt prööt pakoputkellaan pörisevää persua ottaa nyt saamaristi pattiin, kun paristoilla kulkeva sähköauto on noussu
      Maailman menoa
      52
      1952
    7. Ovatko Perussuomalaiset kommunisteja?

      Toiset sanovat että ovat, toiset sanovat että eivät. Ainakin heillä on paljon sen aatteen piirteitä, koska haluavat kont
      Maailman menoa
      43
      1870
    8. Martina vuokraa yksiötä

      Nyt on tarkka'ampujan yksiö vuokrattavana 800 e. Toivottavasti löytyy hyvä asukas.
      Kotimaiset julkkisjuorut
      251
      1211
    9. Jokaisella tytöllä on supervoimansa

      Millaisia ajatuksia artikkeli herättää? Mainos: Dove | ”Itsetuntoni oli ihan romuttunut” – Peppina Rosén haastaa tavan
      Sinkut
      203
      1114
    10. Voi kauhiaa: keikkapaikat keikahtavat juopottelun puutteessa!

      Vai ei tule rahaa artistille viinanmyynnin vähennyttyä. Missähän muualla kannattavuus korreloi myrkyn imemismäärän ka
      Maailman menoa
      64
      1061
    Aihe