Что нового

[Данные, строки] Удаление совпадающих ячеек в 2х столбцах excel

MrGep

Новичок
Сообщения
74
Репутация
1
Версия AutoIt: 3.

Описание: Всем доброе время суток!) Столкнулся с проблемой - ежедневно приходится просматривать два столбца в excel (Порядка 500 строк) и если в первом столбце любая ячейка совпадет с любой ячейкой из второго столбца, то эти ячейки необходимо удалять(Именно удалять, со сдвигом вверх). В результате получается два столбика, в десять - двадцать значений каждый. Так как моих знаний недостаточно, а по утрам заниматься подобным больше не хочется, я прошу помощи))

Примечания: Заранее спасибо))
 

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
Это проще сделать на встроенном в excel vb script. Просто считываешь первый столбец в массив и далее сравниваешь с ним каждую ячейку 2-го столбца.
 

WSWR

AutoIT Гуру
Сообщения
941
Репутация
363
MrGep
Что-то вроде этого?

Код:
#include <Excel.au3>

$sFilePath1 = @ScriptDir & "\Test.xls"
$oExcel = _ExcelBookOpen($sFilePath1,1)

For $i=1 To 1000 ; чтение 1000 строк (с запасом)
$sCellValue1 = _ExcelReadCell($oExcel, $i, 1) ; 1-й столбец
$sCellValue2=_ExcelReadCell($oExcel, $i, 2) ; 2-й столбец

If  $sCellValue1 <> "" And $sCellValue2 <> "" Then

If $sCellValue1=$sCellValue2 Then _ExcelRowDelete($oExcel, $i,1) ; удаление строки

Else
	Exit
EndIf

Next


Без сохранения (на всякий случай) - после работы скрипта нужно вручную сохранять файл.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
MrGep,
Прикрепите пример файла Excel и сделайте в нем заливку каким-нибудь цветом тех ячеек, которые надо удалить.
 
Автор
M

MrGep

Новичок
Сообщения
74
Репутация
1
Почему - то не получилось прикрепить в первое сообщение, вот.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
MrGep,
Попробуйте так. Проверял на Excel 2003.Работает довольно шустро.
Код:
#include <Excel.au3>

;функции _Excel* без проверок на ошибки

$iList = 1
$iNew = 0
$sFile = @ScriptDir & '\Test'
$sFileTemp = @ScriptDir & '\Temp'

$oExcel = _ExcelBookOpen($sFile & '.xls', 0)
_ExcelSheetActivate($oExcel, $iList)
_ExcelBookSaveAs($oExcel, $sFileTemp, 'txt', 0, 1)
_ExcelBookClose($oExcel, 0)
$oExcel = 0

$sText = FileRead($sFileTemp & '.txt')

$aFirst = StringRegExp($sText, '(?m)^(.+)\t', 3)
If @error Then Exit -1

$aSecond = StringRegExp($sText, '(?m)\t(.+)(?:\t|\r)', 3)
If @error Then Exit -2
$sText = ''
;$iSt = TimerInit()
$aFirstNew = _Del_1DArrayFrom_1DArray($aSecond, $aFirst)
If @error Then Exit -3
;ConsoleWrite(StringFormat('%.2f msec', TimerDiff($iSt)) & @LF)
;$iSt = TimerInit()
$aSecondNew = _Del_1DArrayFrom_1DArray($aFirst, $aSecond)
If @error Then Exit -4
;ConsoleWrite(StringFormat('%.2f msec', TimerDiff($iSt)) & @LF)

If $aFirstNew[0] > $aSecondNew[0] Then
	$iEnd = $aSecondNew[0]
	$iNew = 1
ElseIf $aFirstNew[0] < $aSecondNew[0] Then
	$iEnd = $aFirstNew[0]
	$iNew = 2
Else
	$iEnd = $aFirstNew[0]
EndIf

For $i = 1 To $iEnd
	$sText &= $aFirstNew[$i] & @TAB & $aSecondNew[$i] & @CRLF
Next
Switch $iNew
	Case 1
		For $i = $iEnd + 1 To $aFirstNew[0]
			$sText &= $aFirstNew[$i] & @TAB & @CRLF
		Next
	Case 2
		For $i = $iEnd + 1 To $aSecondNew[0]
			$sText &= @TAB & $aSecondNew[$i] & @CRLF
		Next
EndSwitch
$hFile = FileOpen($sFileTemp & '.txt', 2)
FileWrite($hFile, $sText)
FileClose($hFile)

$oExcel = _ExcelBookOpen($sFileTemp & '.txt', 0)
_ExcelBookSaveAs($oExcel, $sFileTemp, 'xls', 0, 1)
_ExcelBookClose($oExcel, 0)
FileDelete($sFileTemp & '.txt')

#cs
	идея в этой теме: http://autoit-script.ru/index.php/topic,2930.0.html
	Вернет одномерный массив $a_Ret, в котором из одномерного массива $a_Where удалены все элементы,
	совпадающие с элементами одномерного массива $a_What.
	$a_Ret[0] - кол-во несовпадающих элементов
	(пока нет времени дописывать обработку 2-х мерных массивов)
	$f_Casesense = False - не учитывается регистр
	$f_Casesense = True - учитывается регистр
#ce
Func _Del_1DArrayFrom_1DArray($a_What, $a_Where, $i_StartWhat = 0, $i_StartWhere = 0, $f_Casesense = False)
	Local $i_1DWhat, $i_1DWhere, $a_Ret[1] = [0], $s_Un = '/|\'

	If UBound($a_What, 0) <> 1 Then Return SetError(1, 0, -1)
	If UBound($a_Where, 0) <> 1 Then Return SetError(1, 0, -1)
	$i_1DWhat = UBound($a_What)
	$i_1DWhere = UBound($a_Where)
	If $i_1DWhat - $i_StartWhat < 1 Then Return SetError(2, 0, -1)
	If $i_1DWhere - $i_StartWhere < 1 Then Return SetError(2, 0, -1)
	If $f_Casesense Then
		For $i = $i_StartWhat To $i_1DWhat - 1
			Assign(Binary($a_What[$i] & $s_Un), 0)
		Next
	Else
		For $i = $i_StartWhat To $i_1DWhat - 1
			Assign($a_What[$i] & $s_Un, 0)
		Next
	EndIf
	ReDim $a_Ret[$i_1DWhere + 1]
	If $f_Casesense Then
		For $i = $i_StartWhere To $i_1DWhere - 1
			If IsDeclared(Binary($a_Where[$i] & $s_Un)) Then ContinueLoop
			$a_Ret[0] += 1
			$a_Ret[$a_Ret[0]] = $a_Where[$i]
		Next
	Else
		For $i = $i_StartWhere To $i_1DWhere - 1
			If IsDeclared($a_Where[$i] & $s_Un) Then ContinueLoop
			$a_Ret[0] += 1
			$a_Ret[$a_Ret[0]] = $a_Where[$i]
		Next
	EndIf
	ReDim $a_Ret[$a_Ret[0] + 1]
	Return $a_Ret
EndFunc   ;==>_Del_1DArrayFrom_1DArray
Скорость обработки можно проверить, создав тестовую книгу этим кодом:
Код:
#include <Excel.au3>

$sFile = @ScriptDir & '\Test'

$sText = ''

For $j = 1 To 10
	For $i = 1 To 999
		$sText &= Random(100, 1000, 1) & @TAB & Random(10000, 100000, 1) & @CRLF
	Next
	$sText &= $j & @TAB & $j & @CRLF
Next

$hFile = FileOpen($sFile & '.txt', 2)
FileWrite($hFile, $sText)
FileClose($hFile)

$oExcel = _ExcelBookOpen($sFile & '.txt', 0)
_ExcelBookSaveAs($oExcel, $sFile, 'xls', 0, 1)
_ExcelBookClose($oExcel, 0)
FileDelete($sFile & '.txt')
 
Верх