Почему вы используете расширение?
reduce(lambda x, y: x+y, l)
Это должно работать нормально.
Как указал Бреттдж, вам не нужно активировать лист, чтобы выбрать диапазон. Вот ссылка на удивительно большое количество примеров для выбора ячеек / диапазонов .
Теперь, почему я должен сначала активировать лист? Я не считаю, что это ошибка в данных, но просто ограничение метода выбора для диапазонов.
Из эксперимента, похоже, есть два требования для выбора диапазона в Excel.
Чтобы поддержать это утверждение, вы также не можете выбрать ячейку из скрытого листа.
Sheets(1).Visible = False
Sheets(1).Activate
'The next line fails because the Range cannot be selected.
Sheets(1).Range("A1").Select
Проще говоря, когда дело доходит до диапазонов, вы не можете выбрать тот, который вы не видите.
Я бы сказал, что это ограничение выбора всего вместе, за исключением того, что вы можете фактически выбрать объект в скрытый лист. Глупый Excel.
Конечно, вам не нужно выбирать или активировать лист для выбора / активации ячейки. Мой способ - использовать «On Error Resume Next» и «On Error GoTo 0». Код ниже выбирает первую ячейку в каждом листе рабочей книги без ее выбора. Рабочие листы даже очень скрыты на этом этапе.
On Error Resume Next
For i_wks = 1 To wb_macro.Worksheets.Count
wb_macro.Worksheets(i_wks).Cells(1).Select
Next i_wks
On Error GoTo 0
@ Даниэль Кук: спасибо за ваш ответ, но, к сожалению, сам Excel не играет по тем же правилам, которые применяются к макросам Excel ...
Чтобы проиллюстрировать это, я кратко изложу свою текущую проблему. ..
Я пытаюсь переустановить содержимое таблицы в общее состояние. Этот метод будет применяться к нескольким таблицам на разных листах:
Public Sub restoreTable()
Dim myTableSheet As Worksheet: Set myTableSheet = Range("Table1").Parent
Dim myTable As ListObject: Set myTable = myTableSheet.ListObjects("Table1")
' --- Clear Table's Filter(s)
If myTable.ShowAutoFilter Then ' table has auto-filters enabled
Call myTable.Range.AutoFilter ' disables autofilter
End If
myTable.Range.AutoFilter ' re-apply autofilter
' --- Sort by Sequence number
Call myTable.Sort.SortFields.Clear ' if not cleared, sorting will not take effect
myTable.Sort. _
SortFields.Add Key:=Range("Table1[[#Headers],[#Data],[Column1]]"), _
SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
myTable.Sort.Header = xlYes
myTable.Sort.Orientation = xlTopToBottom
myTable.Sort.SortMethod = xlPinYin
Call myTable.Sort.Apply
myTable.Sort.SortFields.Clear
End Sub
Для каждого варианта использования ниже Table1
находится в Sheet1
Пример использования 1:
Sheet1
, выбрать диапазон A1
restoreTable
Sheet1
A1
остается выбранным Пример использования 2:
Sheet1
, выбрать диапазон A1
Sheet2
restoreTable
Sheet1
A1
не выбран, вместо этого выбран диапазон Table1[#Data]
Решение
Это абсолютно ужасно, но это лучшее решение, которое я смог найти
Public Sub resotreTable_preserveSelection()
Dim curSheet As Worksheet: Set curSheet = ActiveSheet
Dim tableSheet As Worksheet: Set tableSheet = Range("Table1").Parent
' Change Sheet
tableSheet.Activate
' Remember Selection / Active Ranges
Dim originalSelection As Range: Set originalSelection = Selection
Dim originalActiveCell As Range: Set originalActiveCell = ActiveCell
' Restore Table
Call restoreTable
' Restore Old Selection
originalSelection.Select
originalActiveCell.Activate
' Change Back to old sheet
curSheet.Activate
End Sub
. Примечание: в этом случае диапазоны original
* не нужны, но вы понимаете: вы может буферизовать исходный выбор и восстановить его, когда вы закончите
Мне действительно не нравится excel
Я знаю, что это немного поздно для вечеринки, но я обнаружил взломать это ...
Попробуйте этот код:
Sheets(1).Activate
Sheets(2).Range("A1").Copy
Sheets(2).Range("A1").PasteSpecial xlPasteFormulas
Application.CutCopyMode = False
Обратите внимание, что это это взлом, но он делает трюк !!