Что нового

удалить колонки не стоящие рядом (или каждую вторую) за один раз excel

DyadyaGenya

Знающий
Сообщения
300
Репутация
10
Доброго времени суток. Читаю вот эту справку и не могу понять, можно ли удалить за один раз колонки или строчки не стоящие рядом. Понятно, что сперва можно удалить те что стоят рядом, потом вторым заходом (строкой) удалить следующую порцию и так далее вот таким образом:
Код:
_Excel_RangeDelete($oWorkbook.ActiveSheet, 'B:K', $xlShiftToLeft)
_Excel_RangeDelete($oWorkbook.ActiveSheet, 'D:D', $xlShiftToLeft)  ; уже после смещения после удаления первой группы
_Excel_RangeDelete($oWorkbook.ActiveSheet, 'L:N', $xlShiftToLeft)  ; уже после смещения после удаления второй группы

Ну или начиная с конца, чтоб не пересчитывать колонки.
НО хотелось бы что-то типа этого:
Код:
Local $aDell[] = ["B:K", "N:N", "W:Y"]
_Excel_RangeDelete($oWorkbook.ActiveSheet, $aDell, $xlShiftToLeft)

Потому что может быть очень много таких колонок, как пример - удалить каждую вторую колонку в каком-то диапазоне.
 

ra4o

AutoIT Гуру
Сообщения
1,165
Репутация
247
Если колонки нужно удалить "в разнобой", то только каждую группу отдельно, проще, если есть какая-то система, например, как Вы писали "Каждую вторую колонку в каком-то диапазоне" , то использовать не буквенное обозначение колонки, а номер и удалять в цикле, (только удалять нужно начиная с максимальной колонки к минимальной, что бы избежать смещения колонок при удалении ) например:
Код:
#include <Excel.au3>

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

;Удалить все чётные колонки от 10 до 2
For $i = 10 To 2 Step -2
    $oExcel.Activesheet.Columns($i).Delete
Next
 
Автор
D

DyadyaGenya

Знающий
Сообщения
300
Репутация
10
Если колонки нужно удалить "в разнобой"
Пока у меня только в разнобой, что колонки, что строки.
только удалять нужно начиная с максимальной колонки к минимальной, что бы избежать смещения колонок при удалении
Это то, о чем я и говорил, что начинать с конца. Но за цикл спасибо. Вчера забыл в цикле начать с последнего, хотя это ж очевидно.
 
Автор
D

DyadyaGenya

Знающий
Сообщения
300
Репутация
10
Если удобно использовать массив , то тот-же цикл можно подвязать к массиву.
Я считал все ячейки, загнал их в массив, удалил с конца все ячейки, в которых было нужное слово:
Код:
Local $aResult = _Excel_RangeRead($oWorkbook, Default, $oWorkbook.ActiveSheet.Usedrange.Columns("K:K"), 2)
ConsoleWrite($aResult & @CR)
For $i = UBound($aResult) To 1 Step -1
   If $aResult[$i-1] = "Слово" Then
    ;  _Excel_RangeDelete($oWorkbook.Worksheets('Лист1'), $i & ':' & $i)  ;  Первый вариант удаления
      _Excel_RangeDelete($oExcel.Activesheet, $i & ':' & $i)  ;  Как я понимаю - равносильное первому варианту, только удобней, поскольку не нужно заморачиваться с именем листа
   EndIf
   Next

Вот только не придумал, как получить автоматом после удаления нужную колонку для считывания )))) Но это может позже. Все равно это к сожалению, только частичное решение.
 

ra4o

AutoIT Гуру
Сообщения
1,165
Репутация
247
Вот только не придумал, как получить автоматом после удаления нужную колонку для считывания ))))
На это тяжело ответить, не зная критерия выбора колонки.
Массивы удобно смотреть так:
Код:
#include <array.au3>
............

_ArrayDisplay($aResult)
 
Автор
D

DyadyaGenya

Знающий
Сообщения
300
Репутация
10
Массивы удобно смотреть так
Это я так и делаю. Если вы про
Код:
ConsoleWrite($aResult & @CR)
во второй строке, так я случайно оставил. Когда проверял как считывает колонку, ещё не знал, будет это все в одну строку или загонится в массив. _ArrayDisplay убрал, а это забыл )))
Если колонки нужно удалить "в разнобой", то только каждую группу отдельно
Все равно вернусь к своему первоначальному вопросу. По идее, если в самом екселе такое можно, то и в autoit можно. А в екселе это делается через "правку". По идее в англ это Edit. Просто так выделить несколько групп строк или колонок и потом удалить не получится. Нужно в меню выбирать. В справке много всякого связано с edit, но сходу не могу разобраться. Казалось бы вот это наиболее подходит https://docs.microsoft.com/en-us/office/vba/api/excel.alloweditranges или вот эта, но не могу разобраться. Хотя в справке и других ссылок связанных с edit и select много. К сожалению моих знаний англ не хватает, особенно когда его так много.
 

ra4o

AutoIT Гуру
Сообщения
1,165
Репутация
247
Вам ведь удалить нужно, по этому метод "Delete" . Теоретически можно в Range внести список и удалить, но у меня не получается, ругается на Range, пробовал так:
Код:
$oExcel.Worksheets(1).Range("B:C,G:H").Delete
 
Автор
D

DyadyaGenya

Знающий
Сообщения
300
Репутация
10
Вам ведь удалить нужно, по этому метод "Delete"
Я не настаиваю, что есть другой способ. Но поймите правильно мой интерес, вроде ж с помощью autoit можно сделать почти все, что делают другие программы и языки программирования. Да и про удаление недавно узнал альтернативный способ для удаления в экселе через Value. Может и тут какой-то способ лежит на поверхности и потому его никто не замечает?
Ведь тот же autoit вроде как использует команды "встроенные" в эксель. Потому и хочется думать, что раз в самом экселе есть такая возможность, то и autoit это под силу.
А так это только интерес человека, который меньше полугода наскоками изучает autoit
 
Верх