Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Изменения значения столбца в xls

Ответить
Настройки темы
CMD/BAT - [решено] Изменения значения столбца в xls

Пользователь


Сообщения: 72
Благодарности: 0

Профиль | Отправить PM | Цитировать


Добрый день. Имеется файл в xls формате в папке D:\IVC\Operators\Printer\22.05.2018 ( Дата ежедневно меняется) с количеством строк от 3 - 20 тысяч. В зависимости от того сколько нам дадут данных значений. Возможно ли чтобы скрипт считывал весь столбец ( Наименование столбца indexto ячейка B1 ) и изменял необходимые данные на другие значения? Например если попадется 368200 меняется на 368211. 142191 на 108840 366100 на 366108 366600 на 366611 367033 на 367901 364901 на 364910. Остальных значений которые нужно менять я пока не знаю. Но буду сам дополнять в этот скрипт, если он получится . Для примера кидаю файл с 7360 строками https://yadi.sk/i/oRqx-IX83WPjYt

Отправлено: 10:29, 23-05-2018

 

Пользователь


Сообщения: 72
Благодарности: 0

Профиль | Отправить PM | Цитировать


В Данном файле что я прикрепил нет таких индексов. Но для проверки например 403995 изменить на 403996 Я поэтому примеру сделаю на другие нужные мне индекса

Отправлено: 10:32, 23-05-2018 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


romfus, можно считывать, можно менять. Главный вопрос — по какому принципу?

Отправлено: 10:41, 23-05-2018 | #3


Пользователь


Сообщения: 72
Благодарности: 0

Профиль | Отправить PM | Цитировать


ну как понять по какому принципу? запускаю скрипт, этот скрипт в папке находит этот xls ( он один там ) считывает в этом xls стоблец b1. Если находит в нем 403995 изменяет на 403996 затем как все считал закрыл этот xls и сохранил.

Отправлено: 11:02, 23-05-2018 | #4


Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


romfus, откуда скрипт узнает, что нужно искать 403995, и откуда скрипт узнает, что менять нужно на 403996? Откуда скрипт узнает, что нужно искать 368200, и откуда скрипт узнает, что менять нужно на 368211? И т.д.

Отправлено: 11:26, 23-05-2018 | #5


Пользователь


Сообщения: 72
Благодарности: 0

Профиль | Отправить PM | Цитировать


а в cmd нет выборки? м.б в VBS есть?

Вот например в данном скрипте в xls изменяется ячейка f1 ( меняется на слово street )
Код: Выделить весь код
ExtIn = "xls"               'Расширение Excel-файла
RangeIn = "F1"              'Адрес клетки
TxtIn = "street"

BoxIn = "D:\IVC\Operators\Printer"         ' Папка с Excel-файлами

Set FSO = CreateObject("Scripting.FileSystemObject")
Set WShell = CreateObject("WScript.Shell")

On Error Resume Next
Set InBox = FSO.GetFolder(BoxIn)

If Err.Number <> 0 Then
    LL = WShell.Popup("Папка" + vbCrLf + vbCrLf + BoxIn + vbCrLf + vbCrLf + "Код ошибки " + CStr(Err.Number) + vbCrLf + Err.Description, 0, "Открытие папки", 16)
    On Error GoTo 0
Else

    Set XL = CreateObject("Excel.Application")
'   XL.Visible = True
    XL.Visible = False

    On Error GoTo 0
    Set AllFiles = InBox.Files

    For Each File In AllFiles
        XlsName = BoxIn + "\" + File.Name
        If LCase(FSO.GetExtensionName(XlsName)) = LCase(ExtIn) Then

            Set XLbook = XL.Workbooks.Open(XlsName)
            XL.Range(RangeIn) = TxtIn
            TxtName = BoxTxt + "\" + CStr(XL.Range(RangeIn).Value)
            XLbook.Save
            XLbook.Close
        End If
    Next

    XL.Quit
