VisualBasic Auf anderes Workbook zugreifen

Lizzy Frog

Cadet 2nd Year
Registriert
Jan. 2015
Beiträge
17
Hallo! :)

Ich möchte von einem Workbook auf andere zugreifen und die Werte übernehmen
Die soll jedoch automatisch laufen. Eigentlich klappt es auch, nur an einer Stelle hapert es.

Ich habe eine Batch erstellt, die folgendermaßen aussieht:

Code:
for %%i in ("T:\test\*.xlsm") do start "" "%%~i"
start "" "T:\test\Excel\Summe.vbs"
pause
Sie startet alle Workbooks, auf die ich zugreifen will, und im Anschluss führt er Summe.vbs aus.
Diese sieht so aus:

Code:
Option Explicit 

Dim objExcel, objWorkBook 

Set objExcel = CreateObject("excel.application") 
objExcel.Visible = False 
Set objWorkBook = objExcel.Workbooks.Open("T:\test\bsp.xlsm") 
objExcel.Run "bsp.xlsm!modul1.Summe" 
objWorkBook.Close True 
objExcel.Quit 
Set objWorkBook = Nothing 
Set objExcel = Nothing

Modul 1 in bsp.xlsm sieht so aus:

Code:
Sub Summe()

    Dim ws1 As Worksheet, ws2 As Worksheet, ws22 As Worksheet, wb1 As Workbook, wb2 As Workbook
    Dim n As String
    Dim Spalte As Integer
    Dim Zeile As Integer
    Dim Temp As String
    Dim Datum As String
    Dim Jahr As Integer
    Dim Monat As String
    Jahr = Format(Date - 30, "YY")
    Monat = Format(Date - 30, "MMM")
    
    
    Set wb1 = Workbooks("Reklamationen.xlsm")
    Set ws1 = wb1.Worksheets(Sheets.Count)

    
    Application.ScreenUpdating = False
    wb1.Activate
    ws1.Select
    
    For Zeile = 20 To Range("A1048576").End(xlUp).Row
        
        Datum = Cells(Zeile, 1).Value
        If Datum = "01." & Format(Date - 30, "MM") & ".20" & Jahr Then
    
            Exit For
    
        End If
    
    Next Zeile

        Spalte = 2
        

        Do Until Cells(29, Spalte).Value = "Gruppe"
            
            n = Cells(29, Spalte).Value

            Set wb2 = Workbooks("Liste " & n & ".xlsm")
            Set ws2 = wb2.Worksheets("Pas.")
            wb2.Activate
            ws2.Select
            Temp = Cells(2, 15).Value
            Set ws22 = wb2.Worksheets("Akt.")
            ws22.Select
            Temp = Temp & "+" & Cells(2, 13).Value
            wb1.Activate
            ws1.Select
            Temp = "=" & Temp
            Cells(Zeile, Spalte).Select
            ActiveCell.FormulaLocal = Temp
            Spalte = Spalte + 1
    
            
        Loop

     

    Application.CutCopyMode = False
    Application.ScreenUpdating = True




End Sub

Er hängt sich immer bei Zeile 41 auf.
Die Fehlermeldung sagt: "Index außerhalb des Gültigen Bereichs"
Anscheinend kann er auf die Anderen Workbooks nicht zugreifen. Die Meldung kommt nämlich schon beim ersten Durchlauf durch die Schleife.
Wenn ich die Workbooks jetzt Manuell öffne und Modul 1 ausführe klappt es wunderbar.
Woran liegt das und wie kann ich die Fehlermeldung verhinder, dass es auch automatisch funktioniert?

MfG
 
Zuletzt bearbeitet:
Guck mal nach was dein "n" variable ist wenn der Fehler kommt und poste das mal.
und wenn n den richtigen wert hat versuch mal statt n als String zu definieren as als variable zu definieren.
 
