Делая имя листа таким же, как значение ячейки - PullRequest
0 голосов
/ 02 декабря 2019

В настоящее время я работаю над макросом в рабочей книге с несколькими листами, целью которой является показать и скрыть определенные листы на основе значений в главном листе. Имена рабочего листа также содержатся в главном рабочем листе, и основная процедура просматривает эти значения при обращении к рабочему листу, который необходимо показать или скрыть. Проблема этого метода заключается в том, что макрос выдаст ошибки, если пользователь изменит имена вкладок листа. Я надеялся вставить дополнительную процедуру, которая делает имена вкладок каждого рабочего листа равными значениям в соответствующей ячейке основного рабочего листа. Я придумал следующее:

Sub SheetName()
If Not ActiveWorkbook Is ThisWorkbook Then Exit Sub
Dim DataImport As Worksheet
Set DataImport = ThisWorkbook.Worksheets("Data Import")

DataImport.Range("A13").Value = Sheet1.Name

End Sub

Этот код работает нормально, но в этой книге более 100 листов. Мне было интересно, есть ли более эффективный способ сделать это, а не вводить одну и ту же процедуру 100 раз. Я попытался сохранить имена кодов листа в массиве и повторить ту же процедуру в массиве, например:

Sub test()
Dim DataImport As Worksheet
Set DataImport = ThisWorkbook.Worksheets("Data Import")
Dim index As Long
Dim ws(0 To 2) As Worksheet
Set ws = Array(Sheet1, Sheet2, Sheet3)

For i = 13 To 14
index = i - 13
DataImport.Cells(i, "A").Value = ws(index).Name
Next i

End Sub

, но появляется сообщение об ошибке «Can't Assign to Array». Извините заранее, если мой код выглядит мусором, я все еще новичок в VBA, и мне еще многое предстоит узнать.

Ответы [ 2 ]

1 голос
/ 02 декабря 2019

Если вы перечислите листы с кодовыми именами в ColA вашего основного листа, то этот код обновит столбцы B и C с именами и индексами текущей вкладки листа соответственно:

Sub UpdateIndex()
    Dim ws As Worksheet, cn As String, m

    For Each ws In ThisWorkbook.Worksheets
        cn = ws.CodeName
        If cn <> DataImport.CodeName Then
            'look for the codename in the Import sheet
            m = Application.Match(cn, DataImport.Columns(1), 0)
            If Not IsError(m) Then
                'got a match - update this row
                DataImport.Cells(m, "B").Value = ws.Name 'tab name
                DataImport.Cells(m, "C").Value = ws.Index 'sheet index
            End If
        End If
    Next ws

End Sub

Предполагается, что вы установили кодовое имя для своего рабочего листа «Импорт данных» на DataImport.

Если ваш код управляется кодовым именем листа, не имеет значения, переименовывает ли пользователь вкладки или изменяет порядок листов.

0 голосов
/ 02 декабря 2019

Для второй попытки вы можете использовать встроенный в Excel объект Sheets и коллекцию Workbook.Sheets:

Sub test()
Dim DataImport As Worksheet
Set DataImport = ThisWorkbook.Worksheets("Data Import")
Dim index As Long
Dim ws As Excel.Sheets
Set ws = ThisWorkbook.Sheets

For i = 13 To 14
    index = i - 13
    DataImport.Cells(i, "A").Value = ws(index).Name
Next i

End Sub
...