Moikka!
Olen melko uusi täällä. Joskus parisen vuotta sitten tarvitsin VBA:ta, silloin viimeksi vierailin ohjelmointiputkan palstoilla...
Excel tiedostossa on useampi sheetti, joilta jokaiselta pitää tarkistaa samat asiat. Tarkistukseen kuuluu seuraavanlaisia asioita:
1) tietyillä soluilla pitää olla lukuarvoja ja tekstiä (tekstit ja luvut eri soluissa)
2) eräs lasku pitää olla nolla
3) muutaman combo boxin tarkistus (pitää olla täytetty)
4) bonuksena: jotkin kohdat ovat kriittisiä (heti ilmoitus jos puuttuu), kun taas joitakin osioita saa puuttuu esim 5 ja sen jälkeen vasta ilmoitus.
Jos jokin näistä kohdista ei täyty, tästä ilmoitus käyttäjälle joka voi tehdä tarvittavat jatkotoimenpiteet. Excel tiedostot ovat samassa kansiossa. Ohjelman pitäisi osata tarkistaa kansiossa olevat tiedostot ja siirtää tarkistetut tiedostot esim Tarkistettu -kansioon ja puutteelliset esim Puutteelliset -kansioon.
Olisin iloinen ainakin seuraavista tiedoista:
- Onko tälläinen mahdollista VBA:llä?
- Millä komennolla VBA avaa toisen tiedoston?
Kiitokset etukäteen ja hyvää viikonloppua!
Heippa ppenttin!
tässä aivan yksinkertainen malli...
'ThisWorkbook Private Sub Workbook_SheetCalculate(ByVal Sh As Object) Dim OleObj As OLEObject, valittuna As Integer 'Tutkii "Taul" ComboBoxit For Each OleObj In Sheets("Taul1").OLEObjects With OleObj If .Name = "ComboBox1" Then If ListIndex > -1 Then valittuna = valittuna + 1 End If ElseIf .Name = "ComboBox2" Then If ListIndex > -1 Then valittuna = valittuna + 1 End If End If End With Next Dim viesti As String, laskuri As Integer If Sheets("Taul1").Cells(2, 2).Value = 0 Then viesti = viesti + "Taul1 solu B2 OK" + vbCrLf laskuri = laskuri + 1 End If If IsEmpty(Sheets("Taul1").Cells(2, 3)) Or _ CLng(Sheets("Taul1").Cells(2, 3).Value) = 0 Then viesti = viesti + "Taul1 solun C2 arvo puuttuu" + vbCrLf laskuri = laskuri + 1 End If If IsEmpty(Sheets("Taul2").Cells(3, 3)) Or _ CLng(Sheets("Taul2").Cells(3, 3).Value) = 0 Then viesti = viesti + "Taul2 solun C3 arvo puuttuu" + vbCrL End If 'jne. If valittuna = 2 And viesti <> "" And laskuri > 1 Then viesti = "Tiedot kohteista:" + vbCrLf + viesti: MsgBox viesti Else MsgBox "Lähes kaikki tarvittavat tiedot puutuvat" End If End Sub 'Toisen työkirjan avaaminen VBA:lla Private Sub Workbook_SheetBeforeDoubleClick( _ ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean) 'Esim. jos työpöydällä on tiedosto 'testi.xls'ja tämän työkirjan 'jotain taulua kaksoisklikataan niin tiedosto avataan Excelissä. If Dir(Environ("userprofile") & "\Työpöytä\testi.xls") <> "" Then Workbooks.Open (Environ("userprofile") & "\Työpöytä\testi.xls") End If End Sub
Heippa taas ppenttin!
jäi lukematta toi kysymys kokonaan, joten jäi huomaamatta toi bonus osio...
elikä jos kokkaat koodisi seuraavista aineksista niin onnistuu...
Sub auto_open() 'Aliohjelma suoritetaan automaattisesti 'aina kun macron sisältävä työkirja avataan... Dim BaseWorkbook As String, BasePath As String BaseWorkbook = Application.ActiveWorkbook.Name BasePath = Environ("userprofile") & "\Omat tiedostot\" On Error GoTo ErrorHandler MkDir (BasePath & "Excel_Tiedostot") On Error GoTo ErrorHandler MkDir (BasePath & "Excel_Tiedostot_Tarkistetut") On Error GoTo ErrorHandler MkDir (BasePath & "Excel_Tiedostot_Puutteelliset") With Application.FileSearch .LookIn = BasePath & "Excel_Tiedostot" .FileType = msoFileTypeExcelWorkbooks .Execute If .FoundFiles.Count > 0 Then For i = 1 To .FoundFiles.Count Workbooks.Open (.FoundFiles(i)) Next i Dim wk As Workbook, wkOk As Boolean, msg As String Dim src As String, dest As String, cnt As Integer For Each wk In Application.Workbooks If wk.Name <> BaseWorkbook Then wk.Activate: DoEvents Dim ws As Worksheet Dim valittuna As Integer For Each ws In wk.Worksheets Dim oleobj As OLEObject For Each oleobj In ws.OLEObjects If Left(oleobj.Name, 8) = "ComboBox" Then With oleobj If .Object.ListIndex > -1 Then valittuna = valittuna + 1 End If End With End If Next Dim viesti As String, laskuri As Integer If ws.Cells(2, 2).Value = 0 And _ Not IsEmpty(ws.Cells(2, 2)) Then viesti = viesti + "solun B2 arvo OK" Else viesti = viesti + "solun B2 arvo virheellinen" End If If IsEmpty(ws.Cells(2, 3)) Or _ CLng(Sheets("Taul1").Cells(2, 3).Value) = 0 Then viesti = viesti + ws.Name & _ " solun C2 arvo puuttuu" + vbCrLf laskuri = laskuri + 1 End If If IsEmpty(ws.Cells(3, 3)) Or _ CLng(ws.Cells(3, 3).Value) = 0 Then viesti = viesti + ws.Name & _ " solun C3 arvo puuttuu" + vbCrL laskuri = laskuri + 1 End If 'jne. wkOk = False If laskuri < 2 And ws.Cells(2, 2).Value = 0 _ And Not IsEmpty(ws.Cells(2, 2)) Then viesti = "Työkirjan '" & wk.Name & "' tiedot taulun '" & _ ws.Name & "' kohteista:" & vbCrLf & _ viesti: MsgBox viesti: wkOk = True: cnt = valittuna: viesti = "" Else wkOk = False: cnt = valittuna: viesti = "": Exit For End If Next If wkOk And cnt = 2 Then src = BasePath & "Excel_Tiedostot\" & wk.Name dest = BasePath & "Excel_Tiedostot_Tarkistetut\" & wk.Name msg = "Työkirjan '" + wk.Name + "* tiedot OK..." & vbCrLf _ & "siirretään hakemistoon: " & dest Else src = BasePath & "Excel_Tiedostot\" & wk.Name dest = BasePath & "Excel_Tiedostot_Puutteelliset\" & wk.Name msg = "Työkirjan '" + wk.Name + _ "' tiedot ovat puutteelliset..." & vbCrLf & _ "siirretään hakemistoon: " & dest End If FileSaveOperation msg, src, dest, wk End If Next Workbooks(BaseWorkbook).Activate End If End With Exit Sub ErrorHandler: Err.Clear: On Error GoTo 0 Resume Next End Sub Sub FileSaveOperation(msg As String, src As String, _ ByVal dest As String, ByVal wk As Workbook) MsgBox msg Application.DisplayAlerts = False wk.Saved = True: wk.Close Application.DisplayAlerts = True FileCopy src, dest Do While (Dir(dest) = ""): Loop Kill (src) End Sub
VBA:ssa kannattaa käyttää runsaasti debug.print komentoa. Se ei haittaa mitään, mutta jos koodi ei ihan toimikkaan oikein se helpottaa huomattavasti. Silloin ei tarvi mitään muuta kuin aukasta editori ja heti näet mitä koodi on tehnyt/yrittänyt tehdä/jättänyt tekemättä.
Moikka taas!
Jos VBA:lla aikoo väsäillä vähääkään laajempia projekteja, niin kannaattaa rakennella aivan om debugger-luokka jolla hoidella debuggaamisen niin, että bugit ja niiden sijainti näkyy screenillä heti ilman, että tarvii aukaista VBA editoria...helpottaaa muuten vielä huomattavammin!
Aihe on jo aika vanha, joten et voi enää vastata siihen.