Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: VBA: Excel ja päivämäärät

jyrki [23.05.2007 15:16:12]

#

Hienon hienoa makroa päivittelen jonka toiminta loppui yrityksen tietokanta, ohjelmisto ja tietojärjestelmien päivityksen yhteydessä. Makrolla kerätään dataa toisista excel tiedostoista toimituspäivämäärän ja tilauspäivämäärän perusteella. Eli päivämäärät ovat muotoa xx.xx.xxxx. Tämä xxxxx-hässäkkä olkoon tässä nyt a_pvm.

Ongelma / kysymys on seuraavanlainen. Kuukausi on poimittu seuraavalla komennolla.

kuukausi = Right(Left(a_pvm, 5), 2)


Ok! Nyt kun aletaan liittämään dataa tuon kuukauden perusteella pääexcel tiedostoon. Ymmärtääkö excel menettelyä, jossa solulle käytetään muotoa 07 (kuukaudelle heinäkuu). Eli ymmärtääkö solu esimerkiksi muodon cells(07, 10. Jossain vaiheessa tämä makro on toiminut mutta nykyisellä EX2003:lla ei toimi.

Niin ja makroa pyörittelen Microsoft Visual Basicillä

Saa nähdä ymmärsikö kukaan..

Grez [23.05.2007 17:06:40]

#

jyrki kirjoitti:

Eli ymmärtääkö solu esimerkiksi muodon cells(07, 10.

Jos siitä on puuttunut sulkumerkki lopusta, niin en kyllä usko että on toiminut.

Mutta kyllä se ymmärtää muodon Cells(07, 10), tosin se poistaa kyllä nollan edestä automaattisesti tuosta seiskasta, joten tuollaista sinne on mahdotonta kirjoittaa. Sen sijaan se ei ymmärrä muotoa Cells("07", "10"), koska se haluaa numeroita ja tuo on tekstiä. Esimerkiksi Val ja CLng funktioilla voi muuttaa tekstin numeroksi.

jyrki [24.05.2007 09:10:43]

#

Niin, piti siinä sulku olla, jäi tästä vain pois. Niin ei sen tarvi tuollaista 07 muotoa kirjoittaakkaan vaan homma menee niin, että makro poimii kuukausi mumeron 01-12 väliltä, lisää lukua arvolla 1 ja liittää arvon tämän kuukauden alapuolelle joka poimittu. Hieman hankala selittää.. Iskempäs tähän jatkoksi tuon makron niin joku tarkkasilmäinen voi kertoa sieltä virheitä jos löytyy. Koodia en ole itse kirjoittanut..

' Funktio hakemiston asettamiselle
Private Declare Function SetCurDir Lib "kernel32" _
    Alias "SetCurrentDirectoryA" _
    (ByVal lpPathName As String) As Long
Function WksExists(wksName As Variant) As Boolean
    On Error Resume Next
    WksExists = CBool(Len(Sheets(wksName).Name) > 0)
End Function
Function AvaaWorkbook(nimi As String) As Workbook
    On Error Resume Next
      Set AvaaWorkbook = Workbooks.Open(nimi, , True)
End Function
Sub käsi()
Dim tiednim
Dim tiimi As String
Dim wb As Workbook
Dim g As Integer
Dim kuukausi As String
Dim vuosi As String
Dim a_pvm As Date
Dim t_pvm As Date
Dim r_apvm As Date
Dim r_lpvm As Date
Dim t_apvm As Date
Dim t_lpvm As Date
Dim t_tpvm As Date

' kun kohdataan virhe jatketaan seuraavaan
On Error Resume Next
Application.ScreenUpdating = False
Application.DisplayAlerts = False

mypath = Workbooks("Tiimivarmuus.xls").Worksheets("Data").Cells(9, 2).Value
' Asetetaan nykyinen hakemisto mypathiksi. Tämä helpottaa oikean hakemiston löytämistä.
SetCurDir (mypath)

' tiedostonimi josta toimitusvarmuudet poimitaan
tiednim = Application.GetOpenFilename(FileFilter:="Excel-tiedostot (*.xls), *.xls", Title:="Valitse tiedosto, josta poimitaan toimitusvarmuudet.")
    If tiednim = False Then
        ' Jos tiedostoa ei ole niin annetaan viesti
        MsgBox "Ei onnistu!"
        Exit Sub
    End If

'tiednimi = "C:\xxxx\xx\xxxxx.XLS"
'valinta = vbYesNo + vbQuestion
'jep = MsgBox("Haluatko jälkitoimitukset mukaan ?" & Chr(10), valinta)
jep = vbNo


Dim tiednimi As String
tiednimi = tiednim
Set wb = AvaaWorkbook(tiednimi)

r_apvm = Cells(4, 5).Value
r_lpvm = Cells(4, 7).Value


t_apvm = Workbooks("tiimivarmuus.xls").Worksheets("Data").Cells(2, 1).Value
' ensimäinen tilastoitu pvm
t_lpvm = Workbooks("tiimivarmuus.xls").Worksheets("Data").Cells(2, 2).Value
' viimeisin tilastoitu pvm
t_tpvm = Workbooks("tiimivarmuus.xls").Worksheets("Data").Cells(2, 4).Value
' nykyinen pvm

' tarkastellaan raportin päivämäärää ja ilmoitetaan jos se ei ole korrekti
' eli jos raportin loppupäivämäärä on suurempi kuin tämä päivä tai
' raportti on samalta päivämäärä alueelta kuin jo jokin olemassa oleva
' tilastoitu raportti.
If r_apvm >= t_tpvm Or r_lpvm >= t_tpvm Then
MsgBox "Tulostamasi raportti ei ole kurantti, koska se sisältää" & Chr(10) _
    & "aikavälin, joka ei ole korrekti!" & Chr(10) _
    & "Mitään muutoksia ei tehty! Yritä uudelleen..."
Exit Sub
End If



' jos raportin aloitus päivämäärä on tilastoinnin aikarajan sisällä tai
' jos raportin lopetus päivämäärä on tilastoinnin aikarajan sisällä niin
If t_apvm <= r_apvm And r_apvm <= t_lpvm Or t_apvm <= r_lpvm And r_lpvm <= t_lpvm Then
    MsgBox "Kyseiseltä aikaväliltä löytyy jo raportti!" & Chr(10) _
        & "Makron suoritus lopetetaan..." & Chr(10) _
        & "Mitään tietoja ei päivitetty." & Chr(10) _
        & "Tulosta raportti päivästä: " & t_lpvm + 1 & " eteenpäin."

    Exit Sub
Else
    If r_apvm = t_lpvm + 1 Then
        Workbooks("tiimivarmuus.xls").Worksheets("Data").Cells(2, 2).Value = r_lpvm
    Else
        MsgBox "tämä raportti jättää välistä päiviä et halua jatkaa =)" & Chr(10) _
        & "Aloita raportti päivästä: " & t_lpvm + 1 & " kiitos."
        Exit Sub
    End If

End If


l = Cells(Rows.Count, 4).End(xlUp).Row

For g = 1 To l
If l < g Then
Exit For
End If

' poistetaan pakkaukseen yms ylimääräiset rivit toimitusvarmuus tiedostosta
If Cells(g, 4).Value Like "*PAKKAUS*" Or Cells(g, 4).Value Like "*PALLET*" _
Or Cells(g, 4).Value Like "*DELIVERY*" Or Cells(g, 4).Value Like "*PACKING*" _
Or Cells(g, 4).Value Like "*LAVA*" Or Cells(g, 4).Value Like "*KAULUS*" _
Or Cells(g, 4).Value Like "*AMPSEAL*" Or Cells(g, 4).Value Like "*MUUTOS*" _
Or Cells(g, 4).Value Like "*TYÖ*" Or Cells(g, 4).Value Like "" _
Or Cells(g, 4).Value Like "*LISÄ*" Or Cells(g, 4).Value Like "*PAPERS*" _
Or Cells(g, 4).Value Like "*PAHVI*" Or Cells(g, 4).Value Like "*TÄYDENNYS*" _
Or Cells(g, 10).Value = 4292552277# _
Then
Rows(g & ":" & g).Delete Shift:=xlUp
g = g - 1
l = l - 1
    If g = 0 Then
    g = g + 1
    End If
End If

'Jos raportissa on tuplarivi merkintä eli g sarakkeessa on 2
' niin tuhotaan rivi tai kaksi riippuen jälkitoimitus asetuksesta
If Cells(g, 7).Value = 2 Then
    If jep = vbNo Then
        Rows(g & ":" & g).Delete Shift:=xlUp
        Rows(g & ":" & g).Delete Shift:=xlUp
        g = g - 2
        l = l - 2
    If g = 0 Then
    g = g + 1
    End If

    Else
        Rows(g & ":" & g).Delete Shift:=xlUp
        g = g - 1
        l = l - 1
    If g = 0 Then
    g = g + 1
    End If

    End If
End If

Next g

l = Cells(Rows.Count, 1).End(xlUp).Row

' kun ylimääräiset rivit poistettu niin käydään rivit läpi
' etsien sellaisten tuotteiden toimitusvarmuus, joilla ei ole
' tiimiä määriteltynä
For x = 1 To l
    If Cells(x, 8).Value Like "??.??.????" And Cells(x, 9).Value Like "??.??.????" Then
        Cells(x, 8).Activate
        rivi = ActiveCell.Row
        If Cells(rivi, 4).Value <> "" And Cells(rivi, 10).Value = "" Then
           ' MsgBox Cells(rivi, 4).Value & " - Tuote ilman tiimiä"
            a_pvm = Cells(rivi, 8).Value
            t_pvm = Cells(rivi, 9).Value
            team = Cells(rivi, 10).Value
            kuukausi = Right(Left(a_pvm, 5), 1)
            vuosi = Right(a_pvm, 4)

            ' jos aiottu toimituspäivämäärä on edessäpäin         toimituspäivämäärästä niin
            If a_pvm >= t_pvm Then
                'hyvä toimitus
                Workbooks("Tiimivarmuus.xls").Worksheets(vuosi).Cells(2, kuukausi + 1).Value = Workbooks("Tiimivarmuus.xls").Worksheets(vuosi).Cells(2, kuukausi + 1).Value + 1
                Workbooks("Tiimivarmuus.xls").Worksheets(vuosi).Cells(4, kuukausi + 1).Value = Workbooks("Tiimivarmuus.xls").Worksheets(vuosi).Cells(4, kuukausi + 1).Value + 1
            Else
                'jos aiottu toimituspäivämäärä on jo takana niin
                'paha toimitus
                Workbooks("Tiimivarmuus.xls").Worksheets(vuosi).Cells(2, kuukausi + 1).Value = Workbooks("Tiimivarmuus.xls").Worksheets(vuosi).Cells(2, kuukausi + 1).Value + 1
                Workbooks("Tiimivarmuus.xls").Worksheets(vuosi).Cells(3, kuukausi + 1).Value = Workbooks("Tiimivarmuus.xls").Worksheets(vuosi).Cells(3, kuukausi + 1).Value + 1
            End If

        End If

    End If
Next x

x = 0

Columns("J:J").Select
' Etsitään tiimilliset toimitukset raportista ja päivitetään tilastot
With Selection
    For x = 1 To 6
        tiimi = "0" & x
        Set c = .Find(tiimi)
        If Not c Is Nothing Then
            firstaddress = c.Address

            Do
                k = c.Address
                Range(k).Select
                rivi = ActiveCell.Row
                a_pvm = Cells(rivi, 8).Value
                t_pvm = Cells(rivi, 9).Value
                team = Cells(rivi, 10).Value
                kuukausi = Right(Left(a_pvm, 5), 2)
                vuosi = Right(a_pvm, 4)

                'If WksExists(vuosi) = True Then
                'Else
                '   Sheets.Add.Name = vuosi
                'End If

                If a_pvm >= t_pvm Then
                    'hyvä toimitus
                    Workbooks("Tiimivarmuus.xls").Worksheets(vuosi).Cells(team * 7 + 1, kuukausi + 1).Value = Workbooks("Tiimivarmuus.xls").Worksheets(vuosi).Cells(team * 7 + 1, kuukausi + 1).Value + 1
                    Workbooks("Tiimivarmuus.xls").Worksheets(vuosi).Cells(team * 7 + 3, kuukausi + 1).Value = Workbooks("Tiimivarmuus.xls").Worksheets(vuosi).Cells(team * 7 + 3, kuukausi + 1).Value + 1
                Else
                    'paha toimitus
                    Workbooks("Tiimivarmuus.xls").Worksheets(vuosi).Cells(team * 7 + 1, kuukausi + 1).Value = Workbooks("Tiimivarmuus.xls").Worksheets(vuosi).Cells(team * 7 + 1, kuukausi + 1).Value + 1
                    Workbooks("Tiimivarmuus.xls").Worksheets(vuosi).Cells(team * 7 + 2, kuukausi + 1).Value = Workbooks("Tiimivarmuus.xls").Worksheets(vuosi).Cells(team * 7 + 2, kuukausi + 1).Value + 1
                End If

                Range(k).Value = ""
                Set c = .FindNext(c)

                If c Is Nothing Then
                    Exit Do
                End If

            Loop While Not c Is Nothing And firstaddress <> c.Address
        End If
    Next x
End With


Application.ScreenUpdating = True
Application.DisplayAlerts = True
Workbooks("Tiimivarmuus.xls").Worksheets("Data").Activate
End Sub

Grez [24.05.2007 12:21:38]

#

Joo, tuon tekijä on ollut ilmeisesti joku jolla ei ole hirveästi käsitystä ohjelmoinnista tai ainakaan muuttujien tietotyypeistä.

Mutta siis tuossahan tapahtuu esim.

kuukausi = "07"

Sitten Cells(team * 7 + 2, kuukausi + 1)

-> Cells(jotain,"071")

Ja kun se haluaisi sinne tosiaan luvun eikä tekstiä. Sen pitäisi olla tyyliin

kuukausi = Clng(Right(Left(a_pvm, 5), 1))

eikä

kuukausi = Right(Left(a_pvm, 5), 1)

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta