Anzeige
Archiv - Navigation
1020to1024
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

Makro funktioniert nicht richtig, Werte auslesen

Makro funktioniert nicht richtig, Werte auslesen
07.11.2008 08:22:00
Uwe
Hallo zusammen, habe folgendes Problem in dem beigefügtem Makro funktioniert es nicht das er die Werte 2 und 3 aus der Tabelle ausliest. Wert 1 geht wunderbar. Hat jemand eine Lösung?
Hallo Uwe,
unregelmäßig aufgebaute Tabellen per Makro abzuarbeiten ist immer ziemlich aufwendig zu programmieren.
Die manuelle Lösung heißt dann die Zeilennummern fest in den Code eintragen, was dann bei ändeungen oder Ergänzungen an den Tabellen immer auch Code-Änderungen erfordert.
Alternativ könnte man die Informationen zu den Zeilen/Zellen im Blatt "Dienstplan" im Blatt "Kopf" für jeden Mitarbeiter hinterlegen und vom Makro auslesen lassen.
Nachfolgend ein angepasster Code, bei dem die Zeileninformation je Mitarbeiter im Code hinterlegt ist (die schlechteste Lösung von allen).
gruß
Franz

Sub DatenVormonatHolen()
Dim wksDienst As Worksheet, wksKopf As Worksheet, wbMonat
Dim wbVormonat As Workbook, wksDienstVor As Worksheet, wksKopfVor As Worksheet
Dim varAuswahl, bolPruefung As Boolean, strMsg As String
Dim intMit As Integer
'Zeilenwerte für Mitarbeiter im Dienstplan, Werte ggf. anpassen
Const intMitarbeiter As Integer = 24 'Anzahl Mitarbeiter
On Error GoTo Fehler
Set wksDienst = ActiveWorkbook.Worksheets("Dienstplan")
Set wksKopf = ActiveWorkbook.Worksheets("Kopf")
varAuswahl = Application.GetOpenFilename(Filefilter:="Excel(*.xls), *.xls", _
Title:="Bitte Dienstplan des Vormonats öffnen")
If varAuswahl = False Then GoTo Beenden
'Vormonatsdatei schreibgeschützt öffnen
Set wbVormonat = Application.Workbooks.Open(Filename:=varAuswahl, ReadOnly:=True)
Set wksDienstVor = wbVormonat.Worksheets("Dienstplan")
Set wksKopfVor = wbVormonat.Worksheets("Kopf")
'Vergleich Monat und Jahr im Blatt Kopf der beiden Dateien
Select Case wksKopf.Range("c1")
Case 1 'Januar
If wksKopfVor.Range("c1") = 12 _
And Year(wksKopf.Range("c2")) - Year(wksKopfVor.Range("c2")) = 1 Then
bolPruefung = True
End If
Case 2 To 12 'Februar - Dezember
If wksKopf.Range("c1") - wksKopfVor.Range("c1") = 1 _
And Year(wksKopf.Range("c2")) = Year(wksKopfVor.Range("c2")) Then
bolPruefung = True
End If
Case Else
MsgBox "Unzulässige Eingabe für Monat oder Datum im Blatt Kopf"
GoTo Beenden
End Select
If bolPruefung = True Then
'Daten aus Vormonatsblatt einlesen _
Spaltennummern sowie Werte für Offset anpassen!!!!
With wksDienst 'Blatt in das eingetragen werden soll
.Unprotect
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
lngSpalte = 34 'Spalte AH = Zielspalte für Saldodaten aus Vormonat im Dienstplan
lngSpalteVor = 35 'Spalte AI = Quellspalte mit Saldodaten aus Vormonat
For lngMit = 1 To intMitarbeiter
'in den nachfolgenden Zeilen die Bezugszeilen für die Werte eingeben _
falls auch die Spalten und Offsetwerte variieren, dann müssen diese ebenfalls _
in den Case-Zeilen als Variablen festgelegt werden und unten in den Anweisungen _
für das Eintragen der Werte die Zahlen durch die entsprechenden Variablen ersetzt _
werden.
Select Case lngMit
Case 1: lngZeile = 7
Case 2: lngZeile = 37
Case 3: lngZeile = 67
Case 4: lngZeile = 97
Case 5: lngZeile = 127
Case 6: lngZeile = 157
Case 7: lngZeile = 187
Case 8: lngZeile = 217
Case 9: lngZeile = 247
Case 10: lngZeile = 277
Case 11: lngZeile = 307
Case 12: lngZeile = 337
Case 13: lngZeile = 367
Case 14: lngZeile = 397
Case 15: lngZeile = 327
Case 16: lngZeile = 357
Case 17: lngZeile = 387
Case 18: lngZeile = 417
Case 19: lngZeile = 447
Case 20: lngZeile = 477
Case 21: lngZeile = 507
Case 22: lngZeile = 537
Case 23: lngZeile = 567
Case 24: lngZeile = 597
Case Else
MsgBox "Für Mitarbeiter nr. " & intMit _
& " wurde noch keine Case-Zeile im Code angelegt"
End Select
'Wert 1 übernehmen
.Cells(lngZeile, lngSpalte).Offset(0, 0).Value = _
wksDienstVor.Cells(lngZeile, lngSpalteVor).Offset(0, 0).Value
'Wert 2 übernehmen
.Cells(lngZeile, lngSpalte).Offset(1, 0).Value = _
wksDienstVor.Cells(lngZeile, lngSpalteVor).Offset(1, 0).Value
'Wert 3 übernehmen
.Cells(lngZeile, lngSpalte).Offset(2, 0).Value = _
wksDienstVor.Cells(lngZeile, lngSpalteVor).Offset(2, 0).Value
Next
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
.Protect
End With
Else
MsgBox "Die geöffnete Datei enthält nicht Daten des Vormonats"
End If
Fehler:
If Err.Number  0 Then
strMsg = "Fehler-Nr. " & Err.Number & vbLf & Err.Description
If Not wbVormonat Is Nothing And wksDienstVor Is Nothing Then
strMsg = strMsg & vbLf & "Blatt ""Dienstplan"" in geöffneter Datei nicht vorhanden"
ElseIf Not wbVormonat Is Nothing And wksKopfVor Is Nothing Then
strMsg = strMsg & vbLf & "Blatt ""Kopf"" in geöffneter Datei nicht vorhanden"
End If
MsgBox strMsg
End If
Beenden:
If Not wbVormonat Is Nothing Then
If MsgBox("Soll geöffnete Datei mit Daten des Vormonats wieder geschlossen werden?", _
vbYesNo) = vbYes Then wbVormonat.Close savechanges:=False
End If
End Sub


Also genau so sollte das sein, Vielen Dank. Kompliment das du dich in eine wie ich finde komplexe Excel Mappe so gut reindenken konntest.
Einen kleinen schönheitsfehler gibt es noch, er liest nur den ersten Wert aus, die anderen beiden offset anweisungen bearbeitet er zwar hat aber hat kein Ergebnis was er in die Zellen einträgt. Zur Zeit habe ich das makro 3 mal kopiert und die Zellinformation an der Stelle für den ersten Wert in der 2 u 3 kopie abgeändert und starte das ganze mit einem call makro. Da nervt dann beim 2 und 3 mal diese (ehrlich super gelöste) Dateiimport öffnen Lösung.

1
Beitrag zum Forumthread
Beitrag zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Makro funktioniert nicht richtig, Werte auslesen
07.11.2008 14:43:00
fcs
Hallo Uwe,
mein Makro ist so strukturiert, dass die Werte 2 und 3 durch Angabe des Zell-Offsets relativ zur Zelle mit dem Wert 1 definiert werden. Dies gilt sowohl für die Zellen mit den Werten des Vormonats als auch für die Zielzellen mit den Werten des aktuellen Monats.
Wenn die Anzahl Zeilen und Spalten zwischen der Zelle mit dem Wert 1 und der Zelle mit dem Wert 2 bzw. 3 bei allen Mitarbeitern gleich ist, dann muss du die Werte für Offset entsprechend festlegen.
Falls die Zeilenabstände variieren, dann muss du für jeden der drei Werte die Zeilen individuell je Mitarbeiter einer festlegen.
Dann schauen die Prozeduren etwa wie folgt aus, um alle drei Werte in einem Durchlauf zu übertragen.
Die Spalten und Zeilenwerte für Wert 2 und Wert 3 muss du in den entsprechenden Sub-Prozeduren noch anpassen
Ich konnte das jetzt nicht testen, hoffe es funktioniert.
Gruß
Franz

Option Explicit
'Zeilenwerte für Mitarbeiter im Dienstplan, Werte ggf. anpassen
Private Const intMitarbeiter As Integer = 24  'Anzahl Mitarbeiter
Private wksDienst As Worksheet
Private wksDienstVor As Worksheet
Sub DatenVormonatHolen()
Dim wksKopf As Worksheet, wbMonat
Dim wbVormonat As Workbook, wksKopfVor As Worksheet
Dim varAuswahl, bolPruefung As Boolean, strMsg As String
On Error GoTo Fehler
Set wksDienst = Nothing
Set wksDienstVor = Nothing
Set wksDienst = ActiveWorkbook.Worksheets("Dienstplan")
Set wksKopf = ActiveWorkbook.Worksheets("Kopf")
varAuswahl = Application.GetOpenFilename(Filefilter:="Excel(*.xls), *.xls", _
Title:="Bitte Dienstplan des Vormonats öffnen")
If varAuswahl = False Then GoTo Beenden
'Vormonatsdatei schreibgeschützt öffnen
Set wbVormonat = Application.Workbooks.Open(Filename:=varAuswahl, ReadOnly:=True)
Set wksDienstVor = wbVormonat.Worksheets("Dienstplan")
Set wksKopfVor = wbVormonat.Worksheets("Kopf")
'Vergleich Monat und Jahr im Blatt Kopf der beiden Dateien
Select Case wksKopf.Range("c1")
Case 1 'Januar
If wksKopfVor.Range("c1") = 12 _
And Year(wksKopf.Range("c2")) - Year(wksKopfVor.Range("c2")) = 1 Then
bolPruefung = True
End If
Case 2 To 12 'Februar - Dezember
If wksKopf.Range("c1") - wksKopfVor.Range("c1") = 1 _
And Year(wksKopf.Range("c2")) = Year(wksKopfVor.Range("c2")) Then
bolPruefung = True
End If
Case Else
MsgBox "Unzulässige Eingabe für Monat oder Datum im Blatt Kopf"
GoTo Beenden
End Select
If bolPruefung = True Then
'Daten aus Vormonatsblatt einlesen
With wksDienst 'Blatt in das eingetragen werden soll
.Unprotect
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
Call Wert1_einlesen
Call Wert2_einlesen
Call Wert3_einlesen
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
.Protect
End With
Else
MsgBox "Die geöffnete Datei enthält nicht Daten des Vormonats"
End If
Fehler:
If Err.Number  0 Then
strMsg = "Fehler-Nr. " & Err.Number & vbLf & Err.Description
If Not wbVormonat Is Nothing And wksDienstVor Is Nothing Then
strMsg = strMsg & vbLf & "Blatt ""Dienstplan"" in geöffneter Datei nicht vorhanden"
ElseIf Not wbVormonat Is Nothing And wksKopfVor Is Nothing Then
strMsg = strMsg & vbLf & "Blatt ""Kopf"" in geöffneter Datei nicht vorhanden"
End If
MsgBox strMsg
End If
Beenden:
If Not wbVormonat Is Nothing Then
If MsgBox("Soll geöffnete Datei mit Daten des Vormonats wieder geschlossen werden?", _
vbYesNo) = vbYes Then wbVormonat.Close savechanges:=False
End If
End Sub
Private Sub Wert1_einlesen()
'Wert 1 aus Vormonat übernehmen
Dim arrZeilenWerte() As Long
ReDim arrZeilenWerte(1 To intMitarbeiter)
'in den nachfolgenden Zeilen je Mitarbeiter die Bezugszeilen für die Werte eingeben/anpassen.
arrZeilenWerte(1) = 7
arrZeilenWerte(2) = 37
arrZeilenWerte(3) = 67
arrZeilenWerte(4) = 97
arrZeilenWerte(5) = 127
arrZeilenWerte(6) = 157
arrZeilenWerte(7) = 187
arrZeilenWerte(8) = 217
arrZeilenWerte(9) = 247
arrZeilenWerte(10) = 277
arrZeilenWerte(11) = 307
arrZeilenWerte(12) = 337
arrZeilenWerte(13) = 367
arrZeilenWerte(14) = 397
arrZeilenWerte(15) = 327
arrZeilenWerte(16) = 357
arrZeilenWerte(17) = 387
arrZeilenWerte(18) = 417
arrZeilenWerte(19) = 447
arrZeilenWerte(20) = 477
arrZeilenWerte(21) = 507
arrZeilenWerte(22) = 537
arrZeilenWerte(23) = 567
arrZeilenWerte(24) = 597
'in der folgenden Zeile die Nr der Spalten anpassen
'lngSpalte = Zielspalte für Saldodaten aus Vormonat im Dienstplan
'lngSpalteVor = Quellspalte mit Saldodaten aus Vormonat
Call Werte_einlesen(lngSpalte:=34, lngSpalteVor:=35, arrZeilen:=arrZeilenWerte)
End Sub
Private Sub Wert2_einlesen()
'Wert 2 aus Vormonat übernehmen
Dim arrZeilenWerte() As Long
ReDim arrZeilenWerte(1 To intMitarbeiter)
'in den nachfolgenden Zeilen je Mitarbeiter die Bezugszeilen für die Werte eingeben/anpassen.
arrZeilenWerte(1) = 7
arrZeilenWerte(2) = 37
arrZeilenWerte(3) = 67
arrZeilenWerte(4) = 97
arrZeilenWerte(5) = 127
arrZeilenWerte(6) = 157
arrZeilenWerte(7) = 187
arrZeilenWerte(8) = 217
arrZeilenWerte(9) = 247
arrZeilenWerte(10) = 277
arrZeilenWerte(11) = 307
arrZeilenWerte(12) = 337
arrZeilenWerte(13) = 367
arrZeilenWerte(14) = 397
arrZeilenWerte(15) = 327
arrZeilenWerte(16) = 357
arrZeilenWerte(17) = 387
arrZeilenWerte(18) = 417
arrZeilenWerte(19) = 447
arrZeilenWerte(20) = 477
arrZeilenWerte(21) = 507
arrZeilenWerte(22) = 537
arrZeilenWerte(23) = 567
arrZeilenWerte(24) = 597
'in der folgenden Zeile die Nr der Spalten anpassen
'lngSpalte = Zielspalte für Saldodaten aus Vormonat im Dienstplan
'lngSpalteVor = Quellspalte mit Saldodaten aus Vormonat
Call Werte_einlesen(lngSpalte:=34, lngSpalteVor:=35, arrZeilen:=arrZeilenWerte)
End Sub
Private Sub Wert3_einlesen()
'Wert 3 aus Vormonat übernehmen
Dim arrZeilenWerte() As Long
ReDim arrZeilenWerte(1 To intMitarbeiter)
'in den nachfolgenden Zeilen je Mitarbeiter die Bezugszeilen für die Werte eingeben/anpassen.
arrZeilenWerte(1) = 7
arrZeilenWerte(2) = 37
arrZeilenWerte(3) = 67
arrZeilenWerte(4) = 97
arrZeilenWerte(5) = 127
arrZeilenWerte(6) = 157
arrZeilenWerte(7) = 187
arrZeilenWerte(8) = 217
arrZeilenWerte(9) = 247
arrZeilenWerte(10) = 277
arrZeilenWerte(11) = 307
arrZeilenWerte(12) = 337
arrZeilenWerte(13) = 367
arrZeilenWerte(14) = 397
arrZeilenWerte(15) = 327
arrZeilenWerte(16) = 357
arrZeilenWerte(17) = 387
arrZeilenWerte(18) = 417
arrZeilenWerte(19) = 447
arrZeilenWerte(20) = 477
arrZeilenWerte(21) = 507
arrZeilenWerte(22) = 537
arrZeilenWerte(23) = 567
arrZeilenWerte(24) = 597
'in der folgenden Zeile die Nr der Spalten anpassen
'lngSpalte = Zielspalte für Saldodaten aus Vormonat im Dienstplan
'lngSpalteVor = Quellspalte mit Saldodaten aus Vormonat
Call Werte_einlesen(lngSpalte:=34, lngSpalteVor:=35, arrZeilen:=arrZeilenWerte)
End Sub
Private Sub Werte_einlesen(lngSpalte As Long, lngSpalteVor As Long, arrZeilen)
'Werte aus Vormonat übernehmen
'lngSpalte = Zielspalte für Saldodaten aus Vormonat im Dienstplan
'lngSpalteVor = Quellspalte mit Saldodaten aus Vormonat
'arrZeilen = Daten-Array mit den Zeilennummern
Dim lngMit As Long
For lngMit = LBound(arrZeilen) To UBound(arrZeilen)
'Wert übernehmen
wksDienst.Cells(arrZeilen(lngMit), lngSpalte).Offset(0, 0).Value = _
wksDienstVor.Cells(arrZeilen(lngMit), lngSpalteVor).Offset(0, 0).Value
Next
End Sub


Anzeige

323 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige