VBA падает на ПК. Работает на Mac [дубликат]

Почему вы используете расширение?

reduce(lambda x, y: x+y, l)

Это должно работать нормально.

5
задан Elysian Fields 3 October 2012 в 02:58
поделиться

4 ответа

Как указал Бреттдж, вам не нужно активировать лист, чтобы выбрать диапазон. Вот ссылка на удивительно большое количество примеров для выбора ячеек / диапазонов .

Теперь, почему я должен сначала активировать лист? Я не считаю, что это ошибка в данных, но просто ограничение метода выбора для диапазонов.

Из эксперимента, похоже, есть два требования для выбора диапазона в Excel.

  1. Excel должен иметь возможность обновлять пользовательский интерфейс, чтобы указать, что выбрано.
  2. Диапазоны parent (IE the sheet) должны быть активны.

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

Sheets(1).Visible = False
Sheets(1).Activate
'The next line fails because the Range cannot be selected.
Sheets(1).Range("A1").Select

Проще говоря, когда дело доходит до диапазонов, вы не можете выбрать тот, который вы не видите.

Я бы сказал, что это ограничение выбора всего вместе, за исключением того, что вы можете фактически выбрать объект в скрытый лист. Глупый Excel.

5
ответ дан Daniel 23 August 2018 в 22:26
поделиться

Конечно, вам не нужно выбирать или активировать лист для выбора / активации ячейки. Мой способ - использовать «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
0
ответ дан Eswemenasja 23 August 2018 в 22:26
поделиться

@ Даниэль Кук: спасибо за ваш ответ, но, к сожалению, сам 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

0
ответ дан FraggaMuffin 23 August 2018 в 22:26
поделиться

Я знаю, что это немного поздно для вечеринки, но я обнаружил взломать это ...

Попробуйте этот код:

Sheets(1).Activate
Sheets(2).Range("A1").Copy
Sheets(2).Range("A1").PasteSpecial xlPasteFormulas
Application.CutCopyMode = False

Обратите внимание, что это это взлом, но он делает трюк !!

1
ответ дан John Bustos 23 August 2018 в 22:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: