Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1492to1496
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

Datensammeln von Server

Datensammeln von Server
19.05.2016 17:47:36
Server
Hi Zusammen,
Ich bin kein VBA Profi und dieses Forum hat mir schon bei so manchen Sachen geholfen (als stiller Nutznießser ;) ). Ich stehe vor der Aufgabe Daten aus mehreren Quelltabellen in eine einzige Zieltabelle zu poolen. Dieses Rad ist ja schon mehrfach erfunden worden und ich nutze momentan dieses Makro:
Private Function GetValue(pfad, datei, blatt, zelle)
'** Daten aus geschlossener Arbeitsmappe auslesen
'*** Dimensionierung der Variablen
Dim arg As String
'Sicherstellen, dass das datei vorhanden ist
If Right(pfad, 1)  "\" Then pfad = pfad & "\"
If Dir(pfad & datei) = "" Then
GetValue = "datei Not Found"
Exit Function
End If
'** Das Argument erstellen
arg = "'" & pfad & "[" & datei & "]" & blatt & "'!" & Range(zelle).Range("A1").Address(, ,  _
xlR1C1)
'** Auslesen über Excel4Macro
GetValue = ExecuteExcel4Macro(arg)
End Function
Sub E_auslesen()
'** Dimensionierung der Variablen
Dim pfad As String, datei As String, blatt As String, bereich As Range, zelle As Object, strIn  _
As String, strOut As String
'** Angaben zur auszulesenden Zelle
pfad = "\\SERVER\ORDNER$\UNTERORDNER"
datei = "QUELLE1.xlsx"
blatt = ActiveSheet.Range("K6").Value
strOut = "XXX"
strIn = ""
Range("L2").FormulaArray = "=MAX(ROW(13:65535)*('[" & datei & "]" & blatt & "'!A13:A65535"""") _
)"
Set bereich1 = Range("A13:A" & Range("L2").Value)
Set bereich2 = Range("B13:A" & Range("L2").Value)
Set bereich3 = Range("C13:A" & Range("L2").Value)
Set bereich4 = Range("D13:A" & Range("L2").Value)
Application.ScreenUpdating = False
'** Bereich auslesen
For Each zelle In bereich1
'** Zellen umwandeln
zelle = zelle.Address(False, False)
'** Eintragen in Bereich
ActiveSheet.Cells(zelle.Row, zelle.Column).Value = GetValue(pfad, datei, blatt, zelle)
Next zelle
For Each zelle In bereich2
'** Zellen umwandeln
zelle = zelle.Address(False, False)
'** Eintragen in Bereich
ActiveSheet.Cells(zelle.Row, zelle.Column).Value = GetValue(pfad, datei, blatt, zelle)
Next zelle
For Each zelle In bereich3
'** Zellen umwandeln
zelle = zelle.Address(False, False)
'** Eintragen in Bereich
ActiveSheet.Cells(zelle.Row, zelle.Column).Value = GetValue(pfad, datei, blatt, zelle)
Next zelle
For Each zelle In bereich4
'** Zellen umwandeln
zelle = zelle.Address(False, False)
'** Eintragen in Bereich
ActiveSheet.Cells(zelle.Row, zelle.Column).Value = GetValue(pfad, datei, blatt, zelle)
Next zelle
' Überflüssiges aus den Zellen entfernen
bereich1.Select
Selection.Replace What:=strOut, Replacement _
:=strIn, LookAt:=xlPart, SearchOrder:=xlByRows, MatchCase:=False, _
SearchFormat:=False, ReplaceFormat:=False
Application.ScreenUpdating = True
End Sub

Wie man sehen kann habe ich vier Quellspalten mit Standardtext. Die Daten werden korrekt übertragen. Allerdings werden gleichzeitig sich automatisch aktualisierende Verknüpfungen gesetzt, die bei jedem Start der Zieltabelle eine Aktualisierung anfragen. Das wollte ich eigentlich durch die Verwendung von Makros umgehen, damit andere Nutzer der Zieltabelle damit nicht belästigt werden. Kann ich das irgendwo abschalten? Eigentlich braucht Excel die Verknüpfungen doch auch gar nicht. Die Quelle definiere ich doch mit dem Ausführen des Makros(?)
Dann habe ich öfter das Problem, dass das Makro hier
Range("L2").FormulaArray = "=MAX(ROW(13:65535)*('[" & datei & "]" & blatt & "'!A13:A65535""""))"

