Eine leere Zeile löschen?

  • Hallo Leute,

    ich habe das Problem, wenn ich aus einer E-Mail mir ein VBA-Code kopiere und in eine Anwendung einfüge, dass ich eine leere Zeile mehr habe als gewünscht.

    Beispiel vorher:

    Sub ListeFuellen(rngBereich As Range)


    Dim Zeile As Long, Spalte As Long


    For Zeile = 1 To rngBereich.Rows.Count
    If rngBereich.Cells(Zeile, 2) = 0 Or rngBereich.Cells(Zeile, 2) = "" Then


    Else
    lngIndex = lngIndex + 1
    ReDim Preserve arrListe(1 To 4, 1 To lngIndex)
    For Spalte = 1 To 4
    arrListe(Spalte, lngIndex) = rngBereich.Cells(Zeile, Spalte)
    Next
    End If
    Next


    End Sub


    Beispiel so soll es nachher sein:


    Sub ListeFuellen(rngBereich As Range)

    Dim Zeile As Long, Spalte As Long

    For Zeile = 1 To rngBereich.Rows.Count
    If rngBereich.Cells(Zeile, 2) = 0 Or rngBereich.Cells(Zeile, 2) = "" Then

    Else
    lngIndex = lngIndex + 1
    ReDim Preserve arrListe(1 To 4, 1 To lngIndex)
    For Spalte = 1 To 4
    arrListe(Spalte, lngIndex) = rngBereich.Cells(Zeile, Spalte)
    Next
    End If
    Next

    End Sub


    Ich habe mir gedacht ein GUI zu machen, in dem ich den Code aus der E-Mail einfüge und auf Button "Bearbeiten" klicke, der dann dies bearbeitet (immer eine leere Zeile löscht) ==> dann alles markieren ===> ausschneiden.
    Aber mir fehlt im Code diese Funktion. ;)

    [autoit]

    #include <Clipboard.au3>
    #include <GUIConstantsEx.au3>
    #include <SendMessage.au3>
    #include <WindowsConstants.au3>

    [/autoit][autoit][/autoit][autoit]

    Opt('GUIOnEventMode', 1)

    [/autoit][autoit][/autoit][autoit]

    $hGui = GUICreate('Delete_One_empty_Row', 600, 300)
    GUISetOnEvent($GUI_EVENT_CLOSE, '_End')
    $hEdit = GUICtrlCreateEdit('', 10, 10, 580, 240)
    GUICtrlSetBkColor(-1, 0xC0DCC0)
    $hSave = GUICtrlCreateButton('Bearbeiten', 220, 260, 120, 22)
    GUICtrlSetBkColor(-1, 0xA6CAF0)
    GUICtrlSetOnEvent(-1, '_Edit')
    GUISetState()
    WinSetOnTop($hGui, '', 1)
    Global $hNext = _ClipBoard_SetViewer($hGui)
    GUIRegisterMsg($WM_CHANGECBCHAIN, 'WM_CHANGECBCHAIN')
    GUIRegisterMsg($WM_DRAWCLIPBOARD, 'WM_DRAWCLIPBOARD')

    [/autoit][autoit][/autoit][autoit]

    While Sleep(1000)
    WEnd

    [/autoit]

    [Blockierte Grafik: http://www.imgbox.de/users/public/images/svMccUUMyV.jpg]

    Besten Dank im Voraus!

    Viele Grüße,
    Dino

    Einmal editiert, zuletzt von Dino (1. Mai 2012 um 16:45)

  • Hier, versuch das mal:

    [autoit]

    Func _RemoveEmptyLines ($s_String)
    Local $s_Return, $a_Split, $b_Empty

    $b_Empty = False
    $a_Split = StringSplit ($s_String, @CRLF, 1)

    [/autoit][autoit][/autoit][autoit]

    For $i = 1 To $a_Split[0]
    If $a_Split[$i] = "" And $b_Empty = False Then
    $b_Empty = True
    ElseIf $a_Split[$i] = "" And $b_Empty = True Then
    $b_Empty = False
    $s_Return &= $a_Split[$i] &@CRLF
    Else
    $s_Return &= $a_Split[$i] &@CRLF
    EndIf
    Next

    Return $s_Return
    EndFunc

    [/autoit]
  • Probier mal
    StringReplace($String, @CRLF & @CRLF, @CRLF)
    Hab's jetzt nicht probiert.

  • Hallo $var,

    ich weiß es nicht, ob es richtig eingefügt habe (siehe unten) oder ob da noch etwas fehlt.

    Diese Meldung bekomme ich:
    D:\test.au3(30,35) : ERROR: _RemoveEmptyLines() called by a previous line with 0 arg(s). Min = 1. First previous line calling this Func is 14.
    Func _RemoveEmptyLines ($s_String)
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
    D:\test.au3 - 1 error(s), 0 warning(s)


    [autoit]

    #include <Clipboard.au3>
    #include <GUIConstantsEx.au3>
    #include <SendMessage.au3>
    #include <WindowsConstants.au3>

    [/autoit][autoit][/autoit][autoit]

    Opt('GUIOnEventMode', 1)

    [/autoit][autoit][/autoit][autoit]

    $hGui = GUICreate('Delete_One_empty_Row', 600, 300)
    GUISetOnEvent($GUI_EVENT_CLOSE, '_End')
    $hEdit = GUICtrlCreateEdit('', 10, 10, 580, 240)
    GUICtrlSetBkColor(-1, 0xC0DCC0)
    $hSave = GUICtrlCreateButton('Bearbeiten', 220, 260, 120, 22)
    GUICtrlSetBkColor(-1, 0xA6CAF0)
    GUICtrlSetOnEvent(-1, '_RemoveEmptyLines')
    GUISetState()
    WinSetOnTop($hGui, '', 1)
    Global $hNext = _ClipBoard_SetViewer($hGui)
    GUIRegisterMsg($WM_CHANGECBCHAIN, 'WM_CHANGECBCHAIN')
    GUIRegisterMsg($WM_DRAWCLIPBOARD, 'WM_DRAWCLIPBOARD')

    [/autoit][autoit][/autoit][autoit]

    While Sleep(1000)
    WEnd

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    Func _End()
    _ClipBoard_ChangeChain($hGui, $hNext)
    Exit
    EndFunc ;==>_End

    [/autoit][autoit][/autoit][autoit]

    Func _RemoveEmptyLines ($s_String)
    Local $s_Return, $a_Split, $b_Empty

    [/autoit][autoit][/autoit][autoit]

    $b_Empty = False
    $a_Split = StringSplit ($s_String, @CRLF, 1)

    [/autoit][autoit][/autoit][autoit]

    For $i = 1 To $a_Split[0]
    If $a_Split[$i] = "" And $b_Empty = False Then
    $b_Empty = True
    ElseIf $a_Split[$i] = "" And $b_Empty = True Then
    $b_Empty = False
    $s_Return &= $a_Split[$i] &@CRLF
    Else
    $s_Return &= $a_Split[$i] &@CRLF
    EndIf
    Next

    [/autoit][autoit][/autoit][autoit]

    Return $s_Return
    EndFunc

    [/autoit]

    Viele Grüße,
    Dino

  • Da du ja im On-Event-Modus arbeitest, kannst du ja keine Parameter mitgeben.
    D.h. du musst am Anfang der Funktion
    $s_String = GUICtrlRead($hEdit)
    schreiben.

  • Nur so als Tipp, probier mal das hier aus ;)

    [autoit]

    $String = "test" & @CRLF & @CRLF & "test"
    MsgBox(0, "", $String)
    $String = StringReplace($String, @CRLF & @CRLF, @CRLF)
    MsgBox(0, "", $String)

    [/autoit]


    Spart ne Menge Code ein.

  • Hier:

    Spoiler anzeigen
    [autoit]

    #include <Clipboard.au3>
    #include <GUIConstantsEx.au3>
    #include <SendMessage.au3>
    #include <WindowsConstants.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Opt('GUIOnEventMode', 1)

    [/autoit] [autoit][/autoit] [autoit]

    $hGui = GUICreate('Delete_One_empty_Row', 600, 300)
    GUISetOnEvent($GUI_EVENT_CLOSE, '_End')
    $hEdit = GUICtrlCreateEdit('', 10, 10, 580, 240)
    GUICtrlSetBkColor(-1, 0xC0DCC0)
    $hSave = GUICtrlCreateButton('Bearbeiten', 220, 260, 120, 22)
    GUICtrlSetBkColor(-1, 0xA6CAF0)
    GUICtrlSetOnEvent(-1, '_RemoveEmptyLines')
    GUISetState()
    WinSetOnTop($hGui, '', 1)
    Global $hNext = _ClipBoard_SetViewer($hGui)
    ;~ GUIRegisterMsg($WM_CHANGECBCHAIN, 'WM_CHANGECBCHAIN')
    ;~ GUIRegisterMsg($WM_DRAWCLIPBOARD, 'WM_DRAWCLIPBOARD')

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    Sleep(100)
    WEnd

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _End()
    _ClipBoard_ChangeChain($hGui, $hNext)
    Exit
    EndFunc ;==>_End

    [/autoit] [autoit][/autoit] [autoit]

    Func _RemoveEmptyLines()
    $sEdit = GUICtrlRead($hEdit)
    $sEdit = StringReplace($sEdit, @CRLF & @CRLF, @CRLF)
    GUICtrlSetData($hEdit, $sEdit)
    EndFunc

    [/autoit]
  • Hallo m-obi,

    es funktioniert. :rock: :thumbup:

    Lässt sich nachdem Klick auf "Bearbeiten", wenn die Zeilen gelöscht sind, dies noch einbauen:
    Alles auswählen ==> Ausschneiden (ist dann in der Zwischenablage) ==> GUI schließen

    Besten Dank!

    Viele Grüße,
    Dino

  • Klar kann man das. Aber du musst auch mal ein bisschen dein Hirn anstrengen. Ich will dir ja nicht alles vorkauen. Tipp schau mal nach ClipPut.

  • Hi m-obi,

    so habe ich es jetzt:

    [autoit]

    #include <Clipboard.au3>
    #include <GUIConstantsEx.au3>
    #include <SendMessage.au3>
    #include <WindowsConstants.au3>

    [/autoit][autoit][/autoit][autoit]

    Opt('GUIOnEventMode', 1)

    [/autoit][autoit][/autoit][autoit]

    $hGui = GUICreate('Delete_One_empty_Row', 600, 300)
    GUISetOnEvent($GUI_EVENT_CLOSE, '_End')
    $hEdit = GUICtrlCreateEdit('', 10, 10, 580, 240)
    GUICtrlSetBkColor(-1, 0xC0DCC0)
    $hSave = GUICtrlCreateButton('Bearbeiten', 220, 260, 120, 22)
    GUICtrlSetBkColor(-1, 0xA6CAF0)
    GUICtrlSetOnEvent(-1, '_RemoveEmptyLines')
    GUISetState()
    WinSetOnTop($hGui, '', 1)
    Global $hNext = _ClipBoard_SetViewer($hGui)

    [/autoit][autoit][/autoit][autoit]

    While 1
    Sleep(100)
    WEnd

    [/autoit][autoit][/autoit][autoit]

    Func _End()
    _ClipBoard_ChangeChain($hGui, $hNext)
    Exit
    EndFunc ;==>_End

    [/autoit][autoit][/autoit][autoit]

    Func _RemoveEmptyLines()
    $sEdit = GUICtrlRead($hEdit)
    $sEdit = StringReplace($sEdit, @CRLF & @CRLF, @CRLF)
    GUICtrlSetData($hEdit, $sEdit)
    ClipPut(GUICtrlRead($hEdit))
    ;~ MsgBox(0, "Zwischenablage enthält:", GUICtrlRead($hEdit))
    EndFunc

    [/autoit]

    Mein Zeil ist es nach dem Klick auf "Bearbeiten" GUI zu schließen. Zur Zeit passiert es nicht