Макрос не работает в дубликате листа - PullRequest
0 голосов
/ 28 сентября 2011

Доброе утро.У меня есть книга Microsoft Excel с поддержкой макросов с двумя листами: скажем, Sheet1 и Sheet2.В Sheet2 у меня есть поле со списком (контроль формы), который работает как сортировщик таблиц.Эта таблица также будет в Sheet2.В этом комбинированном коде используется следующий код:

Option Explicit

Sub DropDown4_Change()
    Dim comboValue As String
    Dim Key1ColumnIndex As Integer
    Dim Key2ColumnIndex As Integer

    'You can get the name by doing something like this in the immediate window:  "? ActiveSheet.Shapes(1).OLEFormat.Object.Name"
    comboValue = ActiveSheet.Shapes("Drop Down 4").ControlFormat.List(ActiveSheet.Shapes("Drop Down 4").ControlFormat.ListIndex)

    Select Case comboValue

        Case "By Keyphrase"
            Key1ColumnIndex = 18
            Key2ColumnIndex = 19
        Case "By Region"
            Key1ColumnIndex = 19
            Key2ColumnIndex = 18
        Case "Default"
            Key1ColumnIndex = 1
            Key2ColumnIndex = 1
    End Select


   Range("DataValues").sort Key1:=Range("DataValues").Cells(1, Key1ColumnIndex), _
                            Order1:=xlDescending, Header:=xlNo, DataOption1:=xlSortNormal, _
                            Key2:=Range("DataValues").Cells(1, Key2ColumnIndex), order2:=xlDescending
End Sub

Этот код работает как шарм в этой рабочей таблице.

Я использую Aspose Cells для Java, чтобы использовать эту книгу Excel в качестве шаблона для генерации новогокниги с несколькими таблицами данных, основанные на копиях Sheet2 (которые содержат мое комбо), но проблема в том, что когда я это делаю, комбо больше не работает, как в шаблоне.

В этой строке:

comboValue = ActiveSheet.Shapes("Drop Down 4").ControlFormat.List(ActiveSheet.Shapes("Drop Down 4").ControlFormat.ListIndex)

Я получаю эту ошибку:

Run-time error '438' Object doesn't support this property or method

Похоже, что ControlFormat не распознается как допустимый метод для комбо-формы.Это происходит независимо от того, используете ли вы имя комбо или индекс комбо (в данном случае всегда 6).«Drop Down 4» - правильное название.Я сообщал имя несколько раз на каждом листе, и указатель и имя были правильными.

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

Ответы [ 2 ]

2 голосов
/ 29 сентября 2011

Я понял, что жесткое кодирование имени комбо (в данном случае «Drop Down 4») - ужасный способ сделать это, так как Excel назначает новые имена каждый раз, когда добавляется копия Sheet2. Хотя Excel делает это, имена комбо всегда начинаются со слова «Drop» (из выпадающего списка). Я немного изменил код и заставил его работать:

Option Explicit

Sub DropDown4_Change()
    Dim comboValue As String
    Dim Key1ColumnIndex As Integer
    Dim Key2ColumnIndex As Integer
    Dim Index As Integer
    Dim comboName As String
    Dim comboName2 As String
    Dim comboID As Integer

    'You can get the name by doing something like this in the immediate window:  "? Sheet1.Shapes(1).OLEFormat.Object.Name"

     For Index = 1 To ActiveSheet.Shapes.Count
        comboName = ActiveSheet.Shapes(Index).OLEFormat.Object.Name
        If InStr(comboName, "Drop") > 0 Then
            'MsgBox InStr(comboName, "Drop")
            comboName2 = comboName
            comboID = Index
        End If
     Next


    comboValue = ActiveSheet.Shapes(comboID).ControlFormat.List(ActiveSheet.Shapes(comboID).ControlFormat.ListIndex)

    Select Case comboValue

        Case "By Keyphrase"
            Key1ColumnIndex = 18
            Key2ColumnIndex = 19
        Case "By Region"
            Key1ColumnIndex = 19
            Key2ColumnIndex = 18
        Case "Default"
            Key1ColumnIndex = 1
            Key2ColumnIndex = 1
    End Select


   Range("DataValues").sort Key1:=Range("DataValues").Cells(1, Key1ColumnIndex), _
                            Order1:=xlAscending, Header:=xlNo, DataOption1:=xlSortNormal, _
                            Key2:=Range("DataValues").Cells(1, Key2ColumnIndex), order2:=xlAscending
End Sub
1 голос
/ 28 сентября 2011

Где находится ваш код?

Это сработало для меня (в общем модуле) ...

Sub DoSorting()
Dim dd, val

    Set dd = ActiveSheet.Shapes(Application.Caller)
    val = dd.ControlFormat.List(dd.ControlFormat.ListIndex)

    MsgBox val

End Sub

Копирование листа не сломало его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...