nach der Excel-Datei fragt, obwohl Pfad und Datei korrekt definiert sind. Beim Abbrechen gibts die Fehlermeldung "Typen inkompatibel". Kann das an einem lahmen Server liegen, auf dem die Quelltabellen liegen? Bisher kann ich das so lösen, dass ich die Quelltabelle einmal öffne und schließe. Danach kann ich das Makro problemlos ausführen (nur dann könnte ich ja auch normal kopieren).
Zu guter Letzt ... Das Makro könnte gerne schneller laufen. Für das Einlesen von vier Spalten mit jeweils weniger als 300 Einträgen brauche ich schon 2–3 Minuten. Ich fürchte, dass es an den beiden bedingten Formatierungen liegt, die jede der vier Zielspalten "besitzt"(?) Diese nutze ich um Inkonsistenzen zwischen dem aktuell eingelesen und dem vorherigen Stand sichtbar zu machen (nach einem Abgleich kopiert Excel die vier Spalten in weitere vier "Status Quo" Spalten).
Über Vorschläge zur Optimierung meines Makros wäre ich dankbar :)
Grüße,
Philipp

4
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Datensammeln von Server
19.05.2016 22:33:58
Server
Hallo Philipp,
Allerdings werden gleichzeitig sich automatisch aktualisierende Verknüpfungen gesetzt, die bei jedem Start der Zieltabelle eine Aktualisierung anfragen. Das wollte ich eigentlich durch die Verwendung von Makros umgehen, damit andere Nutzer der Zieltabelle damit nicht belästigt werden. Kann ich das irgendwo abschalten? Eigentlich braucht Excel die Verknüpfungen doch auch gar nicht. Die Quelle definiere ich doch mit dem Ausführen des Makros(?)
Das Makro trägt in Zelle L2 eine Formel mit einem Verweis auf die Quelle ein. Deshalb die Nachfrage beim Öffnen der Fatei. Hier muss die Formel zustzlich durch ihren Wert ersetzt werden.
Dann habe ich öfter das Problem, dass das Makro hier
Range("L2").FormulaArray = "=MAX(ROW(13:65535)*('[" & datei & "]" & blatt & "'!A13:A65535""""))"
nach der Excel-Datei fragt, obwohl Pfad und Datei korrekt definiert sind.

Du hast vergessen den Pfad mit in die Formel einzubauen. Deshalb die Nachfrage durch das Makro/Excel.
Beschleunigung der Makro-Ausführung:
1. Bei der Festlegung der Bereiche 1 bis 4 gibt es Überschneidngen
Die Werte für die Spalteb A bis C werden so mehrfach berechnet. Hier müssen die Set-Anweisungen anepasst werden
2. Berecnungsmodus vorübergehend auf manuell setzen und Ereignismakros deaktivieren
Dies zusätzlich zur Deaktivierung der Bildschirmaktualisierung.
3. Select-Anweisungen vermeiden
Gruß
Franz
angepasstes Makro:
Private Function GetValue(pfad, datei, blatt, zelle)
'** Daten aus geschlossener Arbeitsmappe auslesen
'*** Dimensionierung der Variablen
Dim arg As String
'Sicherstellen, dass das datei vorhanden ist
If Right(pfad, 1)  "\" Then pfad = pfad & "\"
If Dir(pfad & datei) = "" Then
GetValue = "datei Not Found"
Exit Function
End If
'** Das Argument erstellen
arg = "'" & pfad & "[" & datei & "]" & blatt & "'!" & Range(zelle).Range("A1").Address(, ,  _
xlR1C1)
'** Auslesen über Excel4Macro
GetValue = ExecuteExcel4Macro(arg)
End Function
Sub E_auslesen()
'** Dimensionierung der Variablen
Dim pfad As String, datei As String, blatt As String, bereich As Range, zelle As Object, _
strIn As String, strOut As String
Dim StatusCalc As Long
'** Angaben zur auszulesenden Zelle
pfad = "\\SERVER\ORDNER$\UNTERORDNER"
datei = "QUELLE1.xlsx"
blatt = ActiveSheet.Range("K6").Value
strOut = "XXX"
strIn = ""
'** Makrobremsen lösen
With Application
.ScreenUpdating = False
StatusCalc = .Calculation  'Berechnungs-Status merken
.Calculation = xlCalculationManual
.EnableEvents = False
End With
'** Anzahl Zeilen mit Daten in Quelle
With Range("L2")
.FormulaArray = "=MAX(ROW(13:65535)*('" & pfad & "[" & datei & "]" & blatt _
& "'!A13:A65535""""))"
.Calculate
.Value = .Value
End With
Set bereich1 = Range("A13:A" & Range("L2").Value)
Set bereich2 = Range("B13:B" & Range("L2").Value)
Set bereich3 = Range("C13:C" & Range("L2").Value)
Set bereich4 = Range("D13:D" & Range("L2").Value)
'** Bereich auslesen
For Each zelle In bereich1
'** Zellen umwandeln
zelle = zelle.Address(False, False)
'** Eintragen in Bereich
ActiveSheet.Cells(zelle.Row, zelle.Column).Value = GetValue(pfad, datei, blatt, zelle)
Next zelle
For Each zelle In bereich2
'** Zellen umwandeln
zelle = zelle.Address(False, False)
'** Eintragen in Bereich
ActiveSheet.Cells(zelle.Row, zelle.Column).Value = GetValue(pfad, datei, blatt, zelle)
Next zelle
For Each zelle In bereich3
'** Zellen umwandeln
zelle = zelle.Address(False, False)
'** Eintragen in Bereich
ActiveSheet.Cells(zelle.Row, zelle.Column).Value = GetValue(pfad, datei, blatt, zelle)
Next zelle
For Each zelle In bereich4
'** Zellen umwandeln
zelle = zelle.Address(False, False)
'** Eintragen in Bereich
ActiveSheet.Cells(zelle.Row, zelle.Column).Value = GetValue(pfad, datei, blatt, zelle)
Next zelle
' Überflüssiges aus den Zellen entfernen
bereich1.Replace What:=strOut, Replacement:=strIn, LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False
'** Makrobremsen zurücksetzen
With Application
.ScreenUpdating = True
.Calculation = StatusCalc
.EnableEvents = True
End With
End Sub

.

Anzeige
AW: Datensammeln von Server
20.05.2016 11:45:39
Server
Hi Franz,
Vielen Dank für Deine Hilfe :) Den Pfad vergessen ... also manchmal hat man da echt ein Brett vorm Kopp. Zuerst lief der Code trotzdem nicht, erst nachdem ich bei der Definition des Pfads noch ein "\" ans Ende gestellt habe gab's keine Probleme mehr. Und merklich schneller ist der Code jetzt auch :)))
Warum gab es Überschneidungen in den Bereichen? Reichte die Definition nicht aus?
Grüße,
Philipp

AW: Datensammeln von Server
20.05.2016 14:21:21
Server
Hallo Philipp,
Warum gab es Überschneidungen in den Bereichen? Reichte die Definition nicht aus?

Du hattest die Bereich wie folgt definiert
  Set bereich1 = Range("A13:A" & Range("L2").Value)
Set bereich2 = Range("B13:A" & Range("L2").Value)
Set bereich3 = Range("C13:A" & Range("L2").Value)
Set bereich4 = Range("D13:A" & Range("L2").Value)

Wenn ib L2 z.B. 300 steht, dann macht Excel daraus
  Set bereich1 = Range("A13:A300")
Set bereich2 = Range("B13:A300") 'bzw. "A13:B300"
Set bereich3 = Range("C13:A300") 'bzw. "A13:C300"
Set bereich4 = Range("D13:A300") 'bzw. "A13:D300"
Gruß
Franz

Anzeige
AW: Datensammeln von Server
22.05.2016 10:33:50
Server
Ach ... doof. So ein peinlicher Copy & Paste Fehler :/
Dank Dir!

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige