Что нового

[Автоматизация] Exel удалить не нужные столбцы

Isn

Новичок
Сообщения
119
Репутация
2
Приветствую,
Столкнулся с проблемой на работе ежедневно приходится делать отчет, и в связи с обновлением ПО
отчет приходится каждый раз править вручную, как можно автоматизировать удаление не нужных столбцов?
Прикрепляю два файла
Шаблон как должно быть: РеестрШаблон.XLT
Исходный формат: Реестр2.xls
 

madmasles

Модератор
Глобальный модератор
Сообщения
7 790
Репутация
2 319
Isn,
Колонки нужно удалить или скрыть, как на шаблоне?
 

axlwor

Скриптер
Сообщения
657
Репутация
147
зачем приплетать autoit, если все равно все пойдет кодом excel?
запускаешь макрос на активном листе
Код:
Option Base 1

Sub Macros()
    On Error GoTo error
    
    Dim aNames(8) As String
    aNames(1) = "Запись"
    aNames(2) = "Номер платежа"
    aNames(3) = "Время создания"
    aNames(4) = "Время исполнения"
    aNames(5) = "Отклик"
    aNames(6) = "Платеж"
    aNames(7) = "Комиссия системы"
    aNames(8) = "Сумма с комиссиями"
    
    Cells(1, 1).Select
    Do While ActiveCell.Value <> ""
        sStr = Trim(ActiveCell.Value)
        i = Application.WorksheetFunction.Match(sStr, aNames, 0)
        If i = -1 Then
            ActiveCell.EntireColumn.Delete
        Else
            ActiveCell.Offset(0, 1).Select
        End If
    Loop

error:
    i = -1
    Resume Next

End:
End Sub
 

madmasles

Модератор
Глобальный модератор
Сообщения
7 790
Репутация
2 319
Isn,
Попробуйте так. Осторожно используйте. В папке с проверяемыми файлами Excel будут обработаны все файлы, и все колонки, не подходящие под шаблон, будут скрыты(удалены). Файл-шаблон лучше сохранить в формате .xls (прикрепил образец).
Код:
#include <Excel.au3>
#include <File.au3>
#include <Array.au3>

Opt('MustDeclareVars', 1)
Opt('TrayMenuMode', 1)

Global $aTemplate, $aArrayExcelFiles, $iCountError = 0, $iCountSuccess = 0, $aArrayErrorsFiles[1], _
		$sFileTemplate = @ScriptDir & '\Template\РеестрШаблон.xls', _ ;файл Excel с шаблоном заголовка.
		$sDirControlExcel = @ScriptDir & '\Books' ;Папка с проверяемыми файлами Excel.

$aArrayExcelFiles = _FileListToArray($sDirControlExcel, '*.xls', 1)
If @error Then
	MsgBox(16, 'Error', '_FileListToArray')
	Exit
EndIf

_Get_Template_Array($sFileTemplate, $aTemplate)
If @error Then
	MsgBox(16, 'Error', '_Get_Template_Array')
	Exit
EndIf

For $i = 1 To $aArrayExcelFiles[0]
	_Del_Or_Hidden_Columns($sDirControlExcel & '\' & $aArrayExcelFiles[$i], $aTemplate)
	If @error Then
		$iCountError += 1
		ReDim $aArrayErrorsFiles[$iCountError + 1]
		$aArrayErrorsFiles[$iCountError] = $sDirControlExcel & '\' & $aArrayExcelFiles[$i]
	Else
		$iCountSuccess += 1
	EndIf
Next
MsgBox(64, 'Info', 'Файлов всего: ' & $aArrayExcelFiles[0] & @LF & _
		'Успешно обработано: ' & $iCountSuccess & @LF & 'Ошибок при обработке: ' & $iCountError)
If $iCountError Then
	$aArrayErrorsFiles[0] = $iCountError
	_ArrayDisplay($aArrayErrorsFiles, 'Файлы с ошибкой обработки')
EndIf

Func _Del_Or_Hidden_Columns($s_File_Excel, $a_Array_Template, $i_Flag = 0)
	;$i_Flag = 0 - скрыть колонки (по умолчанию), $i_Flag <> 0 - удалить колонки
	Local $o_Excel, $a_Temp_Array, $f_Yes, $i_Error = 1

	If Not FileExists($s_File_Excel) Then Return SetError(1)
	If Not IsArray($a_Array_Template) Then Return SetError(1)
	$o_Excel = _ExcelBookOpen($s_File_Excel, 0)
	If @error Then Return SetError(1)
	For $j = 1 To 1
		$a_Temp_Array = _ExcelReadSheetToArray($o_Excel, 1, 1, 1, 0)
		If @error Then ExitLoop
		If Not $a_Temp_Array[0][1] Then ExitLoop
		For $i = $a_Temp_Array[0][1] To 1 Step -1
			$f_Yes = True
			For $q = 1 To $a_Array_Template[0]
				If StringStripWS($a_Temp_Array[1][$i], 7) == StringStripWS($a_Array_Template[$q], 7) Then
					$f_Yes = False
					ExitLoop
				EndIf
			Next
			If $f_Yes Then
				If $i_Flag Then
					_ExcelColumnDelete($o_Excel, $i)
					If @error Then ExitLoop 2
				Else
					$o_Excel.Columns($i).Hidden = True
				EndIf
			EndIf
		Next
		$i_Error = 0
	Next
	_ExcelBookClose($o_Excel)
	Return SetError($i_Error)
EndFunc   ;==>_Del_Or_Hidden_Columns

Func _Get_Template_Array($s_File_Template, ByRef $a_Array)
	Local $o_Excel, $a_Temp_Array, $i_Count, $i_Error = 1
	If Not FileExists($s_File_Template) Then Return SetError(1)
	If IsArray($a_Array) Then $a_Array = 0
	$o_Excel = _ExcelBookOpen($s_File_Template, 0)
	If @error Then Return SetError(1)
	For $j = 1 To 1
		$a_Temp_Array = _ExcelReadSheetToArray($o_Excel, 1, 1, 1, 0)
		If @error Then ExitLoop
		If Not $a_Temp_Array[0][1] Then ExitLoop
		Dim $a_Array[$a_Temp_Array[0][1] + 1] = [$a_Temp_Array[0][1]]
		For $i = 1 To $a_Temp_Array[0][1]
			If $a_Temp_Array[1][$i] <> '' Then
				$i_Count += 1
				$a_Array[$i_Count] = $a_Temp_Array[1][$i]
			EndIf
		Next
		$i_Error = 0
	Next
	_ExcelBookClose($o_Excel)
	Return SetError($i_Error)
EndFunc   ;==>_Get_Template_Array


PS
axlwor,
Не любите Вы AutoIt. :smile:
 

axlwor

Скриптер
Сообщения
657
Репутация
147
я обожаю autoit, но это не значит что буду использовать его везде. Только там где он действительно незаменим :beer:
 

madmasles

Модератор
Глобальный модератор
Сообщения
7 790
Репутация
2 319
OffTopic:
axlwor,
:beer:
 
Автор
Isn

Isn

Новичок
Сообщения
119
Репутация
2
Спасибо всем за ответы, пример от madmasles то что нужно, тема решена
 
Верх