Получить текущий регион с помощью Office-JS

#excel #office-js

#excel #office-js

Вопрос:

Как мне получить текущий регион, окружающий ActiveCell, используя Excel JS API?

В VBA это

 Set rng=ActiveCell.CurrentRegion
  

Ответ №1:

Свойство current region в JavaScript API теперь реализовано. Свойство вызывается getSurroundingRegion()

Ответ №2:

Прямого эквивалента не существует, но у нас есть range.getUsedRange() , который возьмет существующий диапазон и предоставит вам меньший диапазон, представляющий непустые части. Обратите внимание, что этот метод выдаст ошибку «не найдено», если во всем диапазоне ничего нет (поскольку фактически это пустой диапазон, который Excel не может выразить).

Если вам действительно нужен сценарий CurrentRegion (и мне было бы любопытно узнать больше), вы могли бы сначала получить используемый диапазон (чтобы убедиться, что вы не загружаете слишком много данных), затем загрузить values свойство, а затем выполнить range.getExpandedRange(indexOfLastRow, indexOfLastColumn) .

Кстати, в отличие от используемого диапазона VBA, JS «getUsedRange()» всегда создает точный снимок текущего используемого диапазона (тот, что на VBA, может устареть), и мы предоставляем его не только на рабочем листе, но и в заданном диапазоне.

Обновить

Я имею в виду, что существует пара сценариев, один из которых проще, другой сложнее.

Самый простой вариант: вы примерно знаете, какой диапазон вам нужен, но вам просто нужно его обрезать. Например, вы знаете, что у вас есть табличный объект в столбцах A: C, но вы не знаете количество строк. Вот где

 worksheet.getRange("A:C").getUsedRange()
  

это дало бы вам то, что вам нужно.

Самое сложное: вы используете getUsedRange() для урезания того, что можете, но затем загружаете range.values и вручную выполняете поиск строк и столбцов, где каждая ячейка пуста ( "" ). Получив это (предположим, вы обнаружили, что относительный индекс строки, о котором вы заботитесь, равен 5, а индекс столбца 2), вы могли бы сделать

 originalRange.getCell(0, 0).getExpandedRange(rowIndex, columnIndex)
  

Конкретный пример для приведенного выше: у вас есть данные в формате A2: C7, хотя getUsedRange() листа намного больше (и, следовательно, мое предложение могло бы попытаться еще больше сократить его, выполнив range.getUsedRange() ). Но для этого случая давайте представим, что getUsedRange на листе вернул диапазон, соответствующий A1: Z100. worksheet.getRange(0, 0) это даст вам первую ячейку, которую затем вы можете расширить на 5 строк и 2 столбца (которые вы найдете с помощью простой, хотя и утомительной итерации массива), чтобы получить интересующий вас диапазон. Имеет смысл?

Комментарии:

1. Итак, если на листе есть несколько областей данных, каждая из которых ограничена пустыми ячейками (подумайте о нескольких таблицах, которые на самом деле таблицами не являются) Я не понимаю, как заставить это работать: не могли бы вы объяснить подробнее?

2. И что вы подразумеваете под JS UsedRange всегда точным, но VBA UsedRange может устареть — я определенно не хотел бы, чтобы диапазон JS, который я создал из usedrange, автоматически обновлялся при каждом изменении используемого диапазона.

3. @CharlesWilliams, для вашего второго комментария: я немного отредактировал свой ответ. Я имею в виду, что JS «getUsedRange()» всегда создает точный снимок текущего используемого диапазона, в то время как я видел несколько случаев, когда Excel VBA one сообщал об устаревшем используемом диапазоне.

4. Спасибо, я могу видеть, как это работает, если используемый диапазон содержит только одну область, но я все еще не понимаю, как справиться с ситуацией, когда используемый диапазон содержит несколько областей (например, таблиц), и я хочу определить текущий регион той, где расположена активная ячейка. Полагаю, я мог бы выполнять итерации влево и вправо по каждой строке и вверх и вниз по каждому столбцу, но это невероятно утомительно и дорого.

5. используемый диапазон — Спасибо за объяснение — да, используемый диапазон VBA обновляется некорректно, если вы удаляете большое количество ячеек на большом сложном листе в 2007 или более поздней версии. Я не тестировал JS API в аналогичном сценарии — я предположил (возможно, неправильно), что он использует тот же внутренний код Excel для проверки таблицы ячеек.