Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: Useamman excel tiedoston avaaminen VBA :lla

pentiny [02.05.2008 23:13:06]

#

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!

neau33 [03.05.2008 00:43:01]

#

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

neau33 [04.05.2008 23:19:43]

#

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

Meitzi [15.05.2008 22:16:20]

#

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ä.

neau33 [15.05.2008 23:19:48]

#

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!

Vastaus

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

Tietoa sivustosta