Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1368to1372
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Datei-übergreifend vba code ändern

Datei-übergreifend vba code ändern
14.07.2014 11:56:54
Thomas
Mahlzeit zusammen :)
Ich hab folgendes Problem :
Wir arbeiten mit ca 10 Mann mit einer Excel Vorlage, die ändert sich aber alle paar Tage ( zu 99% VBA Code Änderungen ).
Wenn ich den nun den Code in der Vorlage änder, hätte ich auch gerne die anderen Dokumente im Aktuellen Stand ( mir gehts hier nur um den VBA Code ).
Ist es also möglich den Code der "alten" Dateien zu ändern ohne in jede Datei einzeln rein zu gehen ? Mittlerweile haben wir ca 200 Dokumente und die alle auf den neuesten Stand zu bringen dauert und dauert und dauert.
Ich würde gerne dieses Problem in der Zukunft nicht mehr haben.
MfG

30
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Datei-übergreifend vba code ändern
14.07.2014 12:08:18
Nepumuk
Hallo,
das einzige was da hilft ist Daten vom Code zu trennen. Den Code in ein Addin verpacken und dieses Addin per Verweis an die Mappe binden. Dann müsstest du in den alten Mappen nur den kompletten Code löschen und den Verweis setzen. Das geht per VBA. Aber: Es setzt natürlich voraus dass alle auf dieses Addin zugreifen können. Mit "mobil mal schnell die Mappe mitnehmen" ist dann nicht mehr so einfach.
Gruß
Nepumuk

AW: Datei-übergreifend vba code ändern
14.07.2014 13:02:45
Ralf
Hallo,
genau so, wie Nepumuk es beschreibt, mache ich es. Das Add-In liegt auf dem Server.
Das darf von den Benutzern nur schreibgeschützt geöffnet werden, damit der Coder weiter dran rumschrauben darf.
Der Code kommt ins Add-In:

Private Sub Workbook_Open()
If Not ThisWorkbook.ReadOnly Then _
If Environ("USERNAME")  "derdencodebearbeitendarfsollwill" Then _
ThisWorkbook.ChangeFileAccess xlReadOnly
End Sub
Den Code habe ich in der Vorlage

Option Explicit
Const MAKROPFAD As String = "W:\Makros\"
Const MAKRODATEI As String = "Makro_.xlam"
Private Sub Workbook_Open()
Dim WB As Workbook
Set WB = Workbooks(ActiveWorkbook.name)
With WB
If .FileFormat = xlOpenXMLTemplateMacroEnabled Then MsgBox "ACHTUNG!" & vbLf & vbLf & " _
VORLAGE WIRD BEARBEITET!", vbExclamation
If Not BookOpen(MAKRODATEI) Then
If Environ("USERNAME") = "derdencodebearbeitendarfsollwill" Then
Workbooks.Open MAKROPFAD & MAKRODATEI
Else
Workbooks.Open MAKROPFAD & MAKRODATEI, , True
End If
End If
End Sub
Public Function BookOpen(WorkBk As String) As Boolean
Dim wkb As Workbook
Err.Clear
On Error Resume Next
Set wkb = Workbooks(WorkBk)
If Err.Number  9 Then
BookOpen = True
Exit Function
End If
BookOpen = False
End Function
Gruß
Ralf

Anzeige
AW: Datei-übergreifend vba code ändern
14.07.2014 13:09:42
Thomas
WUHUUUUU
danke :)
ihr seid die besten hier :):):):)
wir übernommen und getestet :):):):)