Daran, dass n den falschen Wert hat, kann es nicht liegen. wenn ich die Workbook manuell öffne und das Makro ausführe funktioniert es ja. Der Fehler kommt ja auch schon beim ersten Durchlauf durch die Schleife.
Es muss daran liegen, dass nicht auf die anderen Workbooks zugegriffen werden kann, wenn ich sie durch die Batch öffne. Jedoch muss ich sie automatisch öffnen lassen, da es recht viele sind..
 
Zuletzt bearbeitet:
Die Fehlermeldung weißt aber genau drauf hin : Workbooks(index) -> Index ungültig -> also ist an ("Liste " & n & ".xlsm") irgendetwas falsch. Entweder kommt der Workbook befehl nicht mit der Variablen im Namen klar, sodass du dies hier ("Liste " & n & ".xlsm") zuvor in einen string speichern musst oder die Variable " n " gibt nen falschen wert aus !
 
Naja, die Excel-Tabellen müssen ja offen sein, wenn man auf diese zugreifen will. Ich glaube, dass es ein Problem damit hat, dass ich sie automatisch durch die Batch öffnen lasse und er deshalb "denkt" sie seien zu. Glaub mir, wenn ich die Tabellen manuell öffne und das Makro ausführe, funktioniert es. Ich habe ja nichts davon euch anzulügen. :D
Auch wenn ich den Namen erst in ein String einfüge klappt es nicht..
 
Ach schuldige jetzt verstehe ich was du meinst :D und warum fügst du dann am anfang der schleife nicht ein Workbook öffnen ("app.worksbooks.open Dateipfad " dim app as application ) mit dem zusatzbefehl "workbook.application.visible = false " und am Ende der schleife ist nur wichtig das du die Datei auch wieder schließt ( z.B. app.Quit)
 
Zuletzt bearbeitet:
Meinst du mit "öffnen" wirklich die Datei öffnen oder nur in den Vordergrund stellen?
 
Wenn du aus einer excel-Datei (workbook) etwas auslesen willst musst die diese natürlich öffnen sonst kannst du sie nicht auslesen (soweit ich das weiß) und mit dem befehl workbook.application.visible = false ist das öffnen der Datei nur im Speicher und nicht sichtbar.

Es wundert mich ein wenig das er hier nicht schon meckert:
Set wb1 = Workbooks("Reklamationen.xlsm")
Set ws1 = wb1.Worksheets(Sheets.Count)


Application.ScreenUpdating = False
wb1.Activate
ws1.Select
Oder ist die Reklamation.xlsm bereits geöffnet ?

Hab grad gesehen so gehts auch ohne das man die Datei öffnen muss:

Sub test()
'Wert lesen aus geschlossener Mappe
Dim wb As Workbook, Z$, ok
Set wb = GetObject("C:\Temp\test.xls")
Z = Range("B3").Value ' das wäre dein "Indirekt"
ok = wb.Worksheets("Tabelle1").Range(Z)

If ok = "" Then
MsgBox ("Leer")
Else
MsgBox (ok)
End If

wb.Close SaveChanges:=True
End Sub
 
Zuletzt bearbeitet:
Die Workbooks habe ich ja durch die Batch geöffnet, deshalb dachte ich du meintest nur in den Vordergrund holen. Und ja Reklamationen.xlsm war geöffnet. Darin wird das Makro gestartet.
Das in der Batch habe ich jetzt rausgenommen und es so gemacht:

Hab das Workbook am Anfang mit
Code:
Workbooks.Open "T:\test\Liste " & n & ".xlsm"
geöffnet und wieder geschlossen mit:
Code:
Workbooks("Liste " & n & ".xlsm").Close savechanges:=False
Warum auch immer - Es klappt!


Vielen Dank! ;)
 
Dies hier ist sonst die elegantere Variante, da es keinen excel Prozess zusätzlich startet:
Dim wb As Workbook, Z$, ok
Set wb = GetObject("C:\Temp\test.xls")
Z = Range("B3").Value ' das wäre dein "Indirekt"
ok = wb.Worksheets("Tabelle1").Range(Z)
Ergänzung ()

Na toll jetzt hab ich auch Lust etwas zu Programmieren :D
 
Zurück
Oben