Arbeitsmappen global referenzieren

Informationen und Beispiele zu den hier genannten Dialog-Elementen:
MsgBox
Bild

Betrifft: Arbeitsmappen global referenzieren
von: Sabrina
Geschrieben am: 14.11.2015 12:00:46

Hallo Leute,
ich arbeite mit mehreren Mappen die untereinander zugreifen
Muss ich die in jedem Makro deklarieren oder geht das auch global.
Ich habe zum Beispiel Makro1 und Makro2 und einige Deklarationen wiederholen sich eben.


Sub Makro1()
Dim wksA As Worksheet, wksB As Worksheet, wksC As Worksheet
Set wksA = Workbooks("Mappe1.xls").Worksheets("Tabelle1")
Set wksB = Workbooks("Mappe2.xls").Worksheets("Tabelle1")
Set wksC = Workbooks("Mappe3.xls").Worksheets("Tabelle1")
'... gekürzt
wksA.Activate
ActiveWorkbook.Save
wksB.Activate
ActiveWorkbook.Save
wksC.Activate
ActiveWorkbook.Save
'... gekürzt
End Sub
und

Sub Makro2()
Dim wksA As Worksheet, wksC As Worksheet, wksD As Worksheet
Set wksA = Workbooks("Mappe1.xls").Worksheets("Tabelle1")
Set wksC = Workbooks("Mappe2.xls").Worksheets("Tabelle1")
Set wksD = Workbooks("Mappe3.xls").Worksheets("Tabelle1")
'... gekürzt
wksA.Activate
' irgendwas ausführen
wksC.Activate
' irgendwas ausführen
wksD.Activate
ActiveWorkbook.Save
'... gekürzt
End Sub
LG Sabbel

Bild

Betrifft: AW: Arbeitsmappen global referenzieren
von: Tino
Geschrieben am: 14.11.2015 13:03:52
Hallo,
wenn die zwei Makros in einem Modul sind, kannst Du die Deklarierung ganz
oben außerhalb der Makros mit Dim wksA As ... deklarieren.
Sind beide in unterschiedlichen Modulen, geht dies über Public wksA As ...
Aber Achtung,
1. die außerhalb Deklarierten Variablen werden nach Programmende nicht
zurückgesetzt dafür musst Du im Programm sorgen.
2. Eine Überprüfung ob Variable zugewiesen ist müsste dennoch durchgeführt werden
Hier ein Beispiel, ob dieses jetzt sinnvoll ist weiß ich nicht.
kommt als Code in Modul1

Option Explicit 
 
Dim wksA As Worksheet, wksB As Worksheet, wksC As Worksheet 
'' Oder auch 
'Public wksA As Worksheet, wksB As Worksheet, wksC As Worksheet 
 
Sub Makro1() 
Call Zuweisung 
'... gekürzt 
wksA.Activate 
ActiveWorkbook.Save 
wksB.Activate 
ActiveWorkbook.Save 
wksC.Activate 
ActiveWorkbook.Save 
'... gekürzt 
Call Makro2 
End Sub 
 
 
Sub Makro2() 
Call Zuweisung 
'... gekürzt 
wksA.Activate 
' irgendwas ausführen 
wksC.Activate 
' irgendwas ausführen 
wksD.Activate 
ActiveWorkbook.Save 
'... gekürzt 
Call ResetZuweisung 
End Sub 
 
Sub Zuweisung() 
If wksA Is Nothing Then _
    Set wksA = Workbooks("Mappe1.xls").Worksheets("Tabelle1") 
If wksB Is Nothing Then _
    Set wksB = Workbooks("Mappe2.xls").Worksheets("Tabelle1") 
If wksC Is Nothing Then _
    Set wksC = Workbooks("Mappe3.xls").Worksheets("Tabelle1") 
End Sub 
 
Sub ResetZuweisung() 
Set wksA = Nothing 
Set wksB = Nothing 
Set wksC = Nothing 
End Sub 
 
Gruß Tino

Bild

Betrifft: AW: Arbeitsmappen global referenzieren
von: Sabrina
Geschrieben am: 14.11.2015 15:36:33
Hallo Tino,
vielen Dank für die ausführliche Erklärung.
Ich habe nun ein Problem.
Ich suche in der Spalte A der Datei Mappe1.xls im Datenblatt Werte nach dem "Wert"
Bislang habe ich dies verwendet.

Windows("Mappe1.xls").Activate
With Sheets("Werte").Range("A1:A" & Cells(Rows.Count, 1).End(xlUp).Row)
Set c = .Find(wert, LookIn:=xlValues)
Ich versuchte es so zu ändern. Aber dann wird nichts mehr gefunden.
With wksA.Range("A1:A" & Cells(Rows.Count, 1).End(xlUp).Row)
Set c = .Find(wert, LookIn:=xlValues)
Wo liegt mein Fehler?
LG
Sabbel