AW: Datei-übergreifend vba code ändern
14.07.2014 13:21:43
Ralf
Thomas,
der Code könnte in einer Tabelle stehen. Ich habe Buttons (und andere Knöpfe) auf dem Blatt.
Darüber werden die Makros in dem Add-In aufgerufen
@Nepumuk: das ist der Code, den ich Samstag nicht zuhause hatte
Option Explicit
Const MAKROPFAD As String = "W:\Makros\"
Const MAKRODATEI As String = "Makro_.xlam"
Private Sub btnALLES_DRUCKEN_Click()
If Not BookOpen(MAKRODATEI) Then Workbooks.Open MAKROPFAD & MAKRODATEI, , True
Application.Run MAKRODATEI & "!ALLES_DRUCKEN"
End Sub
Private Sub btnDateiSpeichern_Click()
If Not BookOpen(MAKRODATEI) Then Workbooks.Open MAKROPFAD & MAKRODATEI, , True
Application.Run MAKRODATEI & "!DATEI_SPEICHERN"
End Sub
... noch weitere Buttons ...
Gruß
Ralf

Anzeige
AW: Datei-übergreifend vba code ändern
14.07.2014 14:29:28
Daniel
Hi
gute Idee, aber warum öffnest du die Makrodatei nicht gleich parallel mit, dh im Workbook-Open-Event?
dann kannst du dir Abfrage bei jedem Button sparen.
im Close-Event schließt du die Makro-Datei dann parallel.
Gruß Daniel

guckst du 2. nachrichten vorher ;) [owT]
14.07.2014 15:33:16
Ralf

AW: guckst du 2. nachrichten vorher ;) [owT]
14.07.2014 17:13:47
Daniel
warum dann nochmal der Code zum Öffnen in jedem Buttoncode?
Absicherung?

AW: guckst du 2. nachrichten vorher ;) [owT]
15.07.2014 09:10:49
Ralf
ja, korrekt
es kann vorkommen, dass das Add-In nicht geladen ist

AW: guckst du 2. nachrichten vorher ;) [owT]
15.07.2014 09:14:04
Daniel
Ist das wirklich schon ein Add-In?
Da wird doch nur ne zweite Datei parallel geöffnet.
Gruß Daniel

AW: guckst du 2. nachrichten vorher ;) [owT]
15.07.2014 09:35:45
Ralf
Daniel,
Const MAKROPFAD As String = "W:\Makros\"
= pfad zum AddIn
Const MAKRODATEI As String = "Makro_.xlam"
= AddIn, xlam ist immer ein AddIn mit gesetztem thisworkbook.isaddin=true
Gruß
Ralf

Anzeige
AW: guckst du 2. nachrichten vorher ;) [owT]
15.07.2014 09:16:43
Nepumuk
Hallo,
und warum das Addin nicht per Verweis an die Mappe binden? Damit erübrigt sich die Prüfung und aller anderer Firlefanz.
Ich würde das Addin entweder in einem Ordner ablegen auf den nur ich Schreibrechte habe, oder das Dateiattribut "Schreibgeschützt" setzen. Damit öffnen alle Benutzer das Addin schreibgeschützt und ich kann es problemlos austauschen auch wenn es gerade von anderen geöffnet ist.
Gruß
Nepumuk

AW: guckst du 2. nachrichten vorher ;) [owT]
15.07.2014 09:33:25
Ralf
Hallo Nepumuk,
wie meinst du das mit: "das Addin per Verweis an die Mappe binden"?
Ich WILL keine Formeln in den Mappen!!! ;-)
> Ich würde das Addin entweder in einem Ordner ablegen auf den nur ich Schreibrechte habe, oder das
> Dateiattribut "Schreibgeschützt" setzen. Damit öffnen alle Benutzer das Addin schreibgeschützt und ich
> kann es problemlos austauschen auch wenn es gerade von anderen geöffnet ist.
Genau so mache ich das ;)
Private Sub Workbook_Open()
If Not ThisWorkbook.ReadOnly Then _
If Environ("USERNAME")  "derdencodebearbeitendarfsollwill" Then _
ThisWorkbook.ChangeFileAccess xlReadOnly
End Sub
Gruß
Ralf

