Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
560to564
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
560to564
560to564
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

Speichern unter-Funktion

Speichern unter-Funktion
04.02.2005 17:25:03
Uwe
Hallöchen!
Ich habe folgendes Problem.
Ich habe ein Excel-Tool mit unheimlich vielen Tabellenblättern/ Formatierungen und Makros, so dass die Datei recht groß geworden ist.
Es sollen nun meherer Personen, die Zugriff auf eine Laufwerk haben, dieses Tool benutzen und Daten abspeichern. Wenn jeder jedoch dieses Tool abspeichert, dann platzt die Festplatte.
Aus diesem Grund möchte ich die Daten auslagern. Das ist jedoch noch nicht das Problem.
Das Problem besteht darin, dass jeder seine Daten unter einem anderen Namen in einem anderen Ordner abspeichert.
Daher suche ich jetzt eine Möglichkeit, wie man individuell die Daten speichern/ exportieren kann (analog dem Befehl "speichern unter") und auch wieder aufrufen/ importieren kann (analog dem Befehl "Datei öffnen"). Beim öffnen sollen die Daten dann importiert werden.
Es soll halt so benutzerfreundlich wie möglich gestaltet werden.
Könnt Ihr mir helfen?
Gruß
Uwe

12
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Speichern unter-Funktion
05.02.2005 11:46:59
Björn B.
Hallo Uwe,
wenn du dich an VBA ran traust, dann könntest du z. B. den Excel-Benutzernamen (Application.UserName) abfragen und in Abhängigkeit von diesem Namen einen festen Pfad vorgeben. Aber Achtung, es ist der Excel-Benutzername, den du unter Extras - Optionen - Registerkarte Allgemein findest, nicht der Benutzername, mit dem man sich z. B. in Windows einloggt.
Gruß
Björn
AW: Speichern unter-Funktion
05.02.2005 19:30:00
Uwe
Hallo Björn,
Vielen Dank für deine Nachricht.
Das Auslagern von Daten in ein definiertes Verzeichnis bekomme ich hin. Das Problem ist nur, dass die Daten je nach Benutzer in ein anderes Verzeichnis abgespeichert werden.
Die Benutzer entscheiden selber , wo die Daten abspeichert werden sollen.
Aus diesem Grund versuche ich einen Befehl zu finden, die dem Benutzer diese Möglichkeit gibt. Unter der VBA-Hilfe gibt es ein Hinweis auf "Datei exportieren" über ein Dialogfeld (ähnlich dem Standard-Befehl "speichern unter" unter Datei. In der Hilfe wird mir jedoch nicht klar, wie ich es programmieren soll.
In VBA bin ich nicht fit. Ich versuche die Befehle über Makros aufzuzeichnen. Wenn ich jedoch auf "speichern unter" klicke, werde ich aufgefordert einen Pfad einzugeben, der dann auch im Makro gespeichert wird. Den Pfad soll jedoch der Benutzer vorgeben und nicht ich. Wenn ich jedoch auf abbrechen gehe, dann wird das Makro nicht aufgezeichnet.
Es soll auch keine Kopie erstellt werden, sondern es sollen nur die Daten in den Tabellenblättern ausgelagert werden. Der Grund dafür liegt in der Dateigröße (Momentan rd 4 MB aufgrund von Formatierungen und Makros). Durch das Auslagern könnte ich die Auslagerungsdatei auf wenige KB beschränken. Wenn viele Benutzer das 4 MB-Excel-Tool abspeichern würden, dann sprengt das die Festplattenkapazität.
Das nächste Problem, das nach dem Lösen des 1. Problems wahrscheinlich auftaucht ist, wie ich die Daten anschließend wieder ins Programm ziehe. D.h. der jeweilige Benutzer muss seine abgespeicherten Daten suchen, aufrufen und importieren.
Hast du einen Rat?
Gruß
Uwe
Anzeige
AW: Speichern unter-Funktion
06.02.2005 11:16:14
Björn B.
Hallo Uwe,
verstehe ich das richtig, dass du die Datei mit dem Code zentral lagerst, die Datei von jedem Benutzer geöffnet werden kann und dieser dann seine Daten in eine schreibgeschützte Kopie der zentralen Datei einfügt, damit arbeitet und seine Daten extern speichert?
Wie realisierst Du denn z. Z. das Speichern der Daten?
Gibt es einen festen Pfad und einen Dateinamen pro Benutzer oder kann das Variieren, z. B. weil er verschiedene Datendateien hat?
Gruß
Björn
AW: Speichern unter-Funktion
06.02.2005 17:39:46
U
Hallo Björn,
Die Datei soll zentral gespeichert werden, so dass jeder Zugriff hat. Die Daten sollen dann in einem Ordner abgespeichert werden, der vom Benutzer beliebig gewählt werden kann. Eine feste Pfadangabe ist daher nicht möglich. Die Anzahl der Benutzer und der auszulagernden Dateien kann ebenfalls variieren.
Gruß Uwe
Anzeige
AW: Speichern unter-Funktion
06.02.2005 17:53:17
Björn B.
Hallo Uwe,
und was hast Du bisher um deine Daten auszulagern?
Mach doch ggf. mal ein Upload.
Gruß
Björn
P.S.: Bin wohl erst in 2 Stunden wieder online.
AW: Speichern unter-Funktion
06.02.2005 18:27:33
Uwe
Hallo Björn,
anbei die ausgelagerte Datei. Aufgrund der Größe musste ich einiges rauslöschen.

Die Datei https://www.herber.de/bbs/user/17551.xls wurde aus Datenschutzgründen gelöscht

Im Modul "speichern" ist bereits ein Makro hinterlegt. In einer anderen Version funktionierte es. Nur in der jetzigen nicht und ich weiß nicht warum.
Gruß Uwe!
AW: Speichern unter-Funktion
06.02.2005 22:05:25
Björn B.
Hallo Uwe,
beim Export-Makro fehlte das Klammerpaar bei der Dimensionierung der Feldvariablen arr. Ausserdem waren in den Zellen F65 und F110 Formeln die eine Division durch Null versuchten. Diese Formeln habe ich gelöscht.
Ergänzt habe ich in dem Export-Makro eine Routine, die das Kommazeichen in Zahlen durch einen Punkt ersetzt. Nun funktioniert auch der Import richtig, da VBA nun Zahlen und keinen Text erkennt.
https://www.herber.de/bbs/user/17558.xls
Ansonsten hast Du ja schon prima Vorarbeit geleistet!
Gibt es nun noch Änderungsbedarf?
Gruß
Björn
Anzeige
AW: Speichern unter-Funktion
07.02.2005 00:09:49
Uwe
Hallo Björn,
vielen Dank für die 2. Version.
Export und Import laufen in der Testversion.
In der richtigen Version läuft es jedoch nicht. Eine Txt.-Datei wird zwar gespeichert, jedoch ohne Daten. In meiner Version sind Z.T. Spalten und Zellen ausgeblendet, die einen Nullwert haben. Außerdem ist der Tabellenblattname eine Variable. Aber das kann doch eigentlich auch nicht der Grund sein?
Im Moment gebe ich in dem Makro diejenigen Tabellenblätter an, die nicht eingeblendet werden sollen (z.B. "Menü"). Wenn ich das Tabellenblatt umbenenne, dann werden diese Daten auch mit übertragen. Wie kann ich in dem Makro den Namen des Tabellenblatts als variable definieren?
Ich werde die nächsten 3 Tage nicht erreichbar sein. Nicht das du dich wunderst, dass ich mich nicht zurückmelde.
Bis Donnerstag.
Gruß
Uwe
Anzeige
AW: Speichern unter-Funktion
07.02.2005 00:27:33
Björn B.
Hallo Uwe,
das Problem der leeren Datei tritt auf, wenn in dem zu kopierenden Bereich ein Fehlerwert steht. Am einfachsten findest du die Stelle, wenn du in deinem Makro die
On Error GoTo ERRORHANDLER Anweisung auskommentierst. Im Debug-Modus wird dir wenn du mit der Maus auf die Variable n zeigst die Spalte und wenn du auf die Variable m zeigst die Zeile (minus 7 Zeilen) angegeben, in der der Fehler auftritt. n=6, m=30 bedeutet also Fehler in Zeile 37 Spalte F.
Über den Rest denke ich mal nach.
Gruß
Björn
Ergänzung
07.02.2005 01:16:00
Björn B.
Hallo Uwe,
Im Projekt Explorer von VBA kannst du den Codenamen für die Tabellenblätter sehen.
In der von mir hochgeladenen Datei z. B. steht Tabelle1(Menü). Dabei ist Menü der Tabellenname und Tabelle1 der Codename. Änderst du den Namen des Tabellenblattes von Menü in Start, so ändert sich der Codname nicht.
Gesetzt den Fall dein Blatt Datenblatt hätte den Codenamen Tabelle2, so müsstest du im Export-Makro nur die Zeile
If wks.CodeName <> "Menü" And wks.CodeName <> "Datenblatt" Then
durch
If wks.CodeName <> "Tabelle1" And wks.CodeName <> "Tabelle2" Then
ersetzen.
Gruß
Björn
Anzeige
AW: Ergänzung
10.02.2005 22:54:23
Uwe
Hallo Björn,
ich habe immer noch Probleme beim Import. Der Export funktioniert.
Wenn ich die On Error GoTo ERRORHANDLER Anweisung auskommentiere bekomme ich folgende Fehlermeldung:
bei set wks = sheet (arr(0)) ' Index außerhalb des gültigen Bereichs
Wenn ich mit der Maus auf m bzw. n gehe, erhalte ich jedes mal m=0 und n=0
Die Formeln sehen wie folgt aus:
Option Explicit

Sub exportData()
Dim wks As Worksheet
Dim sFile As String, tmp As String
Dim arr() As Variant
Dim n As Long, m As Integer, j As Long
Application.ScreenUpdating = False
sFile = Application.GetSaveAsFilename(InitialFilename:=".txt", _
FileFilter:="Text Dateien (*.txt), *.txt")
If sFile = "Falsch" Then Exit Sub
On Error GoTo ERRORHANDLER
With Application
.ScreenUpdating = False
.EnableEvents = False
.DisplayAlerts = False
.Calculation = xlCalculationManual
End With
Open sFile For Output As #1
For Each wks In ThisWorkbook.Worksheets
If wks.CodeName <> "Tabelle1" And wks.CodeName <> "Tabelle4" And wks.CodeName <> "Tabelle2" Then
'hier die Namen der Tabellen die NICHT exportiert werden sollen angeben!
arr = wks.Range("A1:L157").Value
arr = Application.Transpose(arr)
For m = 1 To UBound(arr, 2)
For n = 1 To UBound(arr, 1)
'nachfolgend wird das Komma bei Dezimalzahlen in einen Punkt verwandelt, um beim
'Import keine fehlerhafte Anzeige zu erhalten
If IsNumeric(arr(n, m)) Then
For j = 1 To Len(arr(n, m))
If Mid(arr(n, m), j, 1) = "," Then
arr(n, m) = Left(arr(n, m), j - 1) & "." & Right(arr(n, m), Len(arr(n, m)) - j)
Exit For
End If
Next j
End If
tmp = tmp & ";" & arr(n, m)
Next
Next
Write #1, wks.CodeName & tmp
wks.Range("A1:L157").ClearContents
End If
Next
Close #1
MsgBox "Die Daten wurden erfolgreich Exportiert!"
ERRORHANDLER:
With Application
.ScreenUpdating = True
.EnableEvents = True
.DisplayAlerts = True
.Calculation = xlCalculationAutomatic
.StatusBar = False
End With
Application.Run ("Formeln_einfügen")
Application.Run ("Name_zurücksetzen_1")
Application.Run ("Name_zurücksetzen_2")
Application.Run ("Name_zurücksetzen_3")
Application.Run ("Name_zurücksetzen_4")
Application.Run ("Name_zurücksetzen_5")
Application.Run ("Name_zurücksetzen_6")
Application.Run ("Name_zurücksetzen_7")
Application.Run ("Name_zurücksetzen_8")
Application.Run ("Name_zurücksetzen_9")
Application.Run ("Name_zurücksetzen_10")
Application.Run ("Zusammenfassung_ausblenden")
'Application.Run ("Blattschutz")
Application.Run ("inaktive_Blätter_ausblenden")
End Sub



Sub importData()
Dim wks As Worksheet
Dim sFile As String, tmp As String
Dim arr As Variant
Dim n As Long, m As Integer, i As Integer
Application.ScreenUpdating = False
Application.Run ("Blattschutz_aufheben")
Application.Run ("alle_Tabellenblätter_einblenden")
sFile = Application.GetOpenFilename("Text Dateien (*.txt), *.txt")
If sFile = "Falsch" Then Exit Sub
'On Error GoTo ERRORHANDLER
With Application
.ScreenUpdating = False
.EnableEvents = False
.DisplayAlerts = False
.Calculation = xlCalculationManual
End With
Open sFile For Input As #1
Do While Not EOF(1)
Input #1, tmp
arr = Split(tmp, ";")
Set wks = Sheets(arr(0))
For n = 1 To 157
For m = 1 To 12
i = i + 1
wks.Cells(n, m) = arr(i)
Next
Next
Loop
Close #1
ERRORHANDLER:
With Application
.ScreenUpdating = True
.EnableEvents = True
.DisplayAlerts = True
.Calculation = xlCalculationAutomatic
End With
Application.Run ("Formeln_einfügen")
Application.Run ("inaktive_Blätter_ausblenden")
Application.Run ("Zusammenfassung_ausblenden")
Application.Run ("Blattschutz")
End Sub

Ich würde dir gerne die komplette Datei einstellen, jedoch kann ich diese aufgrund der Größe (gezippt rd 780 KB) nicht auf den Server ziehen.
Einzige Möglichkeit wäre, wenn ich dir meine email-Adresse zukomme und du mir auf diesem Weg deine e-mail zukommen lassen würdest. So wird deine e-mail nicht im Forum öffentlich.
Ich würde dir natürlich versichern, dass ich deine mail-Adresse vertraulich und nur für dieses Problem verwenden würde. Bei anderen Problemen würde ich mich wieder ans allgemeine Forum wenden. Ansonsten wüßte ich nicht, wie ich meine Datei noch kleiner (max 300 KB) bringen soll.
Bitte gib mir kurz bescheid, auch wenn du nicht damit einverstanden bist. Dann muss ich mir was anderes einfallen lassen.
Gruß Uwe
Anzeige
AW: Ergänzung
11.02.2005 06:05:11
Björn B.
Hallo Uwe,
das Problem entsteht dadurch, dass du beim Export nicht mehr den Blattnamen sondern den Codenamen abspeicherst. Deshalb ist die Anweisung bei Import fehlerhaft, da es ja sheets(Blattname) und nicht sheets(codename) heißt.
Beide Varianten, Code- und Blattname, haben ihre Vor- und Nachteile. Wenn du mit dem Codenamen arbeitest, kommst du immer wieder auf das selbe Tabellenblatt zurück, was nur solange klappt, bis einer das mal kopiert und das Original löscht (das gleiche ist ja nicht das selbe!). Auf der anderen Seite ist das Risiko beim Blattnamen, dass einer das Tabellenblatt umbenennt. Denkbar wäre als noch sicherere Variante sowohl Codenamen als auch Blattnamen beim Export der Datei voranzustellen und zunächst nach dem Codenamen und danach nach dem Blattnamen zu suchen und nur wenn gar nichts passt abzubrechen.
Wenn du das im Export nicht wieder ändern willst, dann musst du die nachfolgende Import-Prozedur verwenden.

Sub importData()
Dim wks As Worksheet
Dim sFile As String, tmp As String
Dim arr As Variant
Dim n As Long, m As Integer, i As Integer
Application.ScreenUpdating = False
Application.Run ("Blattschutz_aufheben")
Application.Run ("alle_Tabellenblätter_einblenden")
sFile = Application.GetOpenFilename("Text Dateien (*.txt), *.txt")
If sFile = "Falsch" Then Exit Sub
On Error GoTo ERRORHANDLER
With Application
.ScreenUpdating = False
.EnableEvents = False
.DisplayAlerts = False
.Calculation = xlCalculationManual
End With
Open sFile For Input As #1
Do While Not EOF(1)
Input #1, tmp
arr = Split(tmp, ";")
For Each wks In Sheets
If wks.CodeName <> arr(0) Then
Set wks = Nothing
Else
Exit For
End If
Next
If wks Is Nothing Then
Close #1
MsgBox "Das Tabellenblatt zum Einfügen der Daten wurde gelöscht!"
Exit Sub
End If
For n = 1 To 157
For m = 1 To 12
i = i + 1
wks.Cells(n, m) = arr(i)
Next
Next
Loop
Close #1
ERRORHANDLER:
With Application
.ScreenUpdating = True
.EnableEvents = True
.DisplayAlerts = True
.Calculation = xlCalculationAutomatic
End With
Application.Run ("Formeln_einfügen")
Application.Run ("inaktive_Blätter_ausblenden")
Application.Run ("Zusammenfassung_ausblenden")
Application.Run ("Blattschutz")
End Sub


Wenn du die Variante mit Code- und Blattnamen ausprobieren willst, dann versuche es mal mit folgenden Ex- und Import-Prozeduren:

Option Explicit

Sub exportData()
Dim wks As Worksheet
Dim sFile As String, tmp As String
Dim arr() As Variant
Dim n As Long, m As Integer, j As Long
Application.ScreenUpdating = False
sFile = Application.GetSaveAsFilename(InitialFilename:=".txt", _
FileFilter:="Text Dateien (*.txt), *.txt")
If sFile = "Falsch" Then Exit Sub
On Error GoTo ERRORHANDLER
With Application
.ScreenUpdating = False
.EnableEvents = False
.DisplayAlerts = False
.Calculation = xlCalculationManual
End With
Open sFile For Output As #1
For Each wks In ThisWorkbook.Worksheets
If wks.CodeName <> "Tabelle1" And wks.CodeName <> "Tabelle4" And wks.CodeName <> "Tabelle2" Then
'hier die Namen der Tabellen die NICHT exportiert werden sollen angeben!
arr = wks.Range("A1:L157").Value
arr = Application.Transpose(arr)
For m = 1 To UBound(arr, 2)
For n = 1 To UBound(arr, 1)
'nachfolgend wird das Komma bei Dezimalzahlen in einen Punkt verwandelt, um beim
'Import keine fehlerhafte Anzeige zu erhalten
If IsNumeric(arr(n, m)) Then
For j = 1 To Len(arr(n, m))
If Mid(arr(n, m), j, 1) = "," Then
arr(n, m) = Left(arr(n, m), j - 1) & "." & Right(arr(n, m), Len(arr(n, m)) - j)
Exit For
End If
Next j
End If
tmp = tmp & ";" & arr(n, m)
Next
Next
Write #1, wks.CodeName & ";" & wks.Name & tmp
wks.Range("A1:L157").ClearContents
End If
Next
Close #1
MsgBox "Die Daten wurden erfolgreich Exportiert!"
ERRORHANDLER:
With Application
.ScreenUpdating = True
.EnableEvents = True
.DisplayAlerts = True
.Calculation = xlCalculationAutomatic
.StatusBar = False
End With
Application.Run ("Formeln_einfügen")
Application.Run ("Name_zurücksetzen_1")
Application.Run ("Name_zurücksetzen_2")
Application.Run ("Name_zurücksetzen_3")
Application.Run ("Name_zurücksetzen_4")
Application.Run ("Name_zurücksetzen_5")
Application.Run ("Name_zurücksetzen_6")
Application.Run ("Name_zurücksetzen_7")
Application.Run ("Name_zurücksetzen_8")
Application.Run ("Name_zurücksetzen_9")
Application.Run ("Name_zurücksetzen_10")
Application.Run ("Zusammenfassung_ausblenden")
Application.Run ("Blattschutz")
Application.Run ("inaktive_Blätter_ausblenden")
End Sub



Sub importData()
Dim wks As Worksheet
Dim sFile As String, tmp As String
Dim arr As Variant
Dim n As Long, m As Integer, i As Integer
Application.ScreenUpdating = False
Application.Run ("Blattschutz_aufheben")
Application.Run ("alle_Tabellenblätter_einblenden")
sFile = Application.GetOpenFilename("Text Dateien (*.txt), *.txt")
If sFile = "Falsch" Then Exit Sub
On Error GoTo ERRORHANDLER
With Application
.ScreenUpdating = False
.EnableEvents = False
.DisplayAlerts = False
.Calculation = xlCalculationManual
End With
Open sFile For Input As #1
Do While Not EOF(1)
Input #1, tmp
arr = Split(tmp, ";")
For Each wks In Sheets
If wks.CodeName <> arr(0) Then
Set wks = Nothing
Else
Exit For
End If
Next
If wks Is Nothing Then
For Each wks In Sheets
If wks.Name <> arr(1) Then
Set wks = Nothing
Else
Exit For
End If
Next
End If
If wks Is Nothing Then
Close #1
MsgBox "Das Tabellenblatt zum Einfügen der Daten wurde gelöscht!"
Exit Sub
End If
i = 1 'Zähler muss um eins höher gesetzt werden, da in arr(0) der codename
'und in arr(1) der Blattname steht.
For n = 1 To 157
For m = 1 To 12
i = i + 1
wks.Cells(n, m) = arr(i)
Next
Next
Loop
Close #1
ERRORHANDLER:
With Application
.ScreenUpdating = True
.EnableEvents = True
.DisplayAlerts = True
.Calculation = xlCalculationAutomatic
End With
Application.Run ("Formeln_einfügen")
Application.Run ("inaktive_Blätter_ausblenden")
Application.Run ("Zusammenfassung_ausblenden")
Application.Run ("Blattschutz")
End Sub

Falls Du noch Probleme hast, kann ich dir leider erst ab dem 19.02. wieder helfen, da ich gleich in den Urlaub fahre. Entweder musst du dich dann gedulden oder dich wieder ans Forum wenden.
Falls es dann noch von Belang ist, habe ich kein Problem damit dir eine E-Mail zu schicken, nur posten möchte ich die Adresse nicht.
Lass von dir hören, ob's klappt.
Viel Erfolg!
Gruß
Björn
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige