GELÖST Kann VBA Daten aus anderen .xls Dateien auslesen?

Diskutiere Kann VBA Daten aus anderen .xls Dateien auslesen? im Programmierung Forum im Bereich Programmierung; Hallo zusammen, ich habe eine Frage und zwar gibt es drei Exceldateien. a) .xls Datei, wo der programmierte Code hin soll (den ich noch machen...
#1
M

[~Micha~]

Threadstarter
Dabei seit
19.10.2007
Beiträge
19
Hallo zusammen,

ich habe eine Frage und zwar gibt es drei Exceldateien.

a) .xls Datei, wo der programmierte Code hin soll (den ich noch machen muss)
b) .xls Datei, wo ein Teil der Daten steht
c) .xls Datei, wo ein anderer Teil der Daten steht

Da die .xls Dateien b) + c) täglich bzw. wöchentlich ergänzt bzw. neu exportiert werden, wäre es am Besten, wenn die .xls Datei a) auf die .xls Dateien b) + c) zugreifen kann, somit wäre immer der aktuellste Stand gegeben.

Die Daten aus b) + c) sollen verglichen, berechnet und in der Excel Datei a) ausgegeben werden.

Bisher habe ich nur innerhalb einer Tabelle gesucht, verglichen und berechnet und innerhalb einer .xls Datei (mehrere Tabellenblätter).

Gibt es einen Befehl, mit dem man von .xls a) auf die anderen beiden .xls Dateien zugreifen und die Daten in Datei a) übertragen kann?

Bitte um Rückmeldung. Danke im Voraus.

[~Micha~]
 
#2
A

AlienJoker

Gast
Na logisch doch! Muss ich leider jeden tag machen.

Als allererstes brauchst du ein Excel-Object
Dim objExcel as new excel.application

und ein Sheet-Object
Dim objSheet as Object

Dann kannst du die Datei öffnen
objExcel.Workbooks.Open "Dateipfad & Dateiname"

Jetzt kannst du auf die Sheets zugreifen
set objSheet = objExcel.Sheets("Sheetname")

Und dann kannst du den Inhalt mit
objsheet.cells(x,y) abgreifen, wie immmer

Am Ende solltest du deine Datei auch wieder schließen
Wenn du sie vorher speichern magst:
Warnmeldungeln ala "Wirklich speichern?" ausmachen:
objExcel.EnableEvents = False
objExcel.DisplayAlerts = False

und Speichern
objExcel.ActiveWorkbook.saveas "Dateipfad & Dateiname"

Dann die Datei schließen
objExcel.ActiveWorkbook.Close SaveChanges:=False
objExcel.Quit


zur Perfektion solltest du deine Objekte dann zerstören
set objExcel =nothing
set objSheet=nothing


Ein Kinderspiel, wie du siehst...wenn ich mich nicht vertippt habe :sing:sing:sing
 
Zuletzt bearbeitet:
#3
M

[~Micha~]

Threadstarter
Dabei seit
19.10.2007
Beiträge
19
Hallo, danke für deine Rückmeldung. Das hilft mir aufjedenfall schon mal sehr weiter. :up

Ich bin gerade am probieren, ob es unter Einbeziehung der oberen Formeln möglich ist ...

- von a) zu b) zu springen, den Wert bei b) auslesen, zurückzuspringen zu a), dabei muss der Wert zwischengespeichert werden und den Wert der zwischengespeichert wurde, dann mit einem Zelleninhalt aus a) vergleichen

Die darauffolgenden Bedingungen sind eine andere Sache, die kommen danach, aber ich versuche gerade, es so hinzubekommen, wie oben beschrieben, vielleicht hast du ja einen Tipp für mich, ansonsten probiere ich jetzt mal weiter. ;)

[~Micha~]

// edit: Okay, habe es geschafft. Baue mein Programm jetzt weiter auf. Ich meld mich. :)
 
Zuletzt bearbeitet:
#5
M

[~Micha~]

Threadstarter
Dabei seit
19.10.2007
Beiträge
19
Hallo,

so habe es jetzt geschafft es fehlt zwar noch ein Teil des Ausgabecodes,
aber ich habe momentan ein größeres Problem. Anbei ein Beispiel:

Tabelle 2 umfasst 3300 Zeilen - Tabelle 3 umfasst 700 Zeilen

Tabelle 1 : Ausgabe
Tabelle 2: Wert aus Zelle 1) vergleichen mit Inhalt Tabelle 3
Tabelle 3: umfasst 700 Zeilen

Sobald das passiert ist geht es weiter mit ....

Tabelle 1 : Ausgabe
Tabelle 2: Wert aus Zelle 2) vergleichen mit Inhalt Tabelle 3
Tabelle 3: umfasst 700 Zeilen

dann 3) 4) 5) und so weiter ... bis 3300 Zeilen durchgelaufen sind.

___________________

Pro Zelle braucht er ca. 1 Sekunde um 700 Zeilen durchzulaufen,
jedoch muss das über 3300 mal passieren.

3300 Zeilen : 60 Sekunden = 55 Minuten

Naja das ist halt mein Problem kann man das irgendwie beschleunigen?
Weiterhin besteht das Problem, sobald ich das Fenster auch nur anseitsweise antippe während des Überprüfens hängt sich das Programm auf. :flenn

Code:
Dim i As String
Dim a As String

a = 1
i = 2

Do
Wert1 = Tabelle1.Cells(a, 1)

Worksheets("Tabelle1 (3)").Range("I2:I65536").Select
Do While i <= 700 ' Überprüfung bis Zeilenanzahl (700)
 If ActiveCell.Value = Wert1 Then
 Me.txtausgabe1.Text = "Wert1:   = " & Wert1
 Me.txtausgabe2.Text = "Wert2: = " & ActiveCell.Value
 MsgBox "Wert gefunden"
 Else
 End If
 
 ActiveCell.Offset(1, 0).Activate

i = i + 1
Loop

'MsgBox i

If i >= 700 Then ' 700
a = a + 1
i = 2
End If

If a >= 3300 Then '3300

MsgBox "Berechnung wurde durchgeführt."
Exit Sub
End If

Loop
Bitte um Rückmeldung. Danke im Voraus.

[~Micha~]
 
#6
A

AlienJoker

Gast
Da Excel im Gegensatz zu Access nur eine reine Datenhalde ist, lässt sich das nicht maßgeblich beschleunigen, es sei denn, man macht das ganze eben in Access. Da dauert sowas keine 5 Minuten.

Ein bis zwei kleine Tipps habe ich aber:
1. Im Fall von "Wert gefunden" musst du ja nicht weiterlaufen, hier also ein "Exit do" einbauen um die innere do-loop-Schleife zu verlassen. Denn dann willst du ja nicht mehr weiterprüfen, oder?

2. Die 2 Msgbox-Befehle: Wirst du nicht müde, die wegzuklickern?

3. Das riesen-Select ist auch net so der Bringer, was machst du damit?

4. Während das ganze läuft, sollte man bei der leicht schwammigen Programmierung excel in ruhe lassen. Ansonsten geht das selten gut. Oder man muss, wie ich bereits vorgeschlagen hatte, die Excelfiles an Objekte binden und immmer damit arbeiten, dann läuft das ganze etwas besser. Also nie mit ActiveWorkbook, denn aktivierst du ein anderes, geht schief.

5. Pack deinen code zwischen die Zeilen:

Application.ScreenUpdating = False
'dein code hier
Application.ScreenUpdating = true

Dann sieht man nicht mehr, wie Excel zwischen den Dateien hin und herspringt und damit gehts auch schneller.
 
#7
Peter Schirmer

Peter Schirmer

Dienstleister / Moderator
Dabei seit
14.04.2006
Beiträge
7.060
Alter
38
Ort
7th Avenue, Ecke XP und Vista, 8ter Stock, Wohnung
Ein weitere hilfreicher Tipp ist der, dass man nicht auf eine Schleife zurückgreift, sondern auf die in Excel eingebaute Indizierung. :D Geht wesentlich schneller.

Hier ein Beispiel, wie man Wert findet und ausliest.

Sub Auslesen()

Dim SuchWert As String
Dim WertNebenan

'Suchbegriff definieren
SuchWert = "c"


'Suche durchführen. Indizierung ist herrlich
Cells.Find(What:=SuchWert, After:=ActiveCell, LookIn:=xlValues, LookAt:= _
xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False _
, SearchFormat:=False).Activate


'Einmal nach rechts bewegen
ActiveCell.Offset(0, 1).Activate

'Wertauslesen
WertNebenan = ActiveCell.Value
MsgBox ("Mit angesprungener Zelle: " & WertNebenan)

'Oder:
ActiveCell.Offset(0, -1).Activate
MsgBox ("Direkt ausgelesene Zelle: " & ActiveCell.Offset(0, 1).Value)


End Sub
 
#8
A

AlienJoker

Gast
Ich kann es nur nochmal sagen: Diese "activeworkbook"-mist ist dafür nur bedingt geeignet und verursacht eventuell sogar deinen Absturz
 
#10
A

AlienJoker

Gast
nein, nicht du sondern Micha, dem ich ja bereits vorher geraten hatte mit gebundenen Objekten zu schaffen, statt mit active.....
 
#14
M

[~Micha~]

Threadstarter
Dabei seit
19.10.2007
Beiträge
19
Ich schaue es mir morgen mal an. :D

In Access funktioniert das zwar so, aber der Accesszugriff ist beschränkt,
daher kommt leider nur Excel in Frage und da ist die Frage, ob sowas funktioniert, daher probiere ich es aus. :)

Bei Access müsste am Ende dann alles exportiert werden, angepasst auf A4 und ausgedruckt werden, um z.B. Differenzen direkt zu sehen. Das ganze Prozedere möchte ich mir sparen und daher auf Excel zurückgreifen, dass z.B. per Button gestartet wird und dann durchläuft und am Ende eine fertige angepasste gefüllte A4 Seite hat, daher der ganze Wirrwarr :wacko :D

Also das ausschalten ist eine gute Idee, ich hatte auch mal irgendwo gelesen bzw. gelernt ^^, dass man diese Markierung, die activecell macht deaktivieren kann und es dadurch auch schneller gehen soll, aber mir fällt der Befehl bzw. die Codekombination nicht ein. :unsure

1. Im Fall von "Wert gefunden" musst du ja nicht weiterlaufen, hier also ein "Exit do" einbauen um die innere do-loop-Schleife zu verlassen. Denn dann willst du ja nicht mehr weiterprüfen, oder?
Wenn ich das richtig verstehe, dann sag ich mal *doch*, weil ... es bis zu drei Werte geben kann, die doppelt bzw. dreifach vorhanden sind.

2. Die 2 Msgbox-Befehle: Wirst du nicht müde, die wegzuklickern?
War nur zum Testen. ^^ Ist ja auch mit ' funktionsunfähig gemacht.

Das riesen-Select ist auch net so der Bringer, was machst du damit?
Damit man direkt den Code erweitern kann, falls mehr Zeilen hinzukommen.
Aber ist das nicht eigentlich sowieso egal, weil der ja nur bis z.B. 700 zählt und dann abbricht?! Sollte doch keine Performancenachteile haben oder?

Während das ganze läuft, sollte man bei der leicht schwammigen Programmierung excel in ruhe lassen. Ansonsten geht das selten gut. Oder man muss, wie ich bereits vorgeschlagen hatte, die Excelfiles an Objekte binden und immmer damit arbeiten, dann läuft das ganze etwas besser. Also nie mit ActiveWorkbook, denn aktivierst du ein anderes, geht schief.
Ich hab das ein wenig verändert und zwar kopiere ich einmal zu Beginn per 2 Buttons jeweils den kompletten Datensatz aus den externen 2 .xls Files in eine .xls Files, wo der Code steht, sodass ich im Code nur noch auf die Tabellenblätter zugreifen muss. Ist beim Programmieren einfacher und übersichtlicher und eventuell auch stabiler ... hoffe ich zumindest. :up

