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.
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 ?
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
Sub zaehlen()
Worksheets(„Tabelle2“).Range(„A6“) = WorksheetFunction.CountIf(Worksheets(„Tabelle1“).Range(„F:F“), „=OK“) * 100 / Worksheets(„Tabelle1“).UsedRange.Rows.Count
End Sub
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.
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
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
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.
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
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.
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 …