Что нового

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

DyadyaGenya

Знающий
Сообщения
309
Репутация
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

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

DyadyaGenya

Знающий
Сообщения
309
Репутация
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
Автор
D

DyadyaGenya

Знающий
Сообщения
309
Репутация
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

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