Anzeige
AW: guckst du 2. nachrichten vorher ;) [owT]
15.07.2014 09:41:52
Nepumuk
Hallo,
so wie du eine .DLL, .OCX oder .TBL an die Mappe bindest. VBA-Editor - Extras - Verweise. Was hat das mit Formeln zu tun?
Zudem würde ich den Code für das Addin nicht im Addin selber pflegen sondern in einer normalen .XLSM, denn das Speichern des Addins funktioniert nicht immer (hab ich und andere schon erlebt) und damit ist die ganze Arbeit futsch.
Gruß
Nepumuk

AW: guckst du 2. nachrichten vorher ;) [owT]
15.07.2014 10:11:31
Ralf
Hallo Nepumuk,
ist der Verweis tatsächlich an die Datei gebunden oder an das lokale VBA?
Also existiert der Verweis auch auf anderen Rechnern, wenn die Vorlage oder Arbeitsmappe, in der die Makro ausgerufen werden, geöffnet wird?
Wenn ich das auf jeden Rechner gesondert machen muss, ist das leider keine Option.
Werden die Bibliotheken in jeder Excel-Instanz geladen (würde ich nicht wollen, weswegen das Add-In auch nicht installiert wird) oder erst geöffnet, wenn die Verknüpfte Datei geöffnet wird und auch wieder entladen?
Was ist sonst noch dabei zu beachten? Gibt es ein How-To dazu?
Die Möglichkeit des Nicht-Speichern-Können fange ich ab. In erster Linie dadurch, dass nur ich das Add-In mit Schreibrecht offen haben kann. Wenn das Add-In nicht gespeichert werden kann, kommt die Standard-Meldung und dann kann ich immer noch einen anderen Pfad wählen, falls das Netzlaufwerk nicht verfügbar ist.
Wenn du den von den Mappen getrennten Code in einer weiteren XLSM speicherst, kann man das Fenster nicht ausblenden lassen?
Gruß
Ralf

Anzeige
AW: guckst du 2. nachrichten vorher ;) [owT]
15.07.2014 10:19:05
Daniel
Muss man das so kompliziert machen?
Reicht es nicht einfach aus, die Datei mit den Makros im Workbook-Open-Event schreibgeschützt zu öffnen und dann sofort auszublenden (damit sie nicht aus versehen geschlossen werden kann)
Im Close-Event wird diese Datei dann wieder geschlossen.
Da braucht man doch keine AddIns, Verweise oder ähnliches.
Gruß Daniel

AW: guckst du 2. nachrichten vorher ;) [owT]
15.07.2014 10:30:55
Ralf
das ist ein Produktiv-System. Das muss funktionieren. Die Bediener haben keine Ahnung von Excel.

AW: guckst du 2. nachrichten vorher ;) [owT]
15.07.2014 10:46:25
Daniel
Mann die Anwender keine Ahnung von Excel haben, dann sollte man sie auch nicht damit arbeiten lassen, wenn's ein Produktivsystem ist.
Gruß Daniel

Anzeige
AW: guckst du 2. nachrichten vorher ;) [owT]
15.07.2014 10:42:00
Nepumuk
Hallo,
der Verweis wird in der Mappe gespeichert, genauso wie wenn du den Wert einer Zelle änderst und dann speicherst. Das so gebundene Addin wird automatisch mit der Mappe geladen, aber nicht geschlossen wenn du nur die Mappe schließt, Excel aber offen lässt. Das kannst du aber relativ einfach bewerkstelligen, indem du in der Mappe z.B. einen unsichtbaren Namen anlegst welcher in einer Klasse des Addins, welche das Schließen von Mappe überwacht, abgefragt wird. Ist keine Mappe mehr mit diesem Namen geöffnet schließt sich das Addin selber.
Das einzige was du beachten musst, ein VBA-Projekt hat als Standard den Namen "VBAProject". Da keine Verweise mit dem selben Projektnamen parallel aneinander gebunden werden können, musst du den Projektnamen des Addins ändern. Dazu einfach im Projektexplorer auf VBAProject klicken und im Eigenschaftsfenster darunter den Namen ändern.
Den Verweis erstellen ist ganz einfach: VBA-Editor - Extras - Verweise - Durchsuchen - unten bei Dateityp auf "Exceldateien" umschalten und mit einem Doppelklick auf das Addin den Verweis erstellen. Das war's.
Es hat zudem noch den Vorteil, da das Addin nun zum Bestandteil der Mappe geworden ist, kannst du die Routinen im Addin aus der Datenmappe heraus per Call aufrufen und musst nicht über die Run-Methode gehen. Damit ist es auch möglich Objekte aus der Mappe an das Addin zu übergeben was mit Run nicht geht, da diese Methode nur Werte übergeben kann.
Das "Nichtspeichernkönnen" eines Addins löst keinerlei Meldung aus. Ist leider so, sprich du merkst es gar nicht. Erst wenn du das Addin nach dem Schließen wieder öffnest sind alle Änderungen die du zuvor gemacht hast wieder weg. Das passiert nicht bei allen Addins, ein Muster warum das bei manchen so ist habe ich aber noch nicht erkannt, darum gehe ich da lieber auf Nummer sicher. Den Code in einer .XLSM zu bearbeiten und dann diese Mappe als Addin zu speichern ist doch kein Problem, ich mach das immer so.
Gruß
Nepumuk

