Что нового

поиск текста в excel _Excel_RangeFind и удаление найденного

RockMan

Новичок
Сообщения
67
Репутация
0
есть файл excel в нем текстовое значение "12345" нужно найти место где оно встречается и удалить эту строку, подскажите как это сделать функцией _Excel_RangeFind ?

update!
через модифицрованную функцию нашел как искать значение но теперь как удалить строку в которой используется это значение??

вот это удаляет чисто значение найденное, но а как на счет всей строки где это значение?
Код:
$SearchResult=__Excel_RangeFind($oWorkbook, '1234567')
_Excel_RangeDelete($oWorkbook.Worksheets(1), $SearchResult[0][1])



Код:
Func __Excel_RangeFind($oWorkbook, $sSearch, $vRange = Default, $iLookIn = Default, $iLookAt = Default, $bMatchcase = Default)
    If Not IsObj($oWorkbook) Or ObjName($oWorkbook, 1) <> "_Workbook" Then Return SetError(1, 0, 0)
    If StringStripWS($sSearch, 3) = "" Then Return SetError(2, 0, 0)
    If $iLookIn = Default Then $iLookIn = $xlValues
    If $iLookAt = Default Then $iLookAt = $xlPart
    If $bMatchcase = Default Then $bMatchcase = False
    Local $oMatch, $sFirst = "", $bSearchWorkbook = False, $oSheet
    If $vRange = Default Then
        $bSearchWorkbook = True
        $oSheet = $oWorkbook.Sheets(1)
        $vRange = $oSheet.UsedRange
    ElseIf IsString($vRange) Then
        $vRange = $oWorkbook.Activesheet.Range($vRange)
        If @error Then Return SetError(3, @error, 0)
    EndIf
    Local $aResult[100][4], $iIndex = 0, $iIndexSheets = 1, $iNumberOfSheets = $oWorkbook.Worksheets.Count
    While 1
        $oMatch = $vRange.Find($sSearch, Default, $iLookIn, $iLookAt, Default, Default, $bMatchcase)
        If @error Then Return SetError(4, @error, 0)
        If IsObj($oMatch) Then
            $sFirst = $oMatch.Address
            While 1
                $aResult[$iIndex][0] = $oMatch.Worksheet.Name
                $aResult[$iIndex][1] = $oMatch.Address
                $aResult[$iIndex][2] = $oMatch.Value
                $aResult[$iIndex][3] = $oMatch.Formula
                $iIndex = $iIndex + 1
                If Mod($iIndex, 100) = 0 Then ReDim $aResult[UBound($aResult, 1) + 100][4]
                $oMatch = $vRange.Findnext($oMatch)
                If Not IsObj($oMatch) Or $sFirst = $oMatch.Address Then ExitLoop
            WEnd
        EndIf
        If Not $bSearchWorkbook Then ExitLoop
        $iIndexSheets = $iIndexSheets + 1
        If $iIndexSheets > $iNumberOfSheets Then ExitLoop
        $sFirst = ""
        $oSheet = $oWorkbook.Sheets($iIndexSheets)
        If @error Then ExitLoop
        $vRange = $oSheet.UsedRange
    WEnd
    ReDim $aResult[$iIndex][4]
    Return $aResult
EndFunc
 

ra4o

AutoIT Гуру
Сообщения
1,165
Репутация
246
используйте для удаления номер строки, выделенный из адреса ячейки , например так :
Код:
$Stroka=StringSplit($SearchResult[0][1],'$')
	   _Excel_RangeDelete($oWorkbook.Worksheets(1), $Stroka[3]&':'&$Stroka[3])

Но помните, если Вы будете удалять найденные строки в цикле, то необходимо учесть то, что при удалении строки в документе будут смещаться и уже следующая ранее найденная строка со значением будет на одну позицию выше (надеюсь ясно изложил :-[) , а так же учесть то, что в одной строке могут повторяться искомые значения и исключить многократное удаление строки с одинаковым номером.
Например как-то так:(Удалит все строки из Excel , которые содержат значение "$sSearch")
Код:
#include <excel.au3>

$sExcelFile = @ScriptDir & '\1.xlsx'
$sSearch = '12345'

$oExcel = _Excel_Open(False)
$oWorkbook = _Excel_BookOpen($oExcel, $sExcelFile)
$SearchResult = __Excel_RangeFind($oWorkbook, $sSearch)
$k = 0
$LastIndex = -1
For $i = 0 To UBound($SearchResult) - 1
	$Stroka = StringSplit($SearchResult[$i][1], '$')
	If $LastIndex <> $Stroka[3] Then
		$LastIndex = $Stroka[3]
		_Excel_RangeDelete($oWorkbook.Worksheets(1), $Stroka[3] - $k & ':' & $Stroka[3] - $k)
		$k += 1
	EndIf
Next
_Excel_Close($oExcel)
 
Верх