Что нового

Удалить пробелы в ячейках колонки с фильтром Excel

DyadyaGenya

Новичок
Сообщения
192
Репутация
0
Доброго времени суток. Файл заранее открыт. В нем есть колонка в которой включен фильтр. Значения в ячейках время от времени начинаются с пробелов. Пробелы нужно удалить. Пробую так:
Код:
#include <Excel.au3>
Local $oExcel = _Excel_Open()
Local $sWorkbook =  @ScriptDir & "\Primer2.xlsx"
Local $oWorkbook = _Excel_BookAttach($sWorkbook)

;Удаляем пробелы в ячейке нужной колонки
Local $sText = _Excel_RangeRead($oWorkbook, Default, $oWorkbook.ActiveSheet.Usedrange.Columns("A:A"), 2)
Local $sText2[0]
_ArrayDisplay($sText, '$sText')
For $i = 8 To UBound($sText)-1
   ConsoleWrite(StringStripWS($sText[$i], $i) & @CR)
  _Excel_RangeWrite($oWorkbook, $oWorkbook.Activesheet, StringStripWS($sText[$i], 8), "A"&$i)
Next


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

Вложения

  • Primer2.7z
    11.4 КБ · Просмотры: 1
Последнее редактирование:

Tempo

Скриптер
Сообщения
598
Репутация
192
Код:
;~ AutoIt Version: 3.3.14.5
;~ Author:         Tempo
#include <StringConstants.au3>
#include <Excel.au3>

Global $oExcel = _Excel_Open()
Global $sWorkbook = @ScriptDir & "\Primer2.xlsx"
Global $oWorkbook = _Excel_BookAttach($sWorkbook)

For $oCell In $oWorkbook.ActiveSheet.UsedRange.Columns("A:A").Cells
    $oCell.Value = StringStripWS($oCell.Value, $STR_STRIPLEADING)
    ConsoleWrite(StringFormat("%s = %s\r\n", $oCell.Address, $oCell.Value))
Next
 
Последнее редактирование:
Автор
D

DyadyaGenya

Новичок
Сообщения
192
Репутация
0
ConsoleWrite(StringFormat("%s = %s\r\n", $oCell.Address, $oCell.Value))
А как в эксель записать?
Моим способом записывается, но почему-то сдвигается на ячейку вверх, а первая съедается.

Прошу прощения. Работает. Только я не понял как. Ведь нет вроде бы команды на запись... Можете пояснить?
 
Последнее редактирование:

Tempo

Скриптер
Сообщения
598
Репутация
192
Ведь нет вроде бы команды на запись...
Я так понимаю вы ожидали какой-то такой синтаксис.
Код:
$oCell.SetValue(StringStripWS($oCell.Value, $STR_STRIPLEADING))

Value [Range.Value property (Excel)] это свойство . Вам не стоит об этом заморачиваться, все что нужно понимать это то, что вы можете присвоить ему значение и получить (не всегда, есть свойства только для чтения/записи, нужно смотреть документацию). Свойства это обертка для геттеров/сеттеров (пример SetValue/GetValue), может так будет понятнее.
Сообщение автоматически объединено:

P.S. Эта строка
Код:
ConsoleWrite(StringFormat("%s = %s\r\n", $oCell.Address, $oCell.Value))
только для отладки/вывода в консоль.
 
Последнее редактирование:
Автор
D

DyadyaGenya

Новичок
Сообщения
192
Репутация
0
Я так понимаю вы ожидали какой-то такой синтаксис
К своему стыду я ожидал совсем другого, использование _Excel_RangeWrite
Но теперь буду и этот способ учить. Вроде широкие возможности.
Сообщение автоматически объединено:

ConsoleWrite(StringFormat("%s = %s\r\n", $oCell.Address, $oCell.Value))
А про отладку я понимаю, сам пользуюсь
 

Tempo

Скриптер
Сообщения
598
Репутация
192
использование _Excel_RangeWrite
Извините, неправильно вас понял. Если вы посмотрите на исходный код функций библиотеки Excel.au3, вы увидите что это просто обертка для тех же свойств/методов. Используйте то что вам удобнее.
Код:
Func _Excel_RangeWrite($oWorkbook, $vWorksheet, $vValue, $vRange = Default, $bValue = Default, $bForceFunc = Default)
    ; Error handler, automatic cleanup at end of function
    Local $oError = ObjEvent("AutoIt.Error", "__Excel_COMErrFunc")
    #forceref $oError
    If Not IsObj($oWorkbook) Or ObjName($oWorkbook, 1) <> "_Workbook" Then Return SetError(1, 0, 0)
    If Not IsObj($vWorksheet) Then
        If $vWorksheet = Default Then
            $vWorksheet = $oWorkbook.ActiveSheet
        Else
            $vWorksheet = $oWorkbook.WorkSheets.Item($vWorksheet)
        EndIf
        If @error Or Not IsObj($vWorksheet) Then Return SetError(2, @error, 0)
    ElseIf ObjName($vWorksheet, 1) <> "_Worksheet" Then
        Return SetError(2, @error, 0)
    EndIf
    If $vRange = Default Then $vRange = "A1"
    If $bValue = Default Then $bValue = True
    If $bForceFunc = Default Then $bForceFunc = False
    If Not IsObj($vRange) Then
        $vRange = $vWorksheet.Range($vRange)
        If @error Or Not IsObj($vRange) Then Return SetError(3, @error, 0)
    EndIf
    If Not IsArray($vValue) Then
        If $bValue Then
            $vRange.Value = $vValue
        Else
            $vRange.Formula = $vValue
        EndIf
        If @error Then Return SetError(4, @error, 0)
    Else
        If $vRange.Columns.Count = 1 And $vRange.Rows.Count = 1 Then
            If UBound($vValue, 0) = 1 Then
                $vRange = $vRange.Resize(UBound($vValue, 1), 1)
            Else
                $vRange = $vRange.Resize(UBound($vValue, 1), UBound($vValue, 2))
            EndIf
        EndIf
        ; ==========================
        ; Transpose has an undocument limit on the number of cells or rows it can transpose. This limit increases with the Excel version
        ; Limits:
        ;   Excel 97   - 5461 cells
        ;   Excel 2000 - 5461 cells
        ;   Excel 2003 - ?
        ;   Excel 2007 - 65536 rows ?
        ;   Excel 2010 - ?
        ; Example: If $oExcel.Version = 14 And $vRange.Columns.Count * $vRange.Rows.Count > 1000000 Then $bForceFunc = True
        If $bForceFunc Then
            _ArrayTranspose($vValue)
            If $bValue Then
                $vRange.Value = $vValue
            Else
                $vRange.Formula = $vValue
            EndIf
            If @error Then Return SetError(5, @error, 0)
        Else
            Local $oExcel = $oWorkbook.Parent
            If $bValue Then
                $vRange.Value = $oExcel.Transpose($vValue)
            Else
                $vRange.Formula = $oExcel.Transpose($vValue)
            EndIf
            If @error Then Return SetError(6, @error, 0)
        EndIf
    EndIf
    Return $vRange
EndFunc   ;==>_Excel_RangeWrite
 
Последнее редактирование:
Верх