while fkt bis bestimmte zeile und dann erneut

kon

Grünschnabel
hallo,

ich hätte da mal ne frage...

ich hab in excel eine spalte mit werten:
5,4,3,2,5,4,3,2

jetzt will ich dass erst nur die ersten 4 werte betrachtet werden und daraus das minimum in ein neues feld geschrieben wird.
als nächstes hätte ich gern, dass die aus den nächsten 4 werten ebenfalls das min herausgesucht werden und in der gleichen spalte wie der wert zuvor, aber eine zeile darunter, hingeschrieben werden.

vielen dank für eure hilfe
 
Dazu braucht man doch kein VBA. Eine einfache Formel geht da auch

B1: '=MIN(A1:A4)'
B2: '=MIN(A5:A8)'
 
danke für die schnelle antwort.
ich excel weix ich auch wie das geht aber ich will wissen wie es mit vba funktioniert weil ich es für ein makro brauche.

danke trotzdem schon mal
 
Ich würde es so lösen.
Visual Basic:
'Definitionen
Private Const C_BLOCK_SIZE = 4
Private Const C_SEARCH_COLUMN_NR = 1
Private Const C_TARGET_COLUMN_NR = 2

Private Type tBlock
    nr            As Integer    'Aktuelle Nr des Blockes
    startRowNr    As Integer    'Start Zeile des Blocks
    startCell     As Range      'Start Zelle
    endRowNr      As Integer    'End Zeile
    endCell       As Range      'End Zelle
    rng           As Range      'Der Black als Range
End Type

' Die zu startende Methode
Public Sub startMe()
    Dim block       As tBlock
    
    'Ein Block vorrücken solange Daten vorhanden sind
    Do While moveBlock(block, ActiveSheet)
        'Formel in die Zieltabelle schreiben
        ActiveSheet.Cells(block.nr, C_TARGET_COLUMN_NR).Formula = "=MIN(" & block.rng.Address & ")"
    Loop
End Sub

'/**
' * Verschibt den Block und gibt true/false zurück. Je nachdem ob Daten vorhanden sind oder nicht
' * @param  <tBlock>        Eine Referenz auf den Block. Die übergeben Variable wird somit verändert
' * @param  <Worksheet>     Das Worksheet auf dem das ganze abläuft
' * @return <Boolean>       Trae/False. Aussage darüber ob der Block Daten enthält
' */
Private Function moveBlock(ByRef ioBlock As tBlock, ByVal iSh As Worksheet) As Boolean
    With ioBlock
        .nr = .nr + 1
        .startRowNr = .endRowNr + 1
        .endRowNr = .endRowNr + C_BLOCK_SIZE
        Set .startCell = iSh.Cells(.startRowNr, C_SEARCH_COLUMN_NR)
        Set .endCell = iSh.Cells(.endRowNr, C_SEARCH_COLUMN_NR)
        Set .rng = iSh.Range(.startCell, .endCell)
        'http://ewbi.blogs.com/develops/2006/03/determine_if_a_.html
        moveBlock = (WorksheetFunction.CountBlank(.rng) <> .rng.Count)
    End With
End Function


Kleiner Moderator-Hinweis am Rande:
http://www.tutorials.de/content/872-netiquette.html
Unser Forum ist kein Chatroom. Kurz-Beiträge ("Ein-Zeilen Postings"), die einfach so ins Forum "geklatscht" werden, werden ohne Vorwarnung von einem Moderator oder Administrator gelöscht. Das gleiche gilt insbesondere für Beiträge, die in Rechtschreibung, Satzbau und Verständlichkeit nicht ein vernünftiges, allgemein übliches und altersgruppen-übergreifendes Niveau erfüllen. Jugendsprache, regional verbreitete Dialekte und durchgehend kleingeschriebene Beiträge sind ebenfalls unerwünscht. Mit anderen Worten: wer erfolgreich die im Deutsch-Unterricht erlernten Kenntnisse praxisnah auf unserem Forum anwenden kann, wird nicht mit dieser Regel in Konflikt kommen. "Wiederholungstäter" werden, nachdem sie zuvor von einem Moderator auf die Mängel hingewiesen wurden, ggf. unbefristet gesperrt.

Nachtrag:
Und das ganze mit den Parametern als Übergabeargumente
Visual Basic:
Private Type tBlock
    nr            As Integer    'Aktuelle Nr des Blockes
    startRowNr    As Integer    'Start Zeile des Blocks
    startCell     As Range      'Start Zelle
    endRowNr      As Integer    'End Zeile
    endCell       As Range      'End Zelle
    rng           As Range      'Der Black als Range
End Type

Private Type tParams
    blockSize     As Integer
    searchColNr   As Integer
    targetColNr   As Integer
End Type

'/**
' * Die zu startende Methode
' * @param    <Integer>   Grösse des Blockes
' * @param    <Integer>   Spalte in welcher die Zahlenreihen stehen
' * @param    <Integer>   Spalte in welche die Formenln geschrieben werden
' */
Public Sub startMe( _
        Optional ByVal iBlockSize As Integer = 4, _
        Optional ByVal iSearchColNr As Integer = 1, _
        Optional ByVal iTargetColNr As Integer = 2 _
)
    Dim block       As tBlock
    Dim params        As tParams
        
    'Parameter übernehmen
    With params
        .blockSize = iBlockSize
        .searchColNr = iSearchColNr
        .targetColNr = iTargetColNr
    End With
    
    'Ein Block vorrücken solange Daten vorhanden sind
    Do While moveBlock(block, ActiveSheet, params)
        'Formel in die Zieltabelle schreiben
        ActiveSheet.Cells(block.nr, params.targetColNr).Formula = "=MIN(" & block.rng.Address & ")"
    Loop
End Sub

'/**
' * Verschibt den Block und gibt true/false zurück. Je nachdem ob Daten vorhanden sind oder nicht
' * @param  <tBlock>        Eine Referenz auf den Block. Die übergeben Variable wird somit verändert
' * @param  <Worksheet>     Das Worksheet auf dem das ganze abläuft
' * @param  <tParams>       Paramter
' * @return <Boolean>       Trae/False. Aussage darüber ob der Block Daten enthält
' */
Private Function moveBlock(ByRef ioBlock As tBlock, ByVal iSh As Worksheet, ByRef iParams As tParams) As Boolean
    With ioBlock
        .nr = .nr + 1
        .startRowNr = .endRowNr + 1
        .endRowNr = .endRowNr + iParams.blockSize
        Set .startCell = iSh.Cells(.startRowNr, iParams.searchColNr)
        Set .endCell = iSh.Cells(.endRowNr, iParams.searchColNr)
        Set .rng = iSh.Range(.startCell, .endCell)
        'http://ewbi.blogs.com/develops/2006/03/determine_if_a_.html
        moveBlock = (WorksheetFunction.CountBlank(.rng) <> .rng.Count)
    End With
End Function
 

Neue Beiträge

Zurück