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..
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.
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
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)
Aihe on jo aika vanha, joten et voi enää vastata siihen.