Bild

Betrifft: AW: Arbeitsmappen global referenzieren
von: Tino
Geschrieben am: 14.11.2015 16:36:39
Hallo,
ich sehe zwar keinen direkten Fehler, aber versuch es mal so!
Evtl. fehlt bei Cells die Verbindung zur Tabelle wksA, weil so ist Cells auf der aktiven Tabelle?!

With wksA.Columns(1)
    'nicht ges. Inhalt vergleichen, nicht Groß-Kleinschreibweise beacheten
    Set c = .Find(wert, LookIn:=xlValues, LookAt:=xlPart, _
            SearchDirection:=xlNext, MatchCase:=False)
    If Not c Is Nothing Then MsgBox c.Address(external:=True)
    
    'Oder ges. Inhalt vergleichen, nicht Groß-Kleinschreibweise beacheten
    Set c = .Find(wert, LookIn:=xlValues, LookAt:=xlWhole, _
            SearchDirection:=xlNext, MatchCase:=False)
    If Not c Is Nothing Then MsgBox c.Address(external:=True)
End With
Grß Tino

Bild

Betrifft: AW: Arbeitsmappen global referenzieren
von: Sabrina
Geschrieben am: 14.11.2015 17:43:59
Danke .. jetzt wird der Wert gefunden.
Aber es kommt eine neue Fehlermeldung in der Zeile c.Select "Laufzeitfehler 1004. Die Select Methode konnte nicht ausgeführt werden"
Die gefundene Zeile soll aktiviert werden ...


With wksA.Columns(1)
Set c = .Find(wert, LookIn:=xlValues, LookAt:=xlPart, _
SearchDirection:=xlNext, MatchCase:=False)
c.Select
ActiveCell.Select
ActiveCell = wert
RechnungsNr = Selection.Offset(0, 1)
KundenNr = Selection.Offset(0, 2)
.... und so weiter    
End With

LG Sabbel

Bild

Betrifft: AW: Arbeitsmappen global referenzieren
von: Tino
Geschrieben am: 14.11.2015 17:51:19
Hallo,
für select muss die Tabelle aktiv sein!
Versuch es mit Application.GoTo c
Gruß Tino

Bild

Betrifft: AW: Arbeitsmappen global referenzieren
von: Sabrina
Geschrieben am: 14.11.2015 21:36:26
Vielen Dank :D
du hast mir sehr weiter geholfen.
Nun hänge ich aber schon wieder :(
Wenn der Wert nicht gefunden wird soll die letzte Zeile aktiviert werden und dann dort reingeschrieben werden .. das geht nun auch nicht mehr :(

With wksA.Columns(1)
   Set c = .Find(wert, LookIn:=xlValues, LookAt:=xlWhole, _
   SearchDirection:=xlNext, MatchCase:=False)
   If Not c Is Nothing Then
      Application.GoTo c
      GoTo weiter
   End If
   Cells(Cells(Rows.Count, 1).End(xlUp).Row + 1, 1).Select 'erste leere zelle
   ActiveCell.Select
   ActiveCell = wert
   Selection.Offset(0, 1) = RechnungsNr
   Selection.Offset(0, 2) = KundenNr
   Selection.Offset(0, 3) = Geraetenummer
   Selection.Offset(0, 4) = ExterneNummer
LG
Sabbel

Bild

Betrifft: AW: Arbeitsmappen global referenzieren
von: Tino
Geschrieben am: 14.11.2015 22:18:30
Hallo,
versuch es so. (nicht getestet)

With wksA.Columns(1)
   Set c = .Find(wert, LookIn:=xlValues, LookAt:=xlWhole, _
        SearchDirection:=xlNext, MatchCase:=False)
   If Not c Is Nothing Then
      Application.Goto c
      GoTo weiter
   End If
   
    With .Cells(.Cells(.Rows.Count, 1).End(xlUp).Row + 1, 1).EntireRow
        .Cells(1, 1).Value = RechnungsNr
        .Cells(1, 2).Value = KundenNr
        .Cells(1, 3).Value = Geraetenummer
        .Cells(1, 4).Value = ExterneNummer
        Application.Goto .Cells(1, 1)
    End With
End With
Gruß Tino

Bild

Betrifft: Oh, Danke Tino. du bist der Beste o.T.
von: Sabrina
Geschrieben am: 14.11.2015 23:13:40
.

 Bild

Beiträge aus den Excel-Beispielen zum Thema "Arbeitsmappen global referenzieren"