Vba-excel,datei auslesen

Hallo Leute,

Möchte gerne mit vba-excel ein kleines Programm schreiben. Bin aber noch blutiger anfänger.
Ich mache ein paar Datein auf und will nachschauen wiviel von diesen Zellen in Spalte „F“ auf den wert „OK“ sind. danach mache ich nämlich eine Balken diagramm wo man dann die prozente sieht was wie weit fertig ist.
Ich hab da ne idee die ungefähr so ausschaut:

'Datei öffnen
Workbooks.Open Filename:=„T:…“
'reihen zählen
ZeileL = .Cells(.Rows.Count, 11).End(xlUp).Row
z=0
For Zeile=2 to ZeileL
If IsEmpty(wksZiel.Cells(Zeile, 11)) Then
z=z+1
endif
next
Erledigt=100 - (z*100/ZeileL)

Ich schließe dann die Datei und würde disen wert ( Erledigt ) gerne in eine bestimmte Zelle ( bsp:A6) rein
schreiben lassen.

Geht das mit

activeworkbook.Cells(A6).value=Erledigt

kann mir da mal jemand weiter helfen???

Danke im voraus

MFG

Hallo enesc1,

ohne jetzt den Anfang genauer unter die Lupe genommen zu haben, kann ich dir die letzte Frage direkt beantworten: Nein!

Die korrekte Syntax wäre:

ActiveWorkbook.Sheets(„Tabelle1“).Range(„A6“).Value = erledigt

Dabei muss „Tabelle1“ natürlich entsprechend angepasst werden.
Gruß
Natator

Grüezi enesc1

Ich schließe dann die Datei und würde disen wert ( Erledigt )
gerne in eine bestimmte Zelle ( bsp:A6) rein
schreiben lassen.

Geht das mit

activeworkbook.Cells(A6).value=Erledigt

kann mir da mal jemand weiter helfen???

Fast - so müsste es klappen:

ActiveSheet.Range("A6").Value="Erledigt"

Mit freundlichen Grüssen

Thomas Ramel

  • MVP für MS-Excel -

servas,

danke für die info - solche sachen bringen mich echt weiter.
ich hätte da noch ein kleines Problem. ich mächte die Datein schreibgeschützt öffnen

Workbooks.Open Filename:=„T:\MigrationsdatenRO729\10 overview.xls“ ReadOnly:=True

das funkt aber nicht ganz…

er nimmt das nicht an, kannst ma sagen wo da der fehler liegt?

MFG

danke für die info

MFG

Grüezi enesc1

Workbooks.Open Filename:=„T:\MigrationsdatenRO729\10
overview.xls“ ReadOnly:=True

das funkt aber nicht ganz…

er nimmt das nicht an, kannst ma sagen wo da der fehler liegt?

Da fehlt eigentlich nur das Komma vor ‚ReadOnly‘… :wink:

Mit freundlichen Grüssen

Thomas Ramel

  • MVP für MS-Excel -

Hallo Natator,

das wäre jetzt mein fertiger code :
Sub auslesen()

Dim Zeile As Long, ZeileL As Long
Dim z As Long
Dim erledigt As Long

Workbooks.Open Filename:=„C:…“, ReadOnly:=True
ZeileL = .Cells(.Rows.Count, 1).End(xlUp).Row
z = 0
For Zeile = 2 To ZeileL
If IsEmpty(ActiveWorkbook.Cells(Zeile, 6)) Then
z = z + 1
End If
Next
erledigt = 100 - (z * 100 / ZeileL)
Workbooks.Close savechanges:=False
ActiveWorkbook.Sheets(„Sheet1“).Range(„B5“).Value = erledigt

End Sub

leider hab ich es noch nicht zum laufen gebracht. und zwar schreit er mir bei der zeile :

ZeileL = .Cells(.Rows.Count, 1).End(xlUp).Row

compile error: invalid or unqualified reference???

ich hab die selbe zeile in einem anderen programm verwendet und da funkttioniert es.
was heißt das ?

Kannst da mir noch mal nen tip geben?
MFG

OK, hier ist der korrigierte Code, damit er auch läuft:

Sub auslesen()

Dim Zeile As Long, ZeileL As Long
Dim z As Long
Dim erledigt As Long

Workbooks.Open Filename:=„C:…“, ReadOnly:=True
ZeileL = Cells(Rows.Count, 1).End(xlUp).Row
z = 0
For Zeile = 2 To ZeileL
If IsEmpty(ActiveWorkbook.Sheets(„Sheet1“).Cells(Zeile, 6)) Then
z = z + 1
End If
Next
erledigt = 100 - (z * 100 / ZeileL)
ActiveWorkbook.Close savechanges:=False
ActiveWorkbook.Sheets(„Sheet1“).Range(„B5“).Value = erledigt

End Sub

Viel Erfolg damit! :wink:

Viele Grüße
Natator

Sub zaehlen()
Worksheets(„Tabelle2“).Range(„A6“) = WorksheetFunction.CountIf(Worksheets(„Tabelle1“).Range(„F:F“), „=OK“) * 100 / Worksheets(„Tabelle1“).UsedRange.Rows.Count
End Sub

viel erfolg und herzliche grüße

Hallo enesc1,

erstmal „nichts ist so einfach wie die Arbeit, welche man damit hat“.

Von Jörg Lorenz gibt es eine recht gute Lösung.
Benötige eine eMail-Adresse und sende dir die Datei zu.
Aber nicht zu lange warten, habe nicht immer Zeit.

mfg Softoldi

ZeileL = activeworkbook.Cells(.Rows.Count, 11).End(xlUp).Row
z=0
For Zeile=2 to ZeileL
If IsEmpty(wksZiel.Cells(Zeile, 6)) Then
z=z+1
endif
next

so müste es funktioniert.

Hall enesc

hier mal das Grundgerüst für die Auswertung von Dateien, die in einem Datei-Dialog ausgewählt werden.

Mit „Abbrechen“ im Datei-Dialog wird die Ausführung des Makros beendet.

Gruß
Franz

Sub AuswertenDateien()
 Dim wksZiel As Worksheet, ZeileZ As Long
 Dim wbQuelle As Workbook, ZeileQ As Long, ZeileL As Long
 Dim AnzOK As Long
 Dim vAuswahl As Variant, StatusCalc As Long

 Set wksZiel = ActiveSheet 'oder ActiveWorkbook.Workshets("TabelleABC")
 ZeileZ = 3 'Zeile unterhalb der die Auswertung eingetragen werden soll
 With Application.FileDialog(msoFileDialogOpen)
 .Title = "Bitte auszuwertende Datei(en) auswählen"
 .FilterIndex = 2 'normaler Weise alle Exceldateien
 Do Until .Show = 0
 With Application
 .EnableEvents = False
 .ScreenUpdating = False
 StatusCalc = .Calculation
 .Calculation = False
 End With
 For Each vAuswahl In .SelectedItems
 Set wbQuelle = Workbooks.Open(Filename:=vAuswahl, ReadOnly:=True, \_
 UpdateLinks:=False)
 With wbQuelle.Worksheets(1) 'oder wbQuelle.Worksheets("TabelleXYZ")
 'Letzte Zeile mit Daten in Spalte 11 (K) der Quelle
 ZeileL = .Cells(.Rows.Count, 11).End(xlUp).Row
 AnzOK = 0
 '""OK" in Spalte 6 (F) zählen
 For ZeileQ = 2 To ZeileL
 If UCase(.Cells(ZeileQ, 6)) = "OK" Then AnzOK = AnzOK + 1
 Next ZeileQ
 'Ergebnis in Zielblatt eintragen
 ZeileZ = ZeileZ + 1
 wksZiel.Cells(ZeileZ, 1) = wbQuelle.Name
 If ZeileL \>= 2 Then
 wksZiel.Cells(ZeileZ, 2) = AnzOK / (ZeileL - 2 + 1) \* 100 'Anzahl "OK" in Prozent
 Else
 'keine Daten in Quelle vorhanden
 wksZiel.Cells(ZeileZ, 2) = 0
 End If
 End With
 wbQuelle.Close savechanges:=False
 Next vAuswahl
 With Application
 .EnableEvents = True
 .ScreenUpdating = True
 .Calculation = StatusCalc
 End With
 Loop
 End With

End Sub

Servus softolfi ( echt cooler name )

Danke aber mein code hab ich schon fertig .
villeicht nächstes mal.
bin ja schon sehr heiß aufs programmieren. hatte gestern echt ein erfolgserlebnis. was man da alles machen kann mit excel ist der wahnsinn :wink:

MFG

hallo franz,

wieder mal der wahnsinn was ich von deinen programmierkenntnissen lernen kann. ich habe den code auch schon fertig, der ist halt ein wenig einfacher geworden. auch weil es eigentlich ganz bestimmte(immer dieselben ) datein jetzt sind die ich öffne und auslese um einen gewissen fortschritt darin zu erkennen und dann in die ursprüngliche datei das ergebnis rein schreibe. das ist mein fertiger code:

Sub auslesen()

Dim Zeile As Long, ZeileL As Long
Dim z As Long
Dim erledigt As Long

Workbooks.Open Filename:=„C:…“, ReadOnly:=True
Worksheets(„Tabelle1“).Select
ZeileL = Cells(Rows.Count, 2).End(xlUp).Row
z = 0
For Zeile = 2 To ZeileL
If IsEmpty(ActiveWorkbook.Sheets(„Tabelle1“).Cells(Zeile, 6)) Then
z = z + 1
End If
Next
erledigt = 100 - (z * 100 / (ZeileL - 1))
ActiveWorkbook.Close savechanges:=False
ActiveWorkbook.Sheets(„Sheet1“).Range(„B5“).Value = erledigt
erledigt = 0
.
.
.

End sub

Weil es jetzt mehrere Datein sind habe ich das einfach mehrmals dann kopiert und eins nach dem anderem die Quelldatei und die Zelle in der dann das ergebnis reingeschrieben wird geändert. daraus hab ich dann eine übersichtstabelle erstellt. das ganze programm dann in ein CommandButton_Click eingefügt so dass man per Button dann das ganze aktualisieren kann. Hätte man villeicht einfacher noch mit einer schleife dazu löen können, aber es funktioniert .
würde mich über ein weiteres feedback von dir freuen.

Mit freundlichen Grüßen

hallo enesc,

die For-Next-Schleife mit den Dateinamen hätest du dann ja doch noch einbauen können. Datei-Namen kann man dann im Code vorgeben oder aus einem Tabellenblatt einlesen.

Ich hab mir aber inzwischen angewöhnt grundsätzlich mit Objektvariablen zu arbeiten, wenn mehr als eine Arbeitsmappe in eine Prozedur involviert sind.

Der Code liest sich dann einfacher, als wenn immer wieder irgendwo ActiveSheet oder ActiveWorkbook steht.

Ansonsten gilt beim Programmieren natürlich erst einmal: Hauptsache das Ergebnis stimmt.

Gruß
Franz

Sub auslesen()

Dim Zeile As Long, ZeileL As Long
Dim z As Long
Dim erledigt As Long
Dim strDateien(1 To 5) As String, intDatei As Integer

strDateien(1) = "C:\Datei01.xls"
strDateien(2) = "C:\Datei02.xls"
strDateien(3) = "C:\Datei03.xls"
strDateien(4) = "C:\Datei04.xls"
strDateien(5) = "C:\Datei05.xls"

For intDatei = 1 To UBound(strDateien)
 Workbooks.Open Filename:=strDateien(intDatei), ReadOnly:=True
 Worksheets("Tabelle1").Select
 ZeileL = Cells(Rows.Count, 2).End(xlUp).Row
 z = 0
 For Zeile = 2 To ZeileL
 If IsEmpty(ActiveWorkbook.Sheets("Tabelle1").Cells(Zeile, 6)) Then
 z = z + 1
 End If
 Next
 erledigt = 100 - (z \* 100 / (ZeileL - 1))
 ActiveWorkbook.Close savechanges:=False
 ActiveWorkbook.Sheets("Sheet1").Range("B" & 5 + intDatei - 1).Value = erledigt
 erledigt = 0
 '.
 '.
 '.
Next intDatei
End Sub

ich kann dzt. leider nicht helfen

Hallo enesc1,

mit dem Bearbeiten und öffnen von Dateien kenne ich mich in VBA nicht so aus. Da kann ich leider nicht weiter helfen.

Gruß Hugo

Hallo Franz,

Danke für dein feedback. Ich habe wieder durch dich was gelernt.
Was ich so faszinierend finde ist dass man sehr viel von einem Programm als Baustein nehmen kann und dann wieder woanders einsetzten kann.
Vielen Dank für deine Hilfe.

MFG enes

Hallo,
das würde gehen, wenn Du die Zeile
activeworkbook.Cells(A6).value=Erledigt

durch

activeworkbook.Range(„A6“).value=Erledigt oder
activeworkbook.Cells(6,1).value=Erledigt

ersetzt.

Die Eigenschaft „cells“ erwartet immer eine exakte Zeilen- und Spaltenangabe in numerischer Form - also cells(Zeile, Spalte).
Die Zielzelle A6 müsste man dann so angeben: cells(6,1)

Ansonsten müsste Dein Makro funktionieren.
Bei weiteren Fragen - nur zu …

Gruß,
Ptonka