End If
вопрос просто только как он найдет определенный индекс. В данном скрипте выше там уже значение ячейки выдает которое нужно менять

а может скрипт искать именно цифру в xls а не определенную ячейку? То есть если встретится 403995 то я ее меняю

Отправлено: 11:30, 23-05-2018 | #6


Ветеран


Contributor


Сообщения: 2710
Благодарности: 1686

Профиль | Отправить PM | Цитировать


Скрипт просматривает ячейки в указанном столбце и меняет значения в соответствии с указанными правилами
Код: Выделить весь код
FileIn = "Z:\Box_In\34S_400139 - 404622_21222.xls"     'Имя файла

With WScript.Arguments
    If .Count <> 0 Then FileIn = .Item(0)
End With

' Массив с парами заменяемых значений ("что","на что")
  NRepl = Array("403001", "123001", _
                "403013", "123013", _
                "404622", "123622")
RangeIn = "B1"                                          'Адрес клетки c заголовком столбца

N1 = LBound(NRepl)
N2 = UBound(NRepl)

Set FSO = CreateObject("Scripting.FileSystemObject")
Set WShell = CreateObject("WScript.Shell")

On Error Resume Next
Set InBox = FSO.GetFile(FileIn)

If Err.Number <> 0 Then
    LL = WShell.Popup("Файл" + vbCrLf + vbCrLf + FileIn + vbCrLf + vbCrLf + "Код ошибки " + CStr(Err.Number) + vbCrLf + Err.Description, 0, "Открытие папки", 16)
    On Error GoTo 0
Else

With CreateObject("Excel.Application")
    .Visible = True
'   .Visible = False

    On Error GoTo 0
    Set XLbook = .Workbooks.Open(FileIn)

    i = 0
    Do
        i = i + 1
        iCell = Trim(CStr(.Range(RangeIn).Offset(i, 0)))
        If Len(iCell) = 0 Then Exit Do
        For j = N1 To N2 Step 2
            If iCell = NRepl(j) Then
                .Range(RangeIn).Offset(i, 0) = NRepl(j + 1)
                Exit For
            End If
        Next
    Loop
    
    XLbook.Save
    XLbook.Close

    .Quit
End With

End If
MsgBox "Скрипт завершен"
Имя файла можно указать прямо в скрипте, либо сделать на скрипт значок на раб. столе и затягивать мышкой на него обрабатываемый файл, при этом имя явно указанного в скрипте файла будет проигнорировано.

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.

Это сообщение посчитали полезным следующие участники:

Отправлено: 13:46, 23-05-2018 | #7


Пользователь


Сообщения: 72
Благодарности: 0

Профиль | Отправить PM | Цитировать


А форматирование оригинального файла этот скрипт может сохранить? а то он заменяет текст а форматирование меняется

Отправлено: 14:19, 23-05-2018 | #8


Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


Мой вариант — на базе OLE DB:
Код: Выделить весь код
Option Explicit

Dim objDictionary

Dim objFSO
Dim strSourceFile

Dim objConnection
Dim objCatalog
Dim objTable

Dim strPostCode4Find
Dim intRecordsAffected


Set objDictionary = WScript.CreateObject("Scripting.Dictionary")

With objDictionary
	.Add "368200", "368211"
	.Add "142191", "108840"
	.Add "366100", "366108"
	.Add "366600", "366611"
	.Add "367033", "367901"
	.Add "364901", "364910"
	.Add "403995", "403996"
	.Add "404116", "999999"
	.Add "404113", "888888"
End With

If WScript.Arguments.Count = 1 Then
	Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")
	
	strSourceFile = objFSO.GetAbsolutePathName(WScript.Arguments.Item(0))
	
	If objFSO.FileExists(strSourceFile) Then
		Set objConnection = WScript.CreateObject("ADODB.Connection")
		Set objCatalog    = WScript.CreateObject("ADOX.Catalog")
		
		WScript.Echo "Почтовый индекс [" & strPostCode4Find & "] встречается в:"
		WScript.Echo "------------------------------------------------------------------"
		
		If StrComp(objFSO.GetExtensionName(strSourceFile), "xls", vbTextCompare) = 0 Then
			WScript.Echo "[" & strSourceFile & "]"
			
			With objConnection
				.Provider = "Microsoft.Jet.OLEDB.4.0"
				.Properties.Item("Extended Properties").Value = "Excel 8.0;HDR=Yes;IMEX=0"
				.Open strSourceFile
				
				objCatalog.ActiveConnection = objConnection
				
				For Each objTable In objCatalog.Tables
					If StrComp(objTable.Type, "TABLE", vbTextCompare) = 0 Then
						WScript.Echo vbTab & "[" & objTable.Name & "]"
						
						For Each strPostCode4Find In objDictionary.Keys
							objConnection.Execute "UPDATE [" & objTable.Name & "] SET indexto = '" & objDictionary.Item(strPostCode4Find) & "' WHERE indexto = '" & strPostCode4Find & "'", intRecordsAffected
							
							WScript.Echo vbTab & vbTab & "[" & strPostCode4Find & "] ---> [" & objDictionary.Item(strPostCode4Find) & "]: " & vbTab & intRecordsAffected & " раз(а)"
						Next
					End If
				Next
				
				objCatalog.ActiveConnection = Nothing
				
				.Close
			End With
		Else
			WScript.Echo "Probably source file [" & strSourceFile & "] not an Excel (.xls) file."
			WScript.Quit 3
		End If
		
		WScript.Echo "------------------------------------------------------------------"
		
		Set objCatalog    = Nothing
		Set objConnection = Nothing
	Else
		WScript.Echo "Source file [" & strSourceFile & "] not found."
		WScript.Quit 2
	End If
	
	Set objFSO = Nothing
Else
	WScript.Echo "Usage: cscript.exe //nologo """ & WScript.ScriptFullName & """ <Source file>"
	WScript.Quit 1
End If

objDictionary.RemoveAll
Set objDictionary = Nothing

WScript.Quit 0
Возможный результат

Исходный файл указывается аргументом скрипта (также можно просто перетянуть файл из Проводника на скрипт). Всё, что я писал Вам ранее в этой теме: CMD/BAT - [решено] CMD/BAT - Скрипт, который считывает количество данных из разных таблиц Excel касательно окружения исполнения — будет справедливо и здесь.
Это сообщение посчитали полезным следующие участники:

Отправлено: 14:52, 23-05-2018 | #9


Ветеран


Contributor


Сообщения: 2710
Благодарности: 1686

Профиль | Отправить PM | Цитировать


romfus, Меняется не всё форматирование, а только выравнивание по горизонтали. Если надо выравнивать по левому краю, то добавьте строку:
Код: Выделить весь код
..................
             If iCell = NRepl(j) Then
                .Range(RangeIn).Offset(i, 0) = NRepl(j + 1)
                .Range(RangeIn).Offset(i, 0).HorizontalAlignment = xlLeft
                Exit For
            End If
...............

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.

Это сообщение посчитали полезным следующие участники:

Отправлено: 15:40, 23-05-2018 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Изменения значения столбца в xls

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Интерфейс - Сбрасывается ширина столбца в папке и т. д. Heavycloud Microsoft Windows 10 10 04-08-2017 21:54
MySQL - [решено] Связывание значения столбца с именем таблицы Rikka Программирование и базы данных 5 25-10-2016 05:28
Прочие БД - кодировка названия столбца Arenear Программирование и базы данных 5 20-08-2016 23:05
Delphi - Сверка memo с элементами столбца в dbgrid alexmih241 Программирование и базы данных 1 13-05-2015 03:00
[решено] скрипт изменения значения ветки реестра в процессе установки программы adima AutoIt 7 27-03-2012 09:38




 
Переход