Anzeige
AddIn speichern
15.07.2014 11:00:39
Ralf
Hallo Nepumuk,
Danke, das ist sehr interessant und nützlich.
Für die bestehenden Projekte werde ich das jedoch nicht umsetzen, da das bedeuten würde, ich müsste sämtliche bestehende Dateien (Tausende) ändern. Ich müsste den Code in "DieseArbeitsmappe", in allen Blättern ändern/löschen und sicherlich auch die Aufrufe ändern von .Run nach Call.
Kann man nachträglich automatisch das AddIn an die Datei binden? Wäre auch ein Totschlagargument..
Da ich gerade ein neues Projekt anfange, werde ich das da ausprobieren.
Zum "nichtspeicherkönnen":
ich habe folgenden Code im AddIn, bisher ist noch nie etwas verloren gegangen.
Zusätzlich kann man Cancel auf True setzen, wodurch das Schließen verhindert wird.
Gruß
Ralf
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Dim nRetVal As Long
If Not ThisWorkbook.Saved Then
nRetVal = MsgBox("Sollen die Änderungen im Add-In '" & _
ThisWorkbook.Name & "' gespeichert werden?", _
vbYesNo + vbQuestion, "Add-In speichern?")
Select Case nRetVal
Case vbYes
ThisWorkbook.IsAddin = True
ChDrive "W"
ChDir "W:\FERTIGUNGSUNTERLAGEN\ZL_Zuschnittslisten\Makros"
If ThisWorkbook.ReadOnly Then
ThisWorkbook.SaveAs ThisWorkbook.FullName & Date, 55
MsgBox "Datei als Sicherungskopie gespeichert!" & vbLf & ThisWorkbook.Name,  _
vbCritical
Else
ThisWorkbook.Save
End If
Case Else
End Select
End If
End Sub

Anzeige
AW: AddIn speichern
15.07.2014 11:22:11
Nepumuk
Hallo,
Kann man nachträglich automatisch das AddIn an die Datei binden?
klar. Dabei kannst du in den Mappen auch noch den kompletten Code austauschen und den angesprochenen Namen in der Mappe hinterlegen damit das Addin weiß ob es sich schließen soll oder nicht.
Bei "Tausende" Mappen würde ich dafür aber ein langes Wochenende einplanen. Vor allen Dingen wenn sich das Update-Makro die Dateien selber suchen muss und dabei auf zehntausende Mappen stößt die nicht geändert werden sollen.
Gruß
Nepumuk

Name hinterlegen
15.07.2014 12:03:00
Ralf
Hallo,
ich lass das lieber.. never touch..
der Aufwand, das zu programmieren, wäre mir zu hoch.
Ich mach es beim neuen Projekt.
Wie funktioniert das mit dem hinterlegten Namen, damit sich das AddIn schließt?
Gruß
Ralf

Anzeige
AW: Name hinterlegen
15.07.2014 12:17:54
Nepumuk
Hallo,
einen unsichtbaren Namen anlegen:
Public Sub InsertLinkName()
Const LINK_NAME = "AddinProject" ' frei wählbar
Call ThisWorkbook.Names.Add(Name:=LINK_NAME, _
RefersTo:=Array(vbNullString), Visible:=False)
End Sub
Wie sieht es bei dir mit Klassenprogrammierung aus, schon mal gemacht?
Gruß
Nepumuk
P.S.: Fang einen neuen Thread an, der wird langsam zu unübersichtlich.

AW: Datei-übergreifend vba code ändern
14.07.2014 13:13:04
Daniel
Hi
Wenn die Makros in einem Allgemeinen Modul liegen und die zu ändernden Dateien nicht wild verstreut sind, sondern zentral in einem Ordner abgelegt sind, dann könntest du auch so vorgehen:
1. das Modul als exportieren, da als .bas- Datei speichern
2. Ein Makro schreiben, welches nacheinander alle Dateien öffnet, dann das betroffene Modul löscht und die gespeicherte .bas-Datei importiert.
Gruß Daniel

AW: Datei-übergreifend vba code ändern
14.07.2014 14:04:02
Nepumuk
Hallo,
und das machst du alle paar Tage bei über 200 Mappen? Super Idee, denn am Update-Tag können die 10 Mann zuhause bleiben und alle sind glücklich.
Gruß
Nepumuk

AW: Datei-übergreifend vba code ändern
14.07.2014 14:23:45
Daniel
HI
das Umtauschmakro musst du ja nur einmal schreiben.
es dann laufen zu lassen sollte bei 200 Dateien maximal ein paar Minuten dauern, wenn nicht jede von diesen Dateien zig Megabyte gross ist.
Ausserdem hat man bei dieser Methode auch die Möglichkeit, an den Dateien selbst was zu ändern und nicht nur den Code.
Generell ist die Methode, Code und Daten zu trennen, so dass alle Datendateien dieselbe Codedatei verwenden, sinnvoller, aber dazu müsstest du jetzt diese 200 Dateien auch komplett überarbeiten und dazu kannst du dann ja meine Idee verwenden.
Gruß Daniel

AW: Datei-übergreifend vba code ändern
15.07.2014 06:17:59
Thomas
Mal ne Verständnisfrage, wenn ich es so mache wie Nepumuk und Ralf geschrieben habe, können dann auch mehrere Leute gleichzeitig mit der Vorlage arbeiten ? Ja oder ? da sie aus der Addin Datei nur lesen.

AW: Datei-übergreifend vba code ändern
15.07.2014 11:24:51
Daniel
Hi
Ich vermute mal ja, aber mit Addis kennen sich die beiden besser aus.
Gruß Daniel

AW: Datei-übergreifend vba code ändern
15.07.2014 11:55:04
Nepumuk
Hallo,
klar können mehrere Leute ein und die selbe Vorlage benutzen, das ist ja Sinn und Zweck einer Vorlage und eines Addins. Wenn du aus dieser Vorlage eine neue Mappe erzeugst, erbt der entstandene Klon auch den Verweis auf das Addin.
Gruß
Nepumuk

AW: Datei-übergreifend vba code ändern
15.07.2014 13:06:19
Thomas
Super :):)
Hab das mal in eine neue Version der Vorlage eingearbeitet, läuft :):):)
Wie siehts denn aus wenn ich in den Tabellen ein neues Makro einfügen will oder eine neue Grafik etc.
Kann ich dass dann auch so machen dass es sich nicht nur auf die neue Vorlage bezieht sondern auch auf die bereits bearbeiteten Dokumente, die mit addin arbeiten ?
MfG
Thomas :)

AW: Datei-übergreifend vba code ändern
15.07.2014 14:09:25
Nepumuk
Hallo,
nein. Die Klone einer Vorlage haben mit dieser nichts mehr zu tun.
Gruß
Nepumuk

309 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige