forsberg21
Goto Top

VBA - Excel - Alle Worksheets durchlaufen und Werte in Zellen schreiben

Jedes Worksheet des Excel-Sheets abarbeiten, jeweils die letzte Zeile auslesen und gefundene Werte in statische Felder schreiben

Hallo ihr Profis,

ich habe ein Problem mit einem Excel-Makro. Muss dazu sagen, dass mein letztes Mal VBA ~ 6 Jahre zurückliegt. Bin also total eingerostet und muss mich jetzt auch an euch wenden face-smile

Was will ich machen?
Ich habe eine Excel-Datei mit mehreren Worksheets (5). Ein Makro soll beim Öffnen der Datei durch alle Worksheets laufen, jeweils die letzte Zeile auslesen, aus drei Spalten der letzten Zeile die Werte auslesen, und im selben Worksheet an anderer Stelle einfügen.

Was ist mein Problem?
Nun, die Funktion habe ich schon Mal "auto_open" genannt, dass sie beim Öffnen auch automatisch ausgeführt wird. Meine Schleife läuft durch alle Worksheets (ich habe als Debug eingebaut, dass er mir den Namen des Worksheets in einer MsgBox anzeigt), die Änderungen werden aber immer nur im 1. Worksheet durchgeführt. Ich habe meinen Code wirklich mehrmals durchgesehen jetzt, finde aber nicht, wo hier statisch auf immer das 1. Worksheet verwiesen wird ...

Sub auto_open()

  'Variablendeklaration  
  Dim objWks    As Worksheet
  Dim nCol      As Integer
  Dim nLastRow  As Long
  Dim nCounter  As Integer
  Dim nNumWS    As Integer
    
  'Anzahl der Worksheets auslesen  
  nNumWS = ActiveWorkbook.Worksheets.Count
    
  For nCounter = 1 To nNumWS
    
  'Das Worksheet aufgreifen und als Objekt definieren  
  Set objWks = ActiveWorkbook.Worksheets(nCounter)
    
  'Spalte A  
  nCol = 1
  With objWks
      If Application.WorksheetFunction.CountA( _
              .Columns(nCol).EntireColumn) > 0 Then

          If Len(.Cells(.Rows.Count, nCol).Value) = 0 Then
              nLastRow = .Cells(.Rows.Count, nCol).End(xlUp).Row
          Else
              nLastRow = .Rows.Count
          End If
          'Variabel abgegriffene Werte in die statischen Felder schreiben  
          objWks.Cells(2, 7).Value = objWks.Cells(nLastRow, nCol)
         
      End If
  End With
  
  'Spalte B  
  nCol = 2
  With objWks
      If Application.WorksheetFunction.CountA( _
              .Columns(nCol).EntireColumn) > 0 Then

          If Len(.Cells(.Rows.Count, nCol).Value) = 0 Then
              nLastRow = .Cells(.Rows.Count, nCol).End(xlUp).Row
          Else
              nLastRow = .Rows.Count
          End If
          'Variabel abgegriffene Werte in die statischen Felder schreiben  
          objWks.Cells(3, 7).Value = objWks.Cells(nLastRow, nCol)
         
      End If
  End With
  
  'Spalte F  
  nCol = 6
  With objWks
      If Application.WorksheetFunction.CountA( _
              .Columns(nCol).EntireColumn) > 0 Then

          If Len(.Cells(.Rows.Count, nCol).Value) = 0 Then
              nLastRow = .Cells(.Rows.Count, nCol).End(xlUp).Row
          Else
              nLastRow = .Rows.Count
          End If
          'Variabel abgegriffene Werte in die statischen Felder schreiben  
          objWks.Cells(4, 7).Value = objWks.Cells(nLastRow, nCol)
         
      End If
  End With
    
 'Debugfunktion (Anzeigen des Worksheet-Namens  
 MsgBox ActiveWorkbook.Worksheets(nCounter).Name
   Set objWks = Nothing
   Next nCounter
    
'//EOF  
End Sub

Ich wäre um jede Hilfe dankbar!

brgds

Content-Key: 63623

Url: https://administrator.de/contentid/63623

Printed on: April 23, 2024 at 23:04 o'clock

Member: bastla
bastla Jul 12, 2007 at 09:06:50 (UTC)
Goto Top
Hallo Forsberg21!

Die schlechte Nachricht vorweg: Dein Code funktioniert bei mir ...

Zwar könnte man das Ganze wie folgt etwas straffen, aber das ist auch nur Kosmetik:

Option Explicit

'Variablendeklaration  
Dim objWks    As Worksheet
Dim nLastRow  As Long
Dim nCounter  As Integer
Dim nNumWS    As Integer
    
Sub auto_open()

'Anzahl der Worksheets auslesen  
nNumWS = ActiveWorkbook.Worksheets.Count
    
For nCounter = 1 To nNumWS
    
    'Das Worksheet aufgreifen und als Objekt definieren  
    Set objWks = ActiveWorkbook.Worksheets(nCounter)
    
    'Spalte A -> Zeile 2, Spalte G  
    Call Eintragen(1, 2, 7)
    'Spalte B -> Zeile 3, Spalte G  
    Call Eintragen(2, 3, 7)
    'Spalte F -> Zeile 4, Spalte G  
    Call Eintragen(6, 4, 7)
    
    Set objWks = Nothing
Next 'nCounter  
    
End Sub

Sub Eintragen(nCol As Integer, nTRow As Integer, nTCol As Integer)
With objWks
      If Application.WorksheetFunction.CountA( _
              .Columns(nCol).EntireColumn) > 0 Then

          If Len(.Cells(.Rows.Count, nCol).Value) = 0 Then
              nLastRow = .Cells(.Rows.Count, nCol).End(xlUp).Row
          Else
              nLastRow = .Rows.Count
          End If
          'Variabel abgegriffene Werte in die statischen Felder schreiben  
          objWks.Cells(nTRow, nTCol).Value = objWks.Cells(nLastRow, nCol)
         
      End If
  End With
End Sub

Mir fällt leider keine vernünftige Erklärung ein, warum nur die erste Tabelle bearbeitet werden sollte. face-sad

Grüße
bastla
Member: Forsberg21
Forsberg21 Jul 12, 2007 at 09:10:18 (UTC)
Goto Top
Hallo!

Es war die pure Dummheit. Das Makro funktionierte die ganze Zeit einwandfrei, ich hatte nur die Ausrichtung der Felder so gehabt, dass ich es nicht gleich gesehen habe.

Trotzdem Danke für die Hilfe.

Problem gelöst, Thread kann geschlossen werden.

brgds