Excel VBA - листы (Arrary ("Sheet2", "Sheet3")) с использованием переменной для имен листов - PullRequest
0 голосов
/ 01 февраля 2012

Я хочу закодировать следующее

Sheets (Arrary ("Sheet2", "Sheet3")). Выберите, создав переменную для имен листов, чтобы заменить "Sheet2", "Sheet3".

Sub SelectMultipleSheets()

  Dim sSheets as String
  Dim intSheet As Integer

    sSheets = ""

    For intSheet = 1 To Sheets.count

        If Sheets(intSheet).Name <> "Sheet1" And intSheet <= Sheets.count Then

            Sheets(intSheet).Cells.Hyperlinks.Delete 'deleting hyperlinks

            sSheets = sSheets & Chr(34) & Sheets(intSheet).Name & Chr(34) & ","

        End If

    Next

    sSheets = Left(sSheets, Len(sSheets) - 1)
    Sheets(Array(sSheets)).Select

End Sub

Я получаю сообщение об ошибке «Подстрочный индекс не в диапазоне. Как это исправить? Спасибо

Ответы [ 2 ]

2 голосов
/ 01 февраля 2012

Когда вы строите параметр списка массивов в этой строке

sSheets = sSheets & Chr(34) & Sheets(intSheet).Name & Chr(34) & "," 

вы фактически создаете одну строковую переменную с разделителями-запятыми, и Excel не может знать, что вы на самом деле имеете в виду список с разделителями-запятымиstrings.

Вы можете обойти это, создав массив непосредственно, как это.

Option Explicit

Sub SelectMultipleSheets()
    Dim intSheet As Integer
    Dim arSheets() As String
    Dim intArrayIndex As Integer

    intArrayIndex = 0

    For intSheet = 1 To Sheets.Count

        If Sheets(intSheet).Name <> "Sheet1" Then

            Sheets(intSheet).Cells.Hyperlinks.Delete 'deleting hyperlinks

            ReDim Preserve arSheets(intArrayIndex)
            arSheets(intArrayIndex) = Sheets(intSheet).Name
            intArrayIndex = intArrayIndex + 1
        End If
    Next

    Sheets(arSheets).Select

End Sub
0 голосов
/ 01 февраля 2012

Это не может быть сделано таким образом, даже если похоже, что оно должно работать. Вместо этого приведенный ниже код использует аргумент Select's Replace для добавления к выделению в цикле. Переменная boolNoSelectionYet гарантирует, что она не добавится к выбору, существовавшему до запуска цикла, например, если Sheet1 был выбран при запуске подпрограммы, вы не хотите, чтобы он оставался выделенным.

Sub SelectMultipleSheets()
Dim intSheet As Integer
Dim boolNoSelectionYet As Boolean

boolNoSelectionYet = True
For intSheet = 1 To Sheets.Count
    If Sheets(intSheet).Name <> "Sheet1" Then
        Sheets(intSheet).Cells.Hyperlinks.Delete
        Sheets(intSheet).Select (boolNoSelectionYet)
        boolNoSelectionYet = False
    End If
Next
End Sub

Обратите внимание, что я удалил вторую часть вашего оператора If, поскольку ваш цикл For Next гарантирует, что intSheet никогда не будет больше числа листов.

...