Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
788to792
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
788to792
788to792
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
"kleines" Problem beim Daten auslesen
14.08.2006 08:40:21
Matthias
Hallo ..
.. mein "alter" Beitrag wird leider nicht mehr angezeigt, auch nicht bei "offene Fragen" deswegen schreib ich hier nochmal einen Beitrag mit dem Verweis darauf.
Ich dachte ich könnte das Problem selbst lösen doch es kommt immer irgend ein Fehler.
Würde mich freuen, wenn mir jemand helfen könnte.
Beitrag und Problemstellung mit soweit funktionierendem Code findet Ihr unter:
https://www.herber.de/forum/messages/790127.html
(im letzten Beitrag ist die Problemstellung erklärt)
Wäre echt schön, wenn mir bei meinem Problem jemand helfen könnte.
Gruß
Matthias

17
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: "kleines" Problem beim Daten auslesen
14.08.2006 09:24:56
fcs
Hallo Mathias,
hier nochmal dein Codeschnippsel, der vermutlich das Problem macht, da im nachfolgenden Teil "StrNeu" als Workbook erwartet wird.

'öffnet die Datei
strFile = Application.GetOpenFilename("Excel Dateien (*.xls; *.xlt; *.xla)," & _
"*.xls; *.xlt; *.xla")
If strFile = "Falsch" Then Exit Sub
Set objFSO = CreateObject("Scripting.FileSystemObject")
strNeu = objFSO.GetBaseName(strFile)

1. Vermutung
Variable "strNeu" ist nicht als Workbook deklariert worden bzw. sollte besser als wbNeu deklariert sein und hier und in den nachfolgenden Zeilen umbenannt werden.
2. Vermutung
Zeile "strNeu = objFSO.GetBaseName(strFile)" muss als Objektzuweisung aufgebaut werden

Set strNeu = objFSO.GetBaseName(strFile)

3. Code der letzten beiden Zeilen des Schnippsels ändern zu

Set strNeu = Workbooks.Open Filename:=strFile

gruss Franz
Anzeige
DANKE
14.08.2006 10:19:28
Matthias
Hallo Franz,
vielen Dank für die schnelle Hilfe.
Hab kurz überlegen müssen und dann hat alles geklappt.
Beide Vermutungen haben zugetroffen. Hatte die falsche Variable als WB definiert gehabt.
DANKESCHÖN!
Eine andere Frage noch: Kennst du dich auch mit Formeln (Summen etc.) aus?
Bisher habe ich das Auslesen, Kopieren von Daten gemacht,a ber noch nichts mit Berechnungen. Da habe ich aber noch ein Problem, wo ich Hilfe benötige.
AW: DANKE
14.08.2006 15:00:29
fcs
Hallo Mathias,
mit Formeln kenn ich mich auch ganz gut aus.
Sowohl bei der Erstellung von Formeln direkt in der Tabelle als auch beim Erstellen von Formeln per VBA-Code bzw. der Anwendung von Tabellenfunktionen innerhalb von VBA-Code.
gruss
Franz
Anzeige
Berechnung Durchschnitt
14.08.2006 15:54:59
Matthias
Hallo Franz,
das hört sich doch vielversprechend an. Ich steh leider gerade noch am Anfang mit meinen Erfahrungen in VBA und Excel. Aber ich lerne immer wieder was dazu.
Vielleicht kannst du mir bei folgendem Problem helfen:
https://www.herber.de/bbs/user/35782.xls
In der Beispieldatei soll folgendes berechnet werden:
Die Werte für die Spalten H bis S sind monatlich aufgelistet. Immer 12 Monate. Beispiel (2005 08 bis 2006 07) Diese sind "flexibel", d.h. einmal von 2005 08 bis 2006 07, 2005 09 bis 2006 08 etc. Somit kann ich nicht sagen summiere mir bestimmte Spalten sondern muss wohl mit Bedingungen arbeiten
Nun soll für alle Werte im Jahr 2006 die Summe gebildet werden und dann durch die Anzahl der summierten Werte geteilt werden. Das Ergebnis soll in Spalte G geschrieben werden.
Ich hoffe ich habe mein Problem detailliert beschrieben. Bei Fragen stehe ich gern Rede und Antwort!
Würde mich freuen wenn Du mir helfen könntest. Das wäre echt super!
Anzeige
AW: Berechnung Durchschnitt
14.08.2006 20:17:51
fcs
Hallo Mathias,
mit sogenannten Matrixformeln kann man die entsprechenden Summen und Anzahlen für Berechnung des Durchsschnittwerts berechnen. In der Tabelle findest du noch ein paar weitere Erläuterungen.
https://www.herber.de/bbs/user/35795.xls
gruss
Franz
AW: Berechnung Durchschnitt
15.08.2006 08:11:34
Matthias
Guten Morgen Franz,
erstmal rechtherzlichen Dank für die Lösung und die sehr ausführliche Beschreibung der Formel. Sie funktioniert selbstverständlich auch einwandfrei.
Ich hätte es eigentlich nur gerne in VBA-Code gehabt. Deswegen hatte ich auch schon den Button angelegt gehabt um durch einen "klick" dies einfach ausrechnen zu lassen, da es vorkommen kann dass eine Zeile einge fügt werden werden könnte und man somit die Formel wieder kopieren und einfügen müsste. Da das komplette Makro, welches hinter der Datei liegt wesentlich größer ist, wäre es sinnvoller per Button-Klick dies berechnen zu lassen.
Wäre also super wenn du mir da nochmals helfen könntest.
Vielen Dank schonmal.
Gruß
Matthias
Anzeige
AW: Berechnung Durchschnitt
15.08.2006 20:06:49
fcs
Hallo Mathias,
hier jetzt die Makro-Lösung. Ich hab es mit Variablen so aufgebaut, dass automatisch die Anpassung an mehr Zeilen und Spalten mit Daten erfolgt. Falls sich die Position der Daten in der Tabelle ändert, dann muß du die Variablen "iSpalteJahr" und "iZeileMonate" anpassen.
gruss
Franz

Private Sub CommandButton2_Click()
'Berechnung der Durchschnittswerte für die Monate eines Jahres
Dim iJahr As Integer, rngMonate As Range, rngDaten As Range, wks As Worksheet, iLetzteSpalte As Integer
Dim iZeile As Long, iLetzteZeile, dblSumme As Double, iAnzahl As Integer
Dim iSpalteJahr As Integer, iZeileMonate As Long, I As Integer, iRund As Integer
Set wks = Me
iRund = 0 ' Anzahl Kommastellen, auf die das Ergebnis gerundet werden soll
With wks
'Spalte in der das Jahr steht und in der die Ergebnisse eingetragen werden sollen
iSpalteJahr = 7 'Spalte "G"
'Zeile in der die Monate stehen
iZeileMonate = 2
' Letzte Spalte für die ein Monat eingetragen ist
iLetzteSpalte = .Cells(iZeileMonate, .Columns.Count).End(xlToLeft).Column
'Bereich mit den Monaten, die 1. vier Zeichen von links müssen immer gleich der Jahreszahl sein
Set rngMonate = .Range(.Cells(iZeileMonate, iSpalteJahr + 1), .Cells(iZeileMonate, iLetzteSpalte))
'Jahreszahl (Text der Jahreszahl muss rechts in der Zelle stehen)
iJahr = Val(Right(.Cells(iZeileMonate, iSpalteJahr), 4))
'1. zeile mit Daten, deren Mittelwert berechnet werden soll
iZeile = iZeileMonate + 1
' Letzte Zeile mit Daten für einen Monat
' für alle Monate wird die unterste Zeile mit einem Eintrag geprüft und das Maximum genommen
For I = iSpalteJahr + 1 To iLetzteSpalte
iLetzteZeile = Application.WorksheetFunction.Max(iLetzteZeile, .Cells(Rows.Count, I).End(xlUp).Row)
Next
Do
dblSumme = 0
iAnzahl = 0
' Bereich mit den auszuwertenden Daten
Set rngDaten = .Range(.Cells(iZeile, iSpalteJahr + 1), .Cells(iZeile, iLetzteSpalte))
'Summe und Anzahl für Jahr berechnen
For I = 1 To rngMonate.Columns.Count
If iJahr = Val(Left(rngMonate(1, I), 4)) Then
If Not (IsEmpty(rngDaten(1, I)) Or rngDaten(1, I) = "-") Then
dblSumme = dblSumme + rngDaten(1, I)
iAnzahl = iAnzahl + 1
End If
End If
Next
'Durchschnittswert gerundet in Zelle eintragen
.Cells(iZeile, iSpalteJahr).Value = Application.WorksheetFunction.Round(dblSumme / iAnzahl, iRund)
iZeile = iZeile + 1
Loop Until iZeile > iLetzteZeile
End With
End Sub

Anzeige
AW: Berechnung Durchschnitt
16.08.2006 08:29:50
Matthias
Hallo Franz,
danke für die Arbeit. Dachte nicht, dass der Code so lang werden würde.
Er funktioniert auch soweit einwandfrei in der Beispieldatei.
Wenn ich den allerdings in das "große" Makro mit einbinde, dann bringt er mir in folgender Zeile immer einen
Laufzeitfehler 6 : Überlauf
'Durchschnittswert gerundet in Zelle eintragen
.Cells(iZeile, iSpalteJahr).Value = Application.WorksheetFunction.Round(dblSumme / iAnzahl, iRund)
Woran könnte dies liegen?
Die Makros werden über verschiedene Buttons gestartet. Im Prinzip hat jedes Makro seinen eigenen Button. Liegt das an den vielen verschiedenen Makros?
Ansonsten ist der Code einwandfrei. Funktioniert super. Vielen Dank für deine Mühe die Du dir gemacht hast!
Gruß
Matthias
Anzeige
AW: Berechnung Durchschnitt
16.08.2006 12:36:21
fcs
Hallo Mathias,
die Code-Länge ergibt sich hauptsächlich dadurch, dass ich das Makro variabel halten wollte und alle Eingabeparameter durch Variablen festgelegt habe und es sind halt auch relativ viele Kommentarzeilen. Die eigentliche Berechnung findet ja nur in der Do-Loop-Schleife statt.
Die Fehlermeldung ist wohl darauf zurückzuführen, das in einer Zeile keine Daten für das Jahr gefunden wurden. Dann führt die Division durch 0 zum Fehler.
Passe den Code an wie folgt:

'Durchschnittswert in Zelle eintragen
If iAnzahl = 0 Then
.Cells(iZeile, iSpalteJahr).Value = "keine Daten"
Else
.Cells(iZeile, iSpalteJahr).Value = Application.WorksheetFunction.Round(dblSumme / iAnzahl, iRund)
End If

gruss
Franz
Anzeige
vielen DANK !!!!
16.08.2006 14:31:29
Matthias
Hallo Franz,
vielen Dank für deine schnelle und sehr ausführliche Hilfe.
Vor allem die Kommentare haben mir sehr weitergeholfen und ich konnte einiges dazu lernen.
Die Codes funktionieren soweit ich das bisher getestet habe einwandfrei. Werde in den nächsten Tagen das File einmal komplett zusammenbauen und dann vllt noch das ein oder andere umstellen aber im Grunde müsste es so alles funktionieren.
Vielen Dank, du hast mir sehr viel weitergeholfen. Den Rest bekomme ich denke ich soweit hin.
Gruß
Matthias
Noch ein Problem
16.08.2006 14:51:00
Matthias
Hallo Franz,
sorry, aber hab da doch noch was ..
war gerade dabei ein paar Sachen mal durchzutesten ob die nun einwandfrei funktionieren. Dabei bin ich auf einen Fehler gestoßen.
Fehler: Anweisungsende erwartet (in mit Das ist der ganze Code, der durch ein Button-Klick angeschubst wird. Habe eigentlich alles so gemacht, wie du mir geschrieben hattest. Aber die Zeile mit Es geht darum, eine xls-Datei zu öffnen und deren Werte auszulesen. Leider ist der Ordner in dem die Datei liegt immer unterschiedlich sonst könnte man das mit einem kleinen Befehl machen der immer auf die gleiche Datei zugreif. Die Datei heißt aber auch unterschiedlich.
Hab schon verschiedene Sachen am Code versucht aber es klappt leider nicht.
Hast du mir da einen Tip oder Trick?

Private Sub CommandButton1_Click()
Dim wbQuelle As Workbook
Dim wbZiel, strNeu As Workbook
Dim objFSO As Object
Dim strFile As String, strSheet As String
Dim Zelle As Range
Dim Zeile, Spalte As Long
' Datei öffnen
strFile = Application.GetOpenFilename("Excel Dateien (*.xls; *.xlt; *.xla)," & _
"*.xls; *.xlt; *.xla")
' Wenn Datei nicht im Excel-Format wird Makro beendet
If strFile = "Falsch" Then Exit Sub
Set strNeu = objFSO.GetBaseName(strFile)
Set strNeu = Workbooks.Open Filename:=strFile <--------
' Die erste Zeile der Spalten I bis S kopieren (Monate)
Columns("I:S").Copy Destination:=Columns("H")
' Löscht Inhalt der Spalten I bis S
Sheets("Verlauf").Range("I3:S100").ClearContents
Set strNeu = ThisWorkbook
With ThisWorkbook.Sheets("Verlauf")
For Each Zelle In strFile.Sheets("Tabelle1").Range(strFile.Sheets("Tabelle1").Cells(2, 1), strFile.Sheets("Tabelle1").Cells(65000, 1).End(xlUp))
If WorksheetFunction.CountIf(.Columns(1), Zelle.Value) = 0 Then
.Cells(65000, 1).End(xlUp).Offset(1, 0).Value = Zelle.Value
.Cells(65000, 1).End(xlUp).Offset(0, 1).Value = Zelle.Offset(0, 1).Value
End If
Zeile = Columns(1).Find(what:=Zelle.Value, lookat:=xlWhole).Row
If Not Zelle.Offset(0, 2).Value Like "Summe*" Then
Spalte = .Rows(2).Find(what:=Zelle.Offset(0, 2), lookat:=xlWhole).Column
.Cells(Zeile, Spalte).Value = Zelle.Offset(0, 3).Value
End If
Next
End With
' Zellen I3 bis S100 mit - auffüllen
'Sub leereZellenauffüllen()
' alle Zellen mit "-" füllen, damit da wo keine Werte in externen Datei sind - eingesetzt ist
Dim rng1 As Range, rngEmptys As Range
Dim vRng As Variant, vDummy As Variant
Set vRng = Range("H3:S100")     ' Spalten H3 bis S100 werden mt - aufgefüllt
If vRng Is Nothing Then Exit Sub
vDummy = "-"
Set rngEmptys = vRng.SpecialCells(xlCellTypeBlanks)
rngEmptys.Value = vDummy
dDate = Replace(strDate, "_", " ")
Sheets("Verlauf").Range("S2").Value = dDate
strSheet = "Tabelle1"
' Externe Datei in varValues speichern
'With ExcelTable(strFile, strSheet, "A1:D65536")
'  varValues = .GetRows
'  .Close
'End With
End Sub

Anzeige
AW: Noch ein Problem
17.08.2006 22:08:06
Jens
Hi,
GetFileName statt GetBaseName
mfg Jens
AW: Noch ein Problem
18.08.2006 08:27:37
Matthias
Hallo Jens,
sorry, aber wenn ich
Set strNeu = objFSO.GetBaseName(strFile)
in
Set strNeu = objFSO.GetFileName(strFile)
umschreibe bleibt der Fehler immernoch erhalten. Bringt hier irgendwie nichts.
Außer ich habs falsche umgeschrieben, aber du meintest ja GetBaseName in GetFileName
Gruß
Matthias
AW: Noch ein Problem
18.08.2006 14:21:28
fcs
Hallo Mathias,
irgendwie ist da in deinem Code noch etwas Unordnung. Ich hab mal versucht ihn etwas was auf die Reihe zu bekommen. Hoffe das läuft jetzt.
Kommentare und unnötige Zeilen kannst du ja dann löschen.
Gruß
Franz

Private Sub CommandButton1_Click()
Dim wbQuelle As Workbook
Dim wbZiel, strNeu As Workbook
' Dim objFSO As Object '###### überflüssig
Dim strFile As String, strSheet As String
Dim Zelle As Range
Dim Zeile, Spalte As Long
' Datei öffnen
strFile = Application.GetOpenFilename("Excel Dateien (*.xls; *.xlt; *.xla)," & _
"*.xls; *.xlt; *.xla")
' Wenn Datei nicht im Excel-Format wird Makro beendet
If strFile = "Falsch" Then Exit Sub
' Set strNeu = objFSO.GetBaseName(strFile) '####löschen fcs
Set strNeu = Workbooks.Open(Filename:=strFile)  '<--------'### angepasst fcs
' Die erste Zeile der Spalten I bis S kopieren (Monate)
Columns("I:S").Copy Destination:=Columns("H")
' Löscht Inhalt der Spalten I bis S
Sheets("Verlauf").Range("I3:S100").ClearContents
' Set strNeu = ThisWorkbook '### fcs gibt Probleme, da du ja das gerade geöffnete Workbook einem Objekt zuweisen willst
With ThisWorkbook.Sheets("Verlauf")
' ### Koorektur in nächster Zeile    For Each Zelle In strFile.Sheets("Tabelle1").Range(strFile.Sheets("Tabelle1").Cells(2, 1), strFile.Sheets("Tabelle1").Cells(65000, 1).End(xlUp))
' strFile muss durch strNeu ersetzt werden, da Syntax hier ein Workbook-Objekt erwartet
For Each Zelle In strNeu.Sheets("Tabelle1").Range(strNeu.Sheets("Tabelle1").Cells(2, 1), strNeu.Sheets("Tabelle1").Cells(65000, 1).End(xlUp))
If WorksheetFunction.CountIf(.Columns(1), Zelle.Value) = 0 Then
.Cells(65000, 1).End(xlUp).Offset(1, 0).Value = Zelle.Value
.Cells(65000, 1).End(xlUp).Offset(0, 1).Value = Zelle.Offset(0, 1).Value
End If
Zeile = Columns(1).Find(what:=Zelle.Value, lookat:=xlWhole).Row
If Not Zelle.Offset(0, 2).Value Like "Summe*" Then
Spalte = .Rows(2).Find(what:=Zelle.Offset(0, 2), lookat:=xlWhole).Column
.Cells(Zeile, Spalte).Value = Zelle.Offset(0, 3).Value
End If
Next
End With
' Zellen I3 bis S100 mit - auffüllen
'Sub leereZellenauffüllen()
' alle Zellen mit "-" füllen, damit da wo keine Werte in externen Datei sind - eingesetzt ist
Dim rng1 As Range, rngEmptys As Range
Dim vRng As Variant, vDummy As Variant
Set vRng = Range("H3:S100")     ' Spalten H3 bis S100 werden mt - aufgefüllt
If vRng Is Nothing Then Exit Sub
vDummy = "-"
Set rngEmptys = vRng.SpecialCells(xlCellTypeBlanks)
rngEmptys.Value = vDummy
dDate = Replace(strDate, "_", " ")
Sheets("Verlauf").Range("S2").Value = dDate
strSheet = "Tabelle1"
' Externe Datei in varValues speichern
'With ExcelTable(strFile, strSheet, "A1:D65536")
'  varValues = .GetRows
'  .Close
'End With
End Sub

Anzeige
Fehler immernoch da
18.08.2006 14:51:54
Matthias
Hallo Franz,
vielen vielen Dank für deine Bemühungen.
Doch leider ist der Fehler bei mir immernoch da.
Läuft es bei Dir in der von mit geschickten Datei?
Wenn ja könntest mir diese ja zukommen lassen. Vielleicht klappts dann ja.
Wenn da noch Unordnung drin ist, darf ich fragen, was nicht ganz klar ist?
Ich denke dann kann ich Dir sagen, was ich wo machen möchte.
Denke mir dass da noch nicht alles einwandfrei ist. Hab zwar shcon paar sachen mit VBA gemacht aber bin da immernoch am Anfang und noch kein wirklicher Profi.
Würde mich aber sehr freuen, wenn das irgendwie klappen würde.
Gruß
Matthias
Fehler immernoch da
18.08.2006 14:54:03
Matthias
Hallo Franz,
vielen vielen Dank für deine Bemühungen.
Doch leider ist der Fehler bei mir immernoch da.
Läuft es bei Dir in der von mit geschickten Datei?
Wenn ja könntest mir diese ja zukommen lassen. Vielleicht klappts dann ja.
Wenn da noch Unordnung drin ist, darf ich fragen, was nicht ganz klar ist?
Ich denke dann kann ich Dir sagen, was ich wo machen möchte.
Denke mir dass da noch nicht alles einwandfrei ist. Hab zwar shcon paar sachen mit VBA gemacht aber bin da immernoch am Anfang und noch kein wirklicher Profi.
Würde mich aber sehr freuen, wenn das irgendwie klappen würde.
Gruß
Matthias
DANKE klappt alles einwandfrei
21.08.2006 12:45:12
Matthias
Hallo Franz,
ich wollte mich nocheinmal recht herzlich bei Dir für deine super tolle Hilfe bedanken. Das hat mich sehr viel weitergebraucht. Es klappt nun soweit alles wie ich mir das vorstelle. Durch deine ausführlichen Kommentare habe ich auch wieder einiges im VBA-Programmieren gelernt.
Großen DANK an DICH!!
Gruß
Matthias

300 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige