Страницы: 1
RSS
Сортировка с помощью Power Shell, VBA. Sort by Power Shell
 
Доброго времени суток, Планетяне!

Андрей Лящук в этом сообщении показал пример сортировки через Power Shell, но я не могу никак разобраться с синтаксисом, поэтому сформулирую ряд вопросов:

  • как отсортировать одномерный массив от нуля (числа/текст/числа, текст, даты и т.д.)?
  • как отсортировать двумерный массив или 2 одномерных массива (значения  и индексы) параллельно, чтобы по индексам потом отсортировать двумерный массив?
  • как (и можно ли) подключить Power Shell через раннее связывание

Матчасть
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
В PowerShell встроена хорошая справка и примеры
Наберите:
   To see the examples, type: "get-help Sort-Object -examples".
   For more information, type: "get-help Sort-Object -detailed".
   For technical information, type: "get-help Sort-Object -full".
   For online help, type: "get-help Sort-Object -online"
Код
$arr = New-Object "object[,]" 4,3
$hash = New-Object "object[]" 4

$arr[0,0] = 5
$arr[0,1] = "A"
$arr[0,2] = (Get-Date).AddDays(-5)
$arr[1,0] = 1
$arr[1,1] = "B"
$arr[1,2] = (Get-Date).AddDays(-1)
$arr[2,0] = 2
$arr[2,1] = "B"
$arr[2,2] = (Get-Date).AddDays(1)
$arr[3,0] = 3
$arr[3,1] = "A"
$arr[3,2] = (Get-Date).AddDays(-5)

for ($i = 0; $i -lt 4; $i++) {
    $hash[$i] = [pscustomobject]@{'num' = $arr[$i,0]; 'str' = $arr[$i,1]; 'dat' = $arr[$i,2]}
}

$hash | Sort-Object

$hash | Sort-Object -Property @{Expression = "dat"; Descending = $True}, @{Expression = "num"; Descending = $True}, @{Expression = "str"; Descending = $False}

Инициацию можно сократить конечно

Код
$hash = @()
$hash += [pscustomobject]@{Num = 5; Str = "A"; Dat = (Get-Date).AddDays(-5)}
$hash += [pscustomobject]@{Num = 1; Str = "B"; Dat = (Get-Date).AddDays(-1)}
$hash += [pscustomobject]@{Num = 2; Str = "B"; Dat = (Get-Date).AddDays(1)}
$hash += [pscustomobject]@{Num = 3; Str = "A"; Dat = (Get-Date).AddDays(-5)}
$hash += [pscustomobject]@{Num = 5; Str = "C"; Dat = (Get-Date).AddDays(-5)}

Изменено: DrillPipe - 26.09.2020 23:39:03
 
DrillPipe, спасибо за отклик!
Это разве код для VBA? Что-то не похоже…
Простите, если не прав, но можете ли вы показать мини-процедурку именно для VBA?
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Jack Famous,  Алексей привет. Ну в примере тот что показал Андрей, это просто набор команд которые передают результат через трубу.  | - как раз означает что передаем результат предыдущей команды следующей . Особенность в том что передаются объекты, с их свойствами. Но все ж это  хоть и очень мощный , но все ж скрипт, и я что-то не помню чтоб у него был COM к которому можно подключится и выполнять команды, да и передать информацию в него не просто.
По вопросам из тем форума, личку не читаю.
 
БМВ, привет, Миш))
Лано - что COM нет понял, ну а как-то сортировать можно же?)) Через Shell, например или как-то ещё?…
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
а что поlfвать то ему на стол, чем кормить? делать промежуточный файл  заставить его его скушать и выплюнуть результат?

COM подключение - на пальцах  это  Set objWord=CreateObject("Word.Application") и работа с ним.
По вопросам из тем форума, личку не читаю.
 
Цитата
БМВ: делать промежуточный файл  заставить его его скушать и выплюнуть результат?
ну да — звучит не очень, как подумаю, сколько проверок делать…
Спасибо!  ;)
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Jack Famous,
Обычно PoSH использую для копирования файлов в фоновом режиме

Задачу с сортировкой только через скрипт
Сейчас обязательно нужно, что бы были активными книга и лист,  где находится диапазон для сортировки

Можно и просто скрипт запустить и отработать с любым открытым файлом
с параметрами
C:\ You path \Excel_Sort.ps1 -WorkbookName testVBA.xlsm -WorksheetName Sheet1 -InRangeR1C1 table -OutRangeR1C1 F1 -Sort "1 0 1"

без параметров, тогда в консоли будут запросы для их ввода, параметр Sort обязательно вводить как строку c " "
C:\ You path \Excel_Sort.ps1

Скрипт требует доработки.
Для VBA-шников думаю не трудно будет допилить скрипт PowerShell для полной автоматизации (сделать активной книгу и лист из параметров запуска) - свойства объектов соответсвуют VBA


Цитата
БМВ написал:
а что поlfвать то ему на стол, чем кормить
Теоретически можно копировать в буфер обмена в VBA диапазон и загонять в объект через него
Но в буфер обмена поступает строка, дальше много манипуляций нужно делать

$array = Get-Clipboard


$array = $array.Split("`n")


И дальше каждую запись сплитить по разделителям.

З.Ы.
Политика выполнения скриптов
 
Цитата
DrillPipe написал:
Теоретически можно копировать в буфер обмена в VBA диапазон и загонять в объект через него
но ведь теоретически и получить на входе совсем не то что ожидаешь, тоже вероятность есть. Не устойчиво все такое.

Скрипт то через COM работает.  То есть не то чтоб ему кормим массив а указываем от куда ему забрать через объект приложения. Ну конечно тоже вариант.
Изменено: БМВ - 04.10.2020 20:14:41
По вопросам из тем форума, личку не читаю.
 
DrillPipe, благодарю, но что-то мне уже не нравится эта идея  :D
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Jack Famous,
В предыдущем вложении скрипт для powershell сделан с учетом создания объекта  Excel  -  GetActiveObject('Excel.Application')
и соответственно всеми доступными для открытого приложения Excel свойствами и методами которые применимы в VBA
Но наверное есть другие простые способы сортировать списки в Excel (например таже объектная модель Access)
Страницы: 1
Наверх