@Peter Schirmer was meinst du mit Indizierung. So etwas wie eine Indexdatei?

So ich werde es dann mal morgen ausprobieren und vielleicht hat noch jemand ein paar Ratschläge zu meinen neuen Kommentaren, bis morgen. Danke.

[~Micha~]
 
#15
Peter Schirmer

Peter Schirmer

Dienstleister / Moderator
Dabei seit
14.04.2006
Beiträge
7.060
Alter
38
Ort
7th Avenue, Ecke XP und Vista, 8ter Stock, Wohnung
Also das ausschalten ist eine gute Idee, ich hatte auch mal irgendwo gelesen bzw. gelernt ^^, dass man diese Markierung, die activecell macht deaktivieren kann und es dadurch auch schneller gehen soll, aber mir fällt der Befehl bzw. die Codekombination nicht ein. :unsure
cells(1,1).select selektiert "nur" also z.B. für
selection.clearcontents 'Löschen des Inhalts
Dagegen findest du den Inhalt einer Zelle so:

dim Inhalt as string

Inhalt=worksheets("Tabelle1").cells(1,1)
Da sparst du dir das anspringen und selektieren


@Peter Schirmer was meinst du mit Indizierung. So etwas wie eine Indexdatei?
Jein. Wenn du etwas in Excel eingibst und sofort danach suchst, wird es auch gefunden. Die Werte werden aufgenommen. Aber nicht in einer separaten Datei, die man einsehen kann. Dieser Weg ist schneller, als wenn du selber eine Funktion schreibst.

Ich habe das gleiche auch schon mal mit ca. 1000 Zeilen probiert, das konnte man vergessen. Hätte mehr als eine Stunde gedauert. Mit dem Index geht das ganz schnell. Hatte bei mir ca. drei Minuten gedauert.

Du musst nur sicherstellen, dass du LookAt:= xlWhole verwendest und somit der gesamte Inhalt gesucht wird. Denn sonst werden bei einer Suche nach "Mensch" werden z.B. Menschenskinder und Mensch gefunden. Zur Not noch einen Plausibilitätscheck einfügen (select case oder ähnliches). Wenn du das nicht brauchst, kannst du es aber auch verändern.

Viel Spaß!

Gruß
Peter
 
#16
A

AlienJoker

Gast
Kleine Ergänzung: mit "schwammige Programmierung" war nicht dein Code gemeint, sondern vielmehr das allgemein grauenvolle Excel-VBA
 
#18
M

[~Micha~]

Threadstarter
Dabei seit
19.10.2007
Beiträge
19
'Suche durchführen. Indizierung ist herrlich
Cells.Find(What:=SuchWert, After:=ActiveCell, LookIn:=xlValues, LookAt:= _
xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False _
, SearchFormat:=False).Activate
Also ich habe die Indizierung jetzt mal angewendet, soweit ich das sehe funktioniert es sehr gut und sehr schnell im Gegensatz zu meiner Funktion.

Zwei Probleme stellen sich mir aber:

a) Was mache ich wenn ich nach einem Wert suche und es ihn mehrmals in der Liste (Bereich: I2 bis I700) gibt, sucht er dann weiter oder ist er dann nach Fund "fertig"? Wie sage ich der Indizierung, dass Sie alles durchsuchen soll und auch doppelte bzw. dreifache Werte mit einbeziehen soll?

b) Das Programm soll per Knopfdruck ausgelöst werden. Danach soll jede Zeile überprüft werden und falls Daten dazu vorhanden sind auch damit gefüllt werden, sprich erst Inhalt von A2 als Suchwert definieren, Daten suchen, Datenfelder füllen, danach geht es weiter mit A3, A4, A5 und so weiter bis er bei A3300 angelangt ist. Wie kann ich das realisieren? Wenn ich jetzt sage: do .. until activecell = "" dann kriege ich wahrscheinlich das gleiche Problem, dass ich jetzt habe und zwar, dass es fast eine Stunde dauert, bis er fertig ist.

Bitte um Rückmeldung.

//edit: Habe jetzt mal mein Programm unsichtbar gemacht und siehe da Zeit reduziert sich von 55 Minuten auf weniger als 10 Minuten. Ich werde jetzt mal die Auslesefunktionen ergänzen und schauen wie lange es dann dauert. Auf Antworten zu den oben genannten Fragen wäre ich trotzdem froh, man lernt ja nie aus. :)

[~Micha~]
 
Zuletzt bearbeitet:
#19
Peter Schirmer

Peter Schirmer

Dienstleister / Moderator
Dabei seit
14.04.2006
Beiträge
7.060
Alter
38
Ort
7th Avenue, Ecke XP und Vista, 8ter Stock, Wohnung
Also ich habe die Indizierung jetzt mal angewendet, soweit ich das sehe funktioniert es sehr gut und sehr schnell im Gegensatz zu meiner Funktion.
:D

Zwei Probleme stellen sich mir aber:

a) Was mache ich wenn ich nach einem Wert suche und es ihn mehrmals in der Liste (Bereich: I2 bis I700) gibt, sucht er dann weiter oder ist er dann nach Fund "fertig"? Wie sage ich der Indizierung, dass Sie alles durchsuchen soll und auch doppelte bzw. dreifache Werte mit einbeziehen soll?
Das ist der Preis dafür, dass man eine Schleife umgeht. Ich habe es so gelöst, dass ich erst den Suchbereich definiere und markiere. Hat den Vorteil, dass auch nur dort gesucht wird. Wenn du weißt, wie groß dieser Bereich ist, kannst du eine for...next-Schleife laufen lassen und selection.findnext verwenden. Im Beispiel ist der Bereich mit I=4 definiert.

Dabei wird allerdings immer wieder die Zelle angesprungen; was besseres ist mir auf die schnelle auch nicht eingefallen.

b) Das Programm soll per Knopfdruck ausgelöst werden. Danach soll jede Zeile überprüft werden und falls Daten dazu vorhanden sind auch damit gefüllt werden, sprich erst Inhalt von A2 als Suchwert definieren, Daten suchen, Datenfelder füllen, danach geht es weiter mit A3, A4, A5 und so weiter bis er bei A3300 angelangt ist. Wie kann ich das realisieren? Wenn ich jetzt sage: do .. until activecell = "" dann kriege ich wahrscheinlich das gleiche Problem, dass ich jetzt habe und zwar, dass es fast eine Stunde dauert, bis er fertig ist.
Jo, genau so. Nur anders. :D Du musst statt activecell einfach

do

...

loop until cells(i,1)=""

schreiben oder eine ähnliche Abbruchbedingung. Hauptsache, du springst die Zellen nicht an.

Hier der Quellcode meines Proof of concept
Sub Weitersuchen_mit_Indizierung()

Dim Suchwert As String
Dim I, K As Integer
Suchwert = "a"

'Länge des Suchbereiches => kann auch anders ermittelt werden, hier fest definiert
I = 4

'Bereich definieren zum Suchen
Range("A1:B4").Select

'Suchen
Selection.Find(What:=Suchwert, After:=ActiveCell, LookIn:=xlValues, LookAt:= _
xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False _
, SearchFormat:=False).Activate


For K = 1 To I

Selection.FindNext(After:=ActiveCell).Activate

If ActiveCell.Offset(0, 2) <> "x" Then

'Testweise setzen einer Markierung
ActiveCell.Offset(0, 2) = "x"

End If

Next K


End Sub
Rückmeldung. :D Den konnte ich mir nicht verkneifen.

Bei Fragen einfach melden!

Peter
 
Zuletzt bearbeitet:
#20
K

kayrodesign

Dabei seit
27.10.2010
Beiträge
2
Hallo zusammen,

ich grabe diesen uralten Thread mal wieder aus da mein Thema dem hier zeimlich nahe kommt.

Ich will mit VBA folgendes realisieren:

Gegeben:

- Excel-Datei Nr. 1 enthält verschiedene Hotelcodes, jedem Hotel ist ein exakter Preiszuschlag zugeordnet.
- Excel-Datei Nr. 2 enthält diverse Hotelcodes mit einem Basispreis.

Aufgabe:

Ich will den Zuschlag der Hotels aus Excel-Datei Nr.1 zu den Basispreisen der Hotels aus Excel-Datei Nr.2 addieren und das Ergebnis (+Hotelnamen) in einer neuen Excel-Datei ausgeben.

Es sollen nur die Hotels aus Excel-Datei Nr.2 herausgefiltert werden, die in Excel-Datei Nr.1 hinterlegt sind, sprich die die einen Zuschlag haben.

Es muss also mit einem Wert aus Excel-Datei Nr.1 in Excel-Datei Nr.2 gesucht werden.

Beispiel:

ACE04 hat einen Zuschlag von 9€ (Excel-Datei Nr.1)

Jetzt soll in der Basisdatei (Excel-Datei Nr.2) ACE04 gesucht werden und 9€ + 294€ gerechnet werden.

Hier soll das Ergebnis ausgegeben werden: Excel-Datei Nr.3

Hintergrund:

Es gibt zwei verschiedene Excel Dateien die unser System automatisch erstellt und auf unserem Server ablegt.

Für den Automatismus, der bewirkt dass die Tabellen erkannt werden und das Makro gestartet wird, ist schon gesorgt. Nur das Makro, welches den Endpreis aus diesen zwei Dateien berechnen soll, fehlt noch.

Es muss also schon auf VBA-Ebene stattfinden.


Habt ihr eine Idee / Ansätze?

Viele Grüße,
Jan
 

Anhänge

Thema:

Kann VBA Daten aus anderen .xls Dateien auslesen?

Sucheingaben

vba sverweis mit verweis auf anderes excel dokument

,

excel vba zellen aus anderer datei auslesen

,

daten aus anderer datei

,
excel vba daten aus anderer datei auslesen
, vba excel datei einlesen, excel zelle aus anderer datei auslesen, excel vba zellbezug andere datei, excel daten aus anderem workbook, vba sverweis externe datei, vba sverweis auf andere datei, excel per vba auf andere excel zugreifen, EXEl VBA auf andere Exceldatei zugreifen, excel daten aus anderer datei laden vba, Userform inhalt in externe datei schreiben

Kann VBA Daten aus anderen .xls Dateien auslesen? - Ähnliche Themen

  • VBA-Script shell .. .CopyHere wird von Defender blockiert

    VBA-Script shell .. .CopyHere wird von Defender blockiert: Hallo, Win10 Pro 64Bit, 1803, Office 2016 Seit einigen Wochen wird bei aktivem Defender (Viren- & Bedrohungsschutz - Echtzeitschutz EIN) das...
  • VBA-Script shell .. .CopyHere wird von Defender blockiert

    VBA-Script shell .. .CopyHere wird von Defender blockiert: Hallo, Win10 Pro 64Bit, 1803, Office 2016 Seit einigen Wochen wird bei aktivem Defender (Viren- & Bedrohungsschutz - Echtzeitschutz EIN) das...
  • PowerPoint Folien werden beim Öffnen der Präsentation mit VBA aus Excel heraus automatisch (ungewoll

    PowerPoint Folien werden beim Öffnen der Präsentation mit VBA aus Excel heraus automatisch (ungewoll: Hallo, auf einer virtuellen Maschine mit Windows 10 wird jede Nacht ein VBA-Skript in Excel ausgeführt, doch seit kurzem werden beim Öffnen der...
  • VBA UserForm in Outlook Task Formular

    VBA UserForm in Outlook Task Formular: Hallo, Wie oben beschrieben, versuche ich seit längerem nun einem ComandButton in Outlook Task einen AssignTo befehl zuzuordnen. Ich konnte...
  • GELÖST VBA Excel: Daten aus geschlossener Tabelle suchen und in andere Tabelle einfügen

    GELÖST VBA Excel: Daten aus geschlossener Tabelle suchen und in andere Tabelle einfügen: Hallo an alle, ich bin neu hier und hab gleich mal eine Frage (wie auch sonst...) Also es geht in meinem Problem in VBA Excel um folgendes: Ich...
  • Ähnliche Themen

    Oben