Что нового

Сравнение двух Excel

maxd2007

Новичок
Сообщения
89
Репутация
0
Здравствуйте, подскажите пожалуйста никак не могу понять где ошибка, написал такой код:
Код:
#include <Array.au3>
#include <Excel.au3>
#include <MsgBoxConstants.au3>
#include <GUIConstantsEx.au3>
#include <EditConstants.au3>
#include <ButtonConstants.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <String.au3>
#include <IE.au3>

Func _open_read_excel($FileExelOpen)
    Local $oExcel = _Excel_Open(False)
    Local $oWorkbook = _Excel_BookOpen($oExcel, $FileExelOpen)
    Local $aResult = _Excel_RangeRead ($oWorkbook, 3) ;, "A2:C2", 2) ;_Excel_RangeRead($oWorkbook)
    _Excel_Close($oExcel)


    Local $iMaxY = UBound($aResult, 2);Количество столбцов
    Local $aTemp[0][$iMaxY];Временный массив НЕ пустых строк, пока "0" размера
    Local $iMax = 0
    For $i = 0 To UBound($aResult) - 1
        If $aResult[$i][1] <> "" Then ;Если значение не пустое, то во временный массив записываем данные
            $iMax += 1
            ReDim $aTemp[$iMax][$iMaxY]
            For $j = 0 To $iMaxY - 1 ;Запись всех столбцов во временный массив
                $aTemp[$iMax - 1][$j] = $aResult[$i][$j]
            Next
        EndIf
    Next
    $aResult = $aTemp

    Return $aResult
EndFunc

Func _comparison_array ($All_device_old, $All_device_new)
	$counter_old = UBound ($All_device_old) - 1
	$counter_new = UBound ($All_device_new) - 1
	Local $change[$counter_old + $counter_new]
	$Name_Change = 1
	$change[0] = "Удалено из старого списка:"
	For $i = 0 To $counter_old Step 1
		_ArraySearch ($All_device_new, $All_device_old[$i][0])
		If  @error Then
			$change[$Name_Change] = $All_device_old[$i][1]
			$Name_Change = $Name_Change + 1
		EndIf
	Next
	$change[$Name_Change] = "Добавленно из нового:"
	$Name_Change = $Name_Change + 1
	For $i = 0 to $counter_new Step 1
		_ArraySearch ($All_device_old, $All_device_new[$i][0])
		If  @error Then
			$change[$Name_Change] = $All_device_new[$i][1]
			$Name_Change = $Name_Change + 1
		EndIf
	Next


	Return $change
EndFunc



$FileExelOpen_old = FileOpenDialog ("Выберите excel фаил", @ScriptDir, "Excel (*.xls;*.xlsx)")
$FileExelOpen_new = FileOpenDialog ("Выберите excel фаил", @ScriptDir, "Excel (*.xls;*.xlsx)")
$All_device_old = _open_read_excel ($FileExelOpen_old)
$All_device_new = _open_read_excel ($FileExelOpen_new)
$test = _comparison_array ($All_device_old,$All_device_new )
_ArrayDisplay ($test)

Суть в том, что я указываю 2 excel файла и функция _comparison_array сравнивает эти 2 файла таким образом:
1) смотрит что удалено из первого excel (по первой колонке 3-го листа) относительно второго excel (по первой колонке 3-го листа), то что удалено вносится в массив (который будет возвращаться)
2) смотрит что добавлено во 2 excel файле относительно первого и тоже вносится в массив (который будет возвращаться)

У меня в одном excel 211 элементов, во втором 276 элементов, но по окончанию функции он показывает, что добавлено всего 4 элемента, хотя минимум их должно быть 65 (276-211=65). Никак не могу понять что я проморгал? Excel фаилы во вложении
 

Вложения

  • Test.7z
    16.6 КБ · Просмотры: 2

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
ma:rofl:2007
Давайте рассуждать вместе.

смотрит что удалено из первого
Удалено - значит было, а теперь нет. Было - значит есть во втором. Берём второй, ищем в первом. Если не нашли, значит удалено. Хотя, возможно, и не было. Здесь, вроде, всё правильно.

смотрит что добавлено во 2
Добавлено - значит не было. Но и в первом не было. Если взять из первого и НЕ найти во втором, то это ничего не значит, т.к. этого и не было. Следовательно, нужно взять из первого, найти во втором и удалить найденное из второго. Тогда все оставшиеся во втором будут добавленные относительно первого. Вот этот второй цикл, похоже, у вас некорректный.

Как сравнить два массива и показать отличающиеся элементы?
 
Автор
M

maxd2007

Новичок
Сообщения
89
Репутация
0
На счет ошибки согласен, но вот я и не понимаю что не так:

Код:
For $i = 0 to $counter_new Step 1 ; цикл соответствует количеству элементов массива
		_ArraySearch ($All_device_old, $All_device_new[$i][0]) ; ищем в первом excel совпадения из второго
		If  @error Then; если совпадения нет то записываем имя артикула
			$change[$Name_Change] = $All_device_new[$i][1]
			$Name_Change = $Name_Change + 1
		EndIf
	Next

вроде все логично, но ответ не соответствует ожиданию =)
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
ma:rofl:2007
А так?
Код:
_ArraySearch ($All_device_old, $All_device_new[$i][0], 0, 0, 0, 0, 1, 0)
 
Автор
M

maxd2007

Новичок
Сообщения
89
Репутация
0
:shok: не понял, это как? Почему то сработало (пока не проверял на сколько корректно), но ведь все что изменено это способ считывания от конца к началу или я неправильно понял?
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
ma:rofl:2007
способ считывания от конца к началу
На версии 3.3.14.2 восьмой параметр - это $iSubItem. Вместо умолчания -1 (поиск везде) установил 0 (только в первой колонке).
А для поиска по всем столбцам в вашем случае нужно либо установить $iCase в 1, либо $iCompare в 1 или 2.